{"_id":"@promptctl/go-template-js","_rev":"9-72ff5e59987a430124b4613d3a1616b8","name":"@promptctl/go-template-js","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.0":{"name":"@promptctl/go-template-js","version":"0.1.0","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.1.0","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"c8c1a3f9d90ac8e2029ccecfde37ab3857a146a4","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.1.0.tgz","fileCount":7,"integrity":"sha512-QXuajXmyqVWGuJ0zensfyg3tkfvlCF8Av0H9XK+UvLCOHpkHuW2eAkBuoAddrdEQPQwPLIJyI2Df/GQg0qOiNA==","signatures":[{"sig":"MEQCICXuxuLuIoFCoFNfgxHmSCpJVAZh5wzErr+Qp34chrQ3AiAfD4XfpHAMJbhTL3EGjKWi0uzWN7XUBNnlhfb7ovL5eQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":436155},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8b6e924083c4d0b27b73629ad7f661aa2805d168","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.1.0_1778265695461_0.22827509113081845","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@promptctl/go-template-js","version":"0.1.1","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.1.1","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"d1b7839dfa5f0ec01a9eb6fc8c37979205fc8bf6","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.1.1.tgz","fileCount":7,"integrity":"sha512-1byySemUUj9s7HpIpoR9W5m20ukZyAak8y599XFPIMYZXSpvII5xL4N2YiNEZsGoP1B73Eq5g1gy9LwTLJWBIA==","signatures":[{"sig":"MEYCIQDlNRbeFkq3B39rD30eXzdp2NNcy4fKiHiYYPRQrS5DMwIhAPnZCKeF2HZq9VPcpsoA3aPhxgtBhD6EMKyf19+Zs9+B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":439965},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c55f2106509e68ce6ea947504747ff82cf007d26","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.1.1_1778267914023_0.6381863976697912","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@promptctl/go-template-js","version":"0.3.0","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.3.0","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"4ee63860cf1be4b42276558537966151793ad9ff","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.3.0.tgz","fileCount":7,"integrity":"sha512-u6AlJSH137gfTIOUfpfvadixSoFV07JqeU6D2nyfKVE+2E0UCUCJvQ1KeKyuRA0/+r8Q3vIXYPbmVUQgOnE6Yg==","signatures":[{"sig":"MEYCIQDFK9dKw6u00BYDwNjmBuWdW7ZaIWzo7HN0WsxVW3TzhQIhAPpodBGhvqGaTHzjTg9g/6TmHEkQbwA803IlNF6NDsha","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":644755},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@noble/hashes":"^2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.3.0_1778912819428_0.8299397332677583","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@promptctl/go-template-js","version":"0.4.0","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.4.0","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"0a164819106d77770cb3e9a6e743acee4bad56ea","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.4.0.tgz","fileCount":7,"integrity":"sha512-jT/Dkjf+P/i52XHvR+//AmRbZelii6g01Au3dZPUOxUGRNYbYtuPRf7FiSn4tuThGcRMYkIX3NTMeqhdFPZXgw==","signatures":[{"sig":"MEUCIQDKujkAqLWT4AKT7FBAe/Y1tkwxJWoQD/fOv337q5uSrwIgbo9jQ6cuMGLMuZMii7y6WqwDByN0/KYzXzqgo0/gkkw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":651559},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"1cbef437955ec7e15abc5da8c38a8b37ae7978e2","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@noble/hashes":"^2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.4.0_1778949326929_0.5680975393678995","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@promptctl/go-template-js","version":"0.5.0","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.5.0","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"af12a5ea087d9d43a77a048757880215fd1adaa0","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.5.0.tgz","fileCount":7,"integrity":"sha512-oX02iwjsfjMzbcPKaAT0RDFVxI12toAL4S9ztm/VxS+HWima9PtnvpkFgyFah2TZ0uNTG0rrzBFswYL/DamZEw==","signatures":[{"sig":"MEUCID4rZNiLRZ90JETnyc8xiSYRGGwC5csmOlXUxtO4n+aCAiEA82TiD9E2S6CbM6DL4lERz9KCb9nbRnRBrCzGA02CMsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":664904},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"05dd0d363d33434e6a7f731ecf580bc1fd7de5b5","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@noble/hashes":"^2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.5.0_1781536214290_0.9755463770049446","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@promptctl/go-template-js","version":"0.6.0","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.6.0","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"87a70ca7133ea53235bc221b3157910c18b06c25","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.6.0.tgz","fileCount":7,"integrity":"sha512-V7FPjAiHFd7Na82T+BRMXl0ntATPs82Lpub75aT65RADNsjyRmyVcECVhHzFM66nhFbpNET9xUzoltO+MtOxhA==","signatures":[{"sig":"MEUCIQDjJD7vltpzuaVGypiB41SfgPLHZBb8X888fyxSH2tMpAIgbBIjtPOGueW74IuQ5wLOabcZvjQYtr6H4vqpNXvFpQM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":672308},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ce7c88c32ce73f97e93f741aadd100a17500bbc6","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@noble/hashes":"^2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.6.0_1781591955613_0.6512423189322762","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@promptctl/go-template-js","version":"0.7.0","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.7.0","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"ee914fff5c2ec643a0867134db77ef671a8f0a28","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.7.0.tgz","fileCount":7,"integrity":"sha512-5lvZ3VTPrPUVZQb0LD2OEEygUYh4kO/DKHVR5Sj3NHtjSUNwqCwvkik88jBfoTDwbBdKLtqLMdfvgeL9xxPAiA==","signatures":[{"sig":"MEQCIEgJyN3K8VpEdpGt+PdH84Yky5K9etxxJDbuPFyakshFAiBK2q1TcuVpLuPlRGXJj8i7u7cO+PRchqGRwFNv7LJHwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":683382},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"df387bbce6d9d0310fec79a6b0e257838a0829e8","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.6.2","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@noble/hashes":"^2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.7.0_1785064057521_0.741336103339816","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@promptctl/go-template-js","version":"0.8.0","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","_id":"@promptctl/go-template-js@0.8.0","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"homepage":"https://github.com/promptctl/go-template-js#readme","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"e87de5acb4349419af586e562e95f4a2163b1b26","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.8.0.tgz","fileCount":7,"integrity":"sha512-KxjgWuGlC9MOzI4oHyXzfwJvNxXxBORb9yZd8afe33Yg3OT09ilsxyhFmRcnURFLyoL+OEmVpqvMXDiA2OkJrw==","signatures":[{"sig":"MEUCIQC8+/jyjlrEoAt8E+wQCbCCB12d9uIQuQREKIbLwU6UEwIgfWTL8KdxzRa0W0cg4jl040HHpBqfFGkgRmUGys+5EfM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":694360},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ca63a54e9048a05e58d31be5d64a9469c3ecff37","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","conformance:regen":"cd conformance/gen && go run ."},"_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.19.0","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{"@noble/hashes":"^2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"tmp":"tmp/go-template-js_0.8.0_1788430906557_0.7482997326772447","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"_id":"@promptctl/go-template-js@0.9.0","bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"dist":{"shasum":"66015f7023d7850ce51fa658f639144e03583698","tarball":"https://registry.npmjs.org/@promptctl/go-template-js/-/go-template-js-0.9.0.tgz","fileCount":7,"integrity":"sha512-ri/iP9GjWa7uX2o65Ss8Gb8+aWFJ9CGS8gvVIGQxibwDz+UYciRlMcX2YKi65lXzu6Jf3L+f3QfZDoXYUiNVdw==","signatures":[{"sig":"MEQCIG27FOgxvgV7qStAvcFHAK6dt1nyqG1IMXrTWamj7cU5AiAhJDbJgKaelwADL5H7e8ubTmbPzWVCypKasXtMnaB2PQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCKb3lClYDBnJTPfnDosJwUII1zcynWFKATIeVBrLm2PgIgLMI4li+VVYqu784SjiUXP1bGtajio5JvYWSaMawUdsE="}],"unpackedSize":693854},"main":"./dist/index.js","name":"@promptctl/go-template-js","type":"module","types":"./dist/index.d.ts","author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"bf532196cad29074419c58100c447898783e143f","license":"MIT","scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","format":"biome format --write .","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"pnpm lint && pnpm typecheck && pnpm test && pnpm build","conformance:regen":"cd conformance/gen && go run ."},"version":"0.9.0","_npmUser":{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"},"homepage":"https://github.com/promptctl/go-template-js#readme","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"_npmVersion":"11.19.0","description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","directories":{},"maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"sideEffects":false,"_nodeVersion":"26.7.0","dependencies":{"@noble/hashes":"^2.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"tsdown":"^0.21.10","vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0","@biomejs/biome":"^2.4.14"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/go-template-js_0.9.0_1788658798797_0.41936616960754214"}}},"time":{"created":"2026-05-08T18:41:35.359Z","modified":"2026-09-06T01:39:59.087Z","0.1.0":"2026-05-08T18:41:35.629Z","0.1.1":"2026-05-08T19:18:34.181Z","0.3.0":"2026-05-16T06:26:59.657Z","0.4.0":"2026-05-16T16:35:27.193Z","0.5.0":"2026-06-15T15:10:14.453Z","0.6.0":"2026-06-16T06:39:15.748Z","0.7.0":"2026-07-26T11:07:37.714Z","0.8.0":"2026-09-03T10:21:46.711Z","0.9.0":"2026-09-06T01:39:58.907Z"},"bugs":{"url":"https://github.com/promptctl/go-template-js/issues"},"author":{"name":"Brandon Fryslie","email":"530235+brandon-fryslie@users.noreply.github.com"},"license":"MIT","homepage":"https://github.com/promptctl/go-template-js#readme","keywords":["go-template","text/template","sprig","template","templating","typescript","generic"],"repository":{"url":"git+https://github.com/promptctl/go-template-js.git","type":"git"},"description":"Go template syntax + sprig subset, generic over output type, in TypeScript.","maintainers":[{"name":"brandon-fryslie","email":"brandon.fryslie@loom99.com"}],"readme":"# @promptctl/go-template-js\n\nGo template syntax + Sprig subset, generic over output type, in TypeScript.\n\n[![npm](https://img.shields.io/npm/v/@promptctl/go-template-js.svg)](https://www.npmjs.com/package/@promptctl/go-template-js)\n[![CI](https://github.com/promptctl/go-template-js/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/promptctl/go-template-js/actions/workflows/ci.yml)\n[![Node](https://img.shields.io/node/v/@promptctl/go-template-js.svg)](https://nodejs.org)\n[![License: MIT](https://img.shields.io/npm/l/@promptctl/go-template-js.svg)](./LICENSE)\n\n## Highlights\n\n- **Same syntax as Go's `text/template`.** Templates that parse there parse here.\n- **Generic over the output type `T`.** Render to strings, structured fragments, or anything else; the engine emits `T[]`.\n- **No silent flattening.** Typed values never become strings without an explicit conversion — slots that should accept text declare so, and mismatches throw `TypeMismatchError`.\n- **Pure ESM, side-effect-free, single runtime dep.** Tree-shakes cleanly; only [`@noble/hashes`](https://github.com/paulmillr/noble-hashes) at runtime (for `sprigHash()`).\n\n## Table of contents\n\n- [Highlights](#highlights)\n- [Install](#install)\n- [Quick start](#quick-start)\n- [Custom output types](#custom-output-types)\n- [`ArgType` reference](#argtype-reference)\n- [Syntax and built-ins](#syntax-and-built-ins)\n- [Sprig subset](#sprig-subset)\n- [Composing funcs from multiple sources](#composing-funcs-from-multiple-sources)\n- [Divergences from Go](#divergences-from-go)\n- [Errors](#errors)\n- [Versioning policy](#versioning-policy)\n- [Development](#development)\n- [License](#license)\n\n## Install\n\n```bash\npnpm add @promptctl/go-template-js\n# or: npm install @promptctl/go-template-js\n# or: yarn add @promptctl/go-template-js\n```\n\nRequires Node **≥ 20.19.0** (per `engines.node`). The package is ESM-only.\n\n## Quick start\n\n```ts\nimport { createEngine } from \"@promptctl/go-template-js\";\n\nconst engine = createEngine<string>({ fromString: (s) => s });\nconst tpl = engine.parse(\"Hello, {{ .name }}!\");\nconsole.log(tpl.evaluate({ name: \"world\" }).join(\"\")); // \"Hello, world!\"\n```\n\n`fromString` is the engine's bridge from text literals to its output type `T`. With `T = string` it's the identity function — that recovers Go template's default behaviour.\n\n`engine.compile(src)` is the parse-and-evaluate sugar:\n\n```ts\nconst greet = engine.compile(\"hi {{ .name }}\");\ngreet({ name: \"ada\" }).join(\"\"); // \"hi ada\"\n```\n\n## Custom output types\n\nThe engine is parameterised over its output fragment type `T`. Consumers pick a fragment shape (e.g. styled text, AST nodes, layout primitives) and the engine emits a `T[]` that integrates into their downstream pipeline:\n\n```ts\nimport { createEngine, type TemplateFunc } from \"@promptctl/go-template-js\";\n\ninterface Frag { color: string; text: string }\n\nconst engine = createEngine<Frag>({\n  fromString: (s) => ({ color: \"default\", text: s }),\n  funcs: {\n    red: {\n      fn: (s: unknown) => ({ color: \"red\", text: String(s) }),\n      argTypes: [\"string\"],\n      returnType: \"T\",\n    },\n  },\n});\n\nconst tpl = engine.parse('{{ .label }}: {{ red .value }}');\ntpl.evaluate({ label: \"warn\", value: \"ALERT\" });\n// → [\n//   { color: \"default\", text: \"warn\" },\n//   { color: \"default\", text: \": \" },\n//   { color: \"red\", text: \"ALERT\" },\n// ]\n```\n\nFunctions have optional `argTypes`. The engine uses them to enforce one architectural commitment: **a non-string `T` value will never silently flatten into a `string` parameter**. If you try to pipe a styled fragment into a function declared with `argTypes: [\"string\"]`, you get a `TypeMismatchError` naming the function, the argument index, and a suggestion to call your `unstyled` (or equivalent) flatten helper.\n\n### Lifting and stringification: the boundary bridges\n\n`fromString` and `toString` are the engine's two boundary bridges between text and `T`. Each one has an `ArgType` that uses it:\n\n| Direction | Bridge | ArgType | Where it runs |\n| --- | --- | --- | --- |\n| `string` → `T` | `fromString` (required) | `\"liftable\"` | a string at a `\"liftable\"` slot is replaced with `fromString(s)` before the body sees it |\n| `T` → `string` | `toString` (optional) | `\"stringifiable\"` | a non-string at a `\"stringifiable\"` slot is flattened via `toString` (e.g. `print`, `printf \"%s\"`) |\n\n```ts\nconst engine = createEngine<Frag>({\n  fromString: (s) => ({ color: \"default\", text: s }),\n  toString: (frag) => frag.text,\n});\n```\n\n`fromString` is mandatory in `EngineConfig`: every engine knows how to lift, so `\"liftable\"` is always servable. `toString` is optional: without it, typed-`T` values reaching a `\"stringifiable\"` slot throw `TypeMismatchError` directing you to configure it. The default `toString` passes strings through unchanged and flattens numeric/boolean/nil primitives, so `T = string` engines work out of the box.\n\nUse `\"liftable\"` for any consumer-defined function whose slot should accept either a `T` value or a string literal. The body, by contract, only ever receives `T` — the gate owns the lift, so the body has no string-vs-`T` discrimination to do.\n\n## `ArgType` reference\n\nEvery entry in `argTypes` is one of:\n\n| Kind | Accepts at runtime | Used by (examples) |\n| --- | --- | --- |\n| `\"string\"` | JS `string` | `upper`, `lower`, `trim`, `printf` format string |\n| `\"int\"` | finite `number` or safe-integer-range `bigint`; gate normalizes to `number` via `Math.trunc(Number(v))` so the body sees `number` | `add`, `sub`, `mul`, `mod`, `max`, `min`, `slice` indices, `chunk`, `splitn`, `repeat` |\n| `\"float\"` | any `number` (including `NaN`/`±Infinity` — legitimate IEEE-754 floats) or `bigint` whose `Number()` is finite; gate normalizes to `number` via `Number(v)` | `addf`, `subf`, `mulf`, `divf`, `maxf`, `minf` |\n| `\"bool\"` | `typeof === \"boolean\"` | (rare; most boolean slots use `\"truthy\"`) |\n| `\"T\"` | Any non-primitive (consumer-defined fragment) | consumer-defined typed funcs returning `T` |\n| `\"ordered\"` | `string`, `number`, `bigint`, or `boolean` | `lt`, `le`, `gt`, `ge` — additionally requires both slots share a kind |\n| `\"comparable\"` | `\"ordered\"` ∪ nil ∪ arrays / Maps / Sets / plain objects (deep-equal) | `eq`, `ne` |\n| `\"list\"` | `Array.isArray` | `first`, `last`, `rest`, `uniq`, `concat`, `chunk` |\n| `\"dict\"` | plain object only (not `Map`, not class instance) | `get`, `keys`, `values`, `pluck`, `merge` |\n| `\"sized\"` | `string` ∪ array ∪ `Map` ∪ `Set` ∪ plain object | `len` |\n| `\"stringifiable\"` | `string`, or any value the engine's `toString` can flatten | `print`, `println`, `printf \"%s\"`, `printf \"%q\"` |\n| `\"liftable\"` | `T`, or `string` (lifted to `T` via the engine's `fromString` before the body runs) | consumer-defined funcs that accept either a `T` fragment or a bare text literal at a slot |\n| `\"callable\"` | `typeof === \"function\"` | `call` (first slot) |\n| `\"collection\"` | `string` ∪ array ∪ `Map` ∪ plain object | `index` (receiver slot) |\n| `\"index-key\"` | `string`, `number`, or `bigint` | `index` (key slots) |\n| `\"sliceable\"` | `string` or array | `slice` (receiver slot) |\n| `\"truthy\"` | anything (truthiness context) | `not`, `and`, `or`, `default`, `empty`, `coalesce`, `ternary` |\n| `\"reflective\"` | anything (type-inspection context) | `kindOf`, `typeOf`, `kindIs`, `typeIs`, `typeIsLike` |\n| `\"serializable\"` | anything `JSON.stringify`-encodable (rejects functions, symbols, `bigint`) | `toJson`, `toPrettyJson` |\n| `\"value\"` | anything (genuinely heterogeneous, by intent) | `list` constructor, `deepEqual`, `deepCopy`, `prepend` / `append` items |\n\nThe legacy `\"any\"` kind was removed in epic `template-laws-3gt`. Slots that genuinely accept anything now declare their *intent* (`\"truthy\"` / `\"reflective\"` / `\"value\"` / `\"serializable\"`); slots that did not are pinned to their precise kind so the gate enforces the constraint instead of leaking it into func bodies.\n\n### Variadic patterns\n\nFor variadic funcs, declare the trailing slot's type once — every excess argument is validated against it.\n\nFor funcs whose variadic tail *cycles* (e.g. `dict \"k1\" v1 \"k2\" v2 …`), set `argTypePattern: \"alternating\"` on the registration. The slot for arg index `i` becomes `argTypes[i % argTypes.length]`, so `dict` declares `argTypes: [\"string\", \"value\"]` and the gate enforces \"string at even index, anything at odd index\" without per-key revalidation in the body.\n\n## Syntax and built-ins\n\nTemplate syntax is Go template syntax. Read the canonical spec:\nhttps://pkg.go.dev/text/template\n\nSupported:\n\n- All actions: `{{ pipeline }}`, `{{- ... -}}` trim markers, `{{/* comments */}}`.\n- All control flow: `if/else if/else/end`, `range/else/end` (with index/value forms `range $i, $v := …`), `with/else/end`.\n- Range-body control: `{{break}}` exits the innermost `{{range}}`; `{{continue}}` skips to its next iteration. Both are parse errors outside a lexically-enclosing `{{range}}` (including inside a `{{define}}` or `{{block}}` body, even if those are nested in a range — sub-template bodies are independent parse contexts, matching Go's `text/template`).\n- All sub-template forms: `define`, `template`, `block`.\n- Variable assignment: `$x := pipe` and `$x = pipe`.\n- All literals: strings (interpreted + raw backtick), runes, integers (decimal/hex/octal/binary), floats (with exponents and hex-float `p` exponents), booleans, `nil`.\n- Field access on JS objects (own + prototype properties), `Map` (via `.get`), arrays (numeric `index` builtin).\n- Pipelines with last-arg piping: `x | f a b` ≡ `f a b x`.\n\n### Built-in functions\n\nAll of Go template's runtime built-ins:\n\n`and` `or` `not` · `eq` `ne` `lt` `le` `gt` `ge` · `len` `index` `slice` · `print` `println` `printf` · `call` · `html` · `js` · `urlquery`\n\nAlways registered beside them, though not Go's: `toString` and `toStrings` (sprig's `strval`/`strslice`) — Go's `%v` with one argument, printed through the engine's `toString`/`isT` like `printf` is.\n\n`and`/`or` short-circuit (the engine passes thunks for those). `printf` supports `%s`, `%d`, `%v`, `%q`, `%f` (precision-aware), `%t`, `%x`, plus width and `-` left-align flags. `html` flattens its arguments like `print` (via the engine's `toString`) and then escapes the six HTML-significant characters (`\\0` → `�`, `\"` → `&#34;`, `'` → `&#39;`, `&` → `&amp;`, `<` → `&lt;`, `>` → `&gt;`) — matching Go's `text/template.HTMLEscaper` byte-for-byte. `js` shares the same flatten pipeline and emits JavaScript-literal-safe output: `\\` → `\\\\`, `'` → `\\'`, `\"` → `\\\"`, `<` → `\\u003C`, `>` → `\\u003E`, `&` → `\\u0026`, `=` → `\\u003D`, ASCII control chars (< 0x20) and non-printable runes (incl. U+2028/U+2029) → `\\u%04X` uppercase — matching Go's `text/template.JSEscaper`. `urlquery` shares the same flatten pipeline and percent-encodes the UTF-8 byte stream per Go's `net/url.QueryEscape`: the unreserved set `[A-Za-z0-9-._~]` passes through, space becomes `+`, every other byte becomes `%XX` uppercase hex (so a literal `+` round-trips as `%2B`, and `α` encodes to `%CE%B1`).\n\n## Sprig subset\n\nImported from `@promptctl/go-template-js` as category-scoped `FuncMap` factories:\n\n| Category | Helper | Functions |\n| --- | --- | --- |\n| Defaults | `sprigDefaults()` | default, empty, coalesce, ternary, fromJson, toJson, toPrettyJson |\n| Strings | `sprigStrings()` | trim, trimAll, trimPrefix, trimSuffix, upper, lower, title, untitle, repeat, substr, trunc, contains, hasPrefix, hasSuffix, replace, split, splitList, splitn, join, quote, squote, cat, indent, nindent, wrap, wrapWith, abbrev, abbrevboth, initials, nospace, snakecase, camelcase, kebabcase, swapcase, plural, regexQuoteMeta |\n| Math | `sprigMath()` | add, sub, mul, div, mod, min, max, floor, ceil, round, addf, subf, mulf, divf, add1, add1f, maxf, minf, biggest, seq, until, untilStep |\n| Lists | `sprigLists()` | list, first, last, rest, initial, len, reverse, uniq, without, has, compact, slice, concat, chunk, prepend, append, sortAlpha, push, tuple, dig, all, any |\n| Dicts | `sprigDicts()` | dict, get, set, unset, keys, values, pluck, pick, omit, hasKey, merge, mergeOverwrite |\n| Regex | `sprigRegex()` | regexMatch, regexFind, regexFindAll, regexReplaceAll, regexReplaceAllLiteral, regexSplit |\n| Types | `sprigTypes()` | kindOf, kindIs, typeOf, typeIs, typeIsLike, deepEqual, deepCopy |\n| Conversions | `sprigConversions()` | atoi, int, int64, float64, toDecimal, toRawJson (`toString`/`toStrings` are Go's `%v` and live with the built-ins) |\n| Semver | `sprigSemver()` | semver, semverCompare |\n| Flow | `sprigFlow()` | fail |\n| Random | `sprigRandom(random?)` | randInt, randAlpha, randAlphaNum, randNumeric, randAscii, shuffle |\n| Hash / Encoding | `sprigHash()` | b64enc, b64dec, b32enc, b32dec, sha1sum, sha256sum, sha512sum, adler32sum, uuidv4 |\n| Date / Time | `sprigDatetime(clock?)` | now, date, dateInZone, dateModify, htmlDate, htmlDateInZone, duration, durationRound, toDate, ago, unixEpoch |\n\n**Runtime floor for `sprigHash()`:** This package requires Node ≥ 20.19.0 (per `engines.node`). `uuidv4` requires `globalThis.crypto.randomUUID`, guaranteed in that environment. SHA-* use [`@noble/hashes`](https://github.com/paulmillr/noble-hashes) — audited, zero-dep, sync, pure JS.\n\n**`sprigDatetime(clock?)`:** All date/time functions accept Go's reference-time format strings (`Mon Jan 2 15:04:05 MST 2006`). Pass `clock: () => Date` to freeze \"now\" for deterministic templates. The `date` and `dateInZone` functions accept `Date`, number (Unix seconds), or string as the time value. Go template integer literals hit sprig's type-switch default branch (returning `\"0s\"` from `duration`) — prefer string literals or scope-injected values for portable templates.\n\n## Composing funcs from multiple sources\n\nThe `funcs` registry merges from any number of sources, with later entries overriding earlier on name collision:\n\n```ts\nconst engine = createEngine<string>({\n  fromString: (s) => s,\n  funcs: {\n    ...sprigDefaults(),\n    ...sprigStrings(),\n    ...projectFuncs,    // your own, can override sprig if needed\n  },\n});\n```\n\nGo template's runtime built-ins (the names listed under \"Built-in functions\" above) are always merged in by `createEngine` itself; you do not register them. A consumer-supplied entry with the same name overrides the built-in.\n\n## Divergences from Go\n\nThe engine matches Go's `text/template` semantics aggressively. The remaining divergences are host-imposed — JavaScript cannot represent the relevant Go type, or the standard libraries differ:\n\n- **Numeric typing.** Go has `int`, `float64`, and friends as distinct runtime types; JavaScript has one `number`. The numeric-verb type label reflects JS's view: integer JS numbers report as `int`, fractional as `float64`, `bigint` as `int64`. Non-numeric values into `%d`/`%f`/`%x` produce a Go-style `%!<verb>(<type>=<value>)` diagnostic — e.g. `printf \"%d\" \"foo\"` → `%!d(string=foo)`.\n- **Regex semantics.** `sprigRegex()` uses ECMAScript regex, not Go's RE2. Lookbehind syntax, Unicode property escapes, and certain catastrophic-backtracking patterns differ.\n- **String length.** Go strings are UTF-8 byte sequences; `len(\"é\")` is `2` in Go. JS strings are UTF-16 code units; `len(\"é\")` is `1` here. Choose grapheme libraries on the JS side if you need byte/grapheme counts.\n- **Field access.** Walks JS objects, Maps, and arrays using JS property semantics, not Go reflection. Named-field access on an array is a missing field — silently `<no value>` under the default `missingKey: \"default\"` policy, or a `MissingFieldError` under `missingKey: \"error\"`. There is no `length` / `[N]` magic; use the `index` and `len` built-ins.\n- **`missingkey=zero`.** Accepted as a config value (`missingKey: \"zero\"`) for API parity with Go's `Option(\"missingkey=zero\")`, but JavaScript erases value-types at runtime — there is no `reflect.New(elemType).Elem()` analogue, so `\"zero\"` produces the same observable behavior as `\"default\"` (silent `<no value>`). To force a typed-zero substitute at the use site, use sprig: `{{ .missing | default \"\" }}`.\n- **Type mismatches at function boundaries are runtime errors, not compile errors.** By design: the engine does not know your `T` shape statically, so it surfaces the architectural commitment when the bad flow happens. See `TypeMismatchError`.\n- **printf verbs** beyond `%s %d %v %q %f %t %x` are rendered as `%!<verb>(<type>=<value>)`. If you need more, register your own formatter via the `funcs` registry.\n\n### Notable parity statements\n\nPlaces where users sometimes expect divergence and there isn't one:\n\n- A nil/undefined pipeline emits the literal `<no value>` string, matching Go's `text/template`.\n- **Missing field/map-key access** follows Go's `Option(\"missingkey=...\")`. Defaults to `\"default\"` (silent `<no value>`); set `missingKey: \"error\"` in `EngineConfig` to throw `MissingFieldError` instead. The `\"zero\"` value is accepted; see the divergence note above.\n- **Custom delimiters** are supported via `EngineConfig.delims`, mirroring Go's `Template.Delims(left, right)`. Pass `{ left: \"<%\", right: \"%>\" }` to make the engine recognise `<% ... %>` actions instead of `{{ ... }}`. Trim markers follow Go: with `<%`/`%>` they become `<%-` and `-%>`. Both sides are required if you set the field — neither may be empty. Default `{{` / `}}` are used when the field is omitted.\n- Range over a Map / plain object iterates in **sorted-by-key order** in both engines (Go's `internal/fmtsort`; ours mirrors it).\n- Sprig `set` and `unset` mutate the receiver and return it — same as Go sprig.\n- `{{ \"key\" | get .dict }}` composes correctly: last-arg piping puts the key in the trailing slot, which is `get(d, key)`'s second parameter. The form `{{ .dict | get \"key\" }}` does *not* work in either engine — the dict ends up in the key slot.\n- `eq` / `ne` compare arrays, Maps, Sets, and plain objects by **structural deep-equal**, matching Go's `text/template` semantics. Reference-identity comparison is not a divergence — it was a bug fixed in epic `template-laws-3gt`.\n- Sprig dict ops (`get`, `keys`, `values`, `pluck`, `hasKey`, …) accept **plain objects only**, not `Map`. Pass `Object.fromEntries(map)` if you have a `Map` to feed in. Maps remain valid for field-access (`.get(key)`) and for `range`.\n- `empty` on a non-empty object returns **false**, even when every value is the zero value of its type (e.g. `{tag: \"\", text: \"\"}`). Matches Go sprig: `text/template.isTrue` treats structs as always truthy, and sprig's `empty` follows by returning `false` for any non-empty map or struct. `reflect.IsZero` is *not* what Go sprig consults here. The conformance fixture `sprig-empty-object-parity` pins this behavior byte-for-byte.\n\n## Errors\n\nAll errors extend `TemplateError`:\n\n```\nTemplateError\n├── ParseError\n└── EvalError\n    ├── FuncNotFoundError    (with did-you-mean suggestions)\n    ├── TypeMismatchError    (no-silent-flatten violation)\n    └── MissingFieldError    (named field path failure)\n```\n\nEvery error carries `pos`, `source`, and a `kind` discriminator. `.toString()` produces a multi-line message with a 3-line source snippet and a caret pointing at the failing column.\n\n## Versioning policy\n\n- Semver.\n- **Syntax stability is a hard guarantee** — Go template syntax is the source of truth; deviations are bugs.\n- **Output type guarantee** — `engine.evaluate(scope)` returning `T[]` for the engine's `T` parameter is part of the contract.\n- **Sprig surface may grow but never shrinks** — once a sprig function is registered in a release, subsequent releases keep it.\n- **Built-in semantics may be tightened** — the no-silent-flatten guard may catch additional edge cases over time. Tests against an Engine with strict argTypes are the safe bet.\n\n### Stable public API surface\n\nThe package exports exactly the following from `\"@promptctl/go-template-js\"` — anything else is internal and may change at any time:\n\n- Engine: `createEngine`, `Engine`, `Template`, `EngineConfig`, `FuncMap`, `TemplateFunc`, `ArgType`, `MissingKeyOption`, `Delims`.\n- Errors: `TemplateError`, `ParseError`, `EvalError`, `FuncNotFoundError`, `TypeMismatchError`, `MissingFieldError`, `FailError`, `ErrorKind`.\n- Sprig categories: `sprigDefaults`, `sprigStrings`, `sprigMath`, `sprigLists`, `sprigDicts`, `sprigRegex`, `sprigTypes`, `sprigConversions`, `sprigSemver`, `sprigFlow`, `sprigRandom`, `sprigHash`, `sprigDatetime`.\n\nReaching into `dist/` subpaths or `src/` deep imports is unsupported.\n\n## Development\n\n```bash\npnpm install\npnpm build       # tsdown → dist/\npnpm test        # vitest\npnpm lint        # biome check\npnpm typecheck   # tsc --noEmit\n```\n\nBug reports and feature requests go to [GitHub Issues](https://github.com/promptctl/go-template-js/issues). The roadmap and active work live in the project's `lit` issue tracker (run `lit ready` to see the queue).\n\n## License\n\n[MIT](./LICENSE) © Brandon Fryslie\n","readmeFilename":"README.md"}