express-hbs 2.4.2 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/.claude/worktrees/node-20-26-migration-7de0c3/.editorconfig +8 -0
  2. package/.claude/worktrees/node-20-26-migration-7de0c3/.github/workflows/publish.yml +73 -0
  3. package/.claude/worktrees/node-20-26-migration-7de0c3/.github/workflows/test.yml +48 -0
  4. package/.claude/worktrees/node-20-26-migration-7de0c3/.jsbeautifyrc +17 -0
  5. package/.claude/worktrees/node-20-26-migration-7de0c3/.nvmrc +1 -0
  6. package/.claude/worktrees/node-20-26-migration-7de0c3/.nycrc.json +16 -0
  7. package/.claude/worktrees/node-20-26-migration-7de0c3/.oxfmtrc.json +19 -0
  8. package/.claude/worktrees/node-20-26-migration-7de0c3/.oxlintrc.json +32 -0
  9. package/.claude/worktrees/node-20-26-migration-7de0c3/AGENTS.md +40 -0
  10. package/.claude/worktrees/node-20-26-migration-7de0c3/LICENSE +21 -0
  11. package/.claude/worktrees/node-20-26-migration-7de0c3/README.md +333 -0
  12. package/.claude/worktrees/node-20-26-migration-7de0c3/SECURITY.md +9 -0
  13. package/.claude/worktrees/node-20-26-migration-7de0c3/example/app-layoutsDir.js +99 -0
  14. package/.claude/worktrees/node-20-26-migration-7de0c3/example/app.js +103 -0
  15. package/.claude/worktrees/node-20-26-migration-7de0c3/example/public/css/style.css +17 -0
  16. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/fruits/details-layoutsDir.hbs +3 -0
  17. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/fruits/details.hbs +4 -0
  18. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/fruits/index-layoutsDir.hbs +20 -0
  19. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/fruits/index.hbs +20 -0
  20. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/index.hbs +34 -0
  21. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/layout/default.hbs +13 -0
  22. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/layout/fruit-details.hbs +9 -0
  23. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/layout/fruits.hbs +6 -0
  24. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/layout/html-struct.hbs +21 -0
  25. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/layout/veggie-details.hbs +9 -0
  26. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/layout/veggie.hbs +6 -0
  27. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/partials/scripts.hbs +5 -0
  28. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/partials/sub/comment.hbs +1 -0
  29. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/partials-other/other.hbs +1 -0
  30. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/replace.hbs +6 -0
  31. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/tos.txt +3 -0
  32. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/veggies/details.hbs +1 -0
  33. package/.claude/worktrees/node-20-26-migration-7de0c3/example/views/veggies.hbs +17 -0
  34. package/.claude/worktrees/node-20-26-migration-7de0c3/index.js +1 -0
  35. package/.claude/worktrees/node-20-26-migration-7de0c3/lib/generate-id.js +16 -0
  36. package/.claude/worktrees/node-20-26-migration-7de0c3/lib/hbs.js +671 -0
  37. package/.claude/worktrees/node-20-26-migration-7de0c3/lib/resolver.js +59 -0
  38. package/.claude/worktrees/node-20-26-migration-7de0c3/package.json +61 -0
  39. package/.claude/worktrees/node-20-26-migration-7de0c3/pnpm-lock.yaml +3424 -0
  40. package/.claude/worktrees/node-20-26-migration-7de0c3/pnpm-workspace.yaml +6 -0
  41. package/.claude/worktrees/node-20-26-migration-7de0c3/renovate.json +13 -0
  42. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/async/index.js +139 -0
  43. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/async/views/failer.hbs +4 -0
  44. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/async/views/index.hbs +16 -0
  45. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/async/views/layout.hbs +1 -0
  46. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/i18n/index.js +57 -0
  47. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/i18n/locales/en.json +8 -0
  48. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/i18n/locales/fr.json +8 -0
  49. package/.claude/worktrees/node-20-26-migration-7de0c3/test/apps/i18n/views/index.hbs +3 -0
  50. package/.claude/worktrees/node-20-26-migration-7de0c3/test/asyncSpecs.js +69 -0
  51. package/.claude/worktrees/node-20-26-migration-7de0c3/test/cacheSpecs.js +135 -0
  52. package/.claude/worktrees/node-20-26-migration-7de0c3/test/customExtension.js +35 -0
  53. package/.claude/worktrees/node-20-26-migration-7de0c3/test/handlebarsSpecs.js +92 -0
  54. package/.claude/worktrees/node-20-26-migration-7de0c3/test/helperSpecs.js +58 -0
  55. package/.claude/worktrees/node-20-26-migration-7de0c3/test/helpers.js +24 -0
  56. package/.claude/worktrees/node-20-26-migration-7de0c3/test/i18nSpecs.js +36 -0
  57. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/144/index.hbs +1 -0
  58. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/153/index.hbs +3 -0
  59. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/21/views/index.hbs +1 -0
  60. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/21/views/layouts/default.hbs +1 -0
  61. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/21/views/layouts/sub/child.hbs +1 -0
  62. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/21/views/sub/relativeLayout.hbs +1 -0
  63. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/21/views/sub/sub.hbs +1 -0
  64. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/21/views/useLayoutInDir.hbs +1 -0
  65. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/22/layout1.hbs +1 -0
  66. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/22/layout2.hbs +1 -0
  67. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/22/template.hbs +1 -0
  68. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/empty.hbs +0 -0
  69. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/emptyComment.hbs +1 -0
  70. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/emptyPartial.hbs +1 -0
  71. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/index.hbs +4 -0
  72. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/layout.hbs +1 -0
  73. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/partials/custom/comment-only.hbs +1 -0
  74. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/partials/custom/empty.hbs +0 -0
  75. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/23/partials/hello.hbs +1 -0
  76. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/49/error.hbs +1 -0
  77. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/49/front/error.hbs +1 -0
  78. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/49/index.hbs +2 -0
  79. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/49/layouts/default.hbs +1 -0
  80. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/49/partial.hbs +1 -0
  81. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/49/partials/partial-error.hbs +1 -0
  82. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/53/default.hbs +15 -0
  83. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/53/index.hbs +7 -0
  84. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/53/partials/.gitkeep +0 -0
  85. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/59/index.hbs +2 -0
  86. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/62/basic.hbs +2 -0
  87. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/62/block.hbs +11 -0
  88. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/73/index.hbs +5 -0
  89. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/73/partials/partial.hbs +6 -0
  90. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/76/mypartial.hbs +0 -0
  91. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/84/index.hbs +1 -0
  92. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues/84/partials/abc/def/ghi/test.hbs +1 -0
  93. package/.claude/worktrees/node-20-26-migration-7de0c3/test/issues.js +490 -0
  94. package/.claude/worktrees/node-20-26-migration-7de0c3/test/layoutSpecs.js +146 -0
  95. package/.claude/worktrees/node-20-26-migration-7de0c3/test/localTemplateOptions/data-access-template.hbs +1 -0
  96. package/.claude/worktrees/node-20-26-migration-7de0c3/test/localTemplateOptions/template.hbs +1 -0
  97. package/.claude/worktrees/node-20-26-migration-7de0c3/test/localTemplateOptions.js +125 -0
  98. package/.claude/worktrees/node-20-26-migration-7de0c3/test/multiple.js +115 -0
  99. package/.claude/worktrees/node-20-26-migration-7de0c3/test/nonExpress.js +36 -0
  100. package/.claude/worktrees/node-20-26-migration-7de0c3/test/optionsSpecs.js +22 -0
  101. package/.claude/worktrees/node-20-26-migration-7de0c3/test/resolverSpecs.js +54 -0
  102. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/beautify/expected.hbs +9 -0
  103. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/beautify/index.hbs +2 -0
  104. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/customExtension/layout.server.view.html +1 -0
  105. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/customExtension/partialsDir/partial1.server.view.html +1 -0
  106. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/customExtension/partialsDir/partial2.server.view.html +1 -0
  107. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/customExtension/partialsDir/subs/subPartial1.server.view.html +1 -0
  108. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/customExtension/partialsDir/subs/subPartial2.server.view.html +1 -0
  109. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/customExtension/template.server.view.html +5 -0
  110. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/disableLayoutDirective/aside.hbs +1 -0
  111. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/disableLayoutDirective/index.hbs +2 -0
  112. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/disableLayoutDirective/layouts/default.hbs +1 -0
  113. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/helpers/home/async.hbs +6 -0
  114. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/helpers/home/index.hbs +3 -0
  115. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/helpers/layouts/default.hbs +1 -0
  116. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/multiple/views1/collide.hbs +1 -0
  117. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/multiple/views1/error.hbs +1 -0
  118. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/multiple/views1/test1.hbs +1 -0
  119. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/multiple/views2/collide.hbs +1 -0
  120. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/multiple/views2/error.hbs +1 -0
  121. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/multiple/views2/test2.hbs +1 -0
  122. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/viewsDir/layouts/default.hbs +1 -0
  123. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/viewsDir/sub/directive.hbs +2 -0
  124. package/.claude/worktrees/node-20-26-migration-7de0c3/test/views/viewsDir/sub/lay.hbs +1 -0
  125. package/.claude/worktrees/security-patches-review-c621ea/.editorconfig +8 -0
  126. package/.claude/worktrees/security-patches-review-c621ea/.github/workflows/publish.yml +73 -0
  127. package/.claude/worktrees/security-patches-review-c621ea/.github/workflows/test.yml +48 -0
  128. package/.claude/worktrees/security-patches-review-c621ea/.jsbeautifyrc +17 -0
  129. package/.claude/worktrees/security-patches-review-c621ea/.nvmrc +1 -0
  130. package/.claude/worktrees/security-patches-review-c621ea/.nycrc.json +16 -0
  131. package/.claude/worktrees/security-patches-review-c621ea/.oxfmtrc.json +19 -0
  132. package/.claude/worktrees/security-patches-review-c621ea/.oxlintrc.json +32 -0
  133. package/.claude/worktrees/security-patches-review-c621ea/AGENTS.md +40 -0
  134. package/.claude/worktrees/security-patches-review-c621ea/LICENSE +21 -0
  135. package/.claude/worktrees/security-patches-review-c621ea/README.md +333 -0
  136. package/.claude/worktrees/security-patches-review-c621ea/SECURITY.md +9 -0
  137. package/.claude/worktrees/security-patches-review-c621ea/example/app-layoutsDir.js +99 -0
  138. package/.claude/worktrees/security-patches-review-c621ea/example/app.js +103 -0
  139. package/.claude/worktrees/security-patches-review-c621ea/example/public/css/style.css +17 -0
  140. package/.claude/worktrees/security-patches-review-c621ea/example/views/fruits/details-layoutsDir.hbs +3 -0
  141. package/.claude/worktrees/security-patches-review-c621ea/example/views/fruits/details.hbs +4 -0
  142. package/.claude/worktrees/security-patches-review-c621ea/example/views/fruits/index-layoutsDir.hbs +20 -0
  143. package/.claude/worktrees/security-patches-review-c621ea/example/views/fruits/index.hbs +20 -0
  144. package/.claude/worktrees/security-patches-review-c621ea/example/views/index.hbs +34 -0
  145. package/.claude/worktrees/security-patches-review-c621ea/example/views/layout/default.hbs +13 -0
  146. package/.claude/worktrees/security-patches-review-c621ea/example/views/layout/fruit-details.hbs +9 -0
  147. package/.claude/worktrees/security-patches-review-c621ea/example/views/layout/fruits.hbs +6 -0
  148. package/.claude/worktrees/security-patches-review-c621ea/example/views/layout/html-struct.hbs +21 -0
  149. package/.claude/worktrees/security-patches-review-c621ea/example/views/layout/veggie-details.hbs +9 -0
  150. package/.claude/worktrees/security-patches-review-c621ea/example/views/layout/veggie.hbs +6 -0
  151. package/.claude/worktrees/security-patches-review-c621ea/example/views/partials/scripts.hbs +5 -0
  152. package/.claude/worktrees/security-patches-review-c621ea/example/views/partials/sub/comment.hbs +1 -0
  153. package/.claude/worktrees/security-patches-review-c621ea/example/views/partials-other/other.hbs +1 -0
  154. package/.claude/worktrees/security-patches-review-c621ea/example/views/replace.hbs +6 -0
  155. package/.claude/worktrees/security-patches-review-c621ea/example/views/tos.txt +3 -0
  156. package/.claude/worktrees/security-patches-review-c621ea/example/views/veggies/details.hbs +1 -0
  157. package/.claude/worktrees/security-patches-review-c621ea/example/views/veggies.hbs +17 -0
  158. package/.claude/worktrees/security-patches-review-c621ea/index.js +1 -0
  159. package/.claude/worktrees/security-patches-review-c621ea/lib/generate-id.js +16 -0
  160. package/.claude/worktrees/security-patches-review-c621ea/lib/hbs.js +665 -0
  161. package/.claude/worktrees/security-patches-review-c621ea/lib/resolver.js +59 -0
  162. package/.claude/worktrees/security-patches-review-c621ea/package.json +57 -0
  163. package/.claude/worktrees/security-patches-review-c621ea/pnpm-lock.yaml +3424 -0
  164. package/.claude/worktrees/security-patches-review-c621ea/pnpm-workspace.yaml +6 -0
  165. package/.claude/worktrees/security-patches-review-c621ea/renovate.json +6 -0
  166. package/.claude/worktrees/security-patches-review-c621ea/test/apps/async/index.js +139 -0
  167. package/.claude/worktrees/security-patches-review-c621ea/test/apps/async/views/failer.hbs +4 -0
  168. package/.claude/worktrees/security-patches-review-c621ea/test/apps/async/views/index.hbs +16 -0
  169. package/.claude/worktrees/security-patches-review-c621ea/test/apps/async/views/layout.hbs +1 -0
  170. package/.claude/worktrees/security-patches-review-c621ea/test/apps/i18n/index.js +57 -0
  171. package/.claude/worktrees/security-patches-review-c621ea/test/apps/i18n/locales/en.json +8 -0
  172. package/.claude/worktrees/security-patches-review-c621ea/test/apps/i18n/locales/fr.json +8 -0
  173. package/.claude/worktrees/security-patches-review-c621ea/test/apps/i18n/views/index.hbs +3 -0
  174. package/.claude/worktrees/security-patches-review-c621ea/test/asyncSpecs.js +69 -0
  175. package/.claude/worktrees/security-patches-review-c621ea/test/cacheSpecs.js +135 -0
  176. package/.claude/worktrees/security-patches-review-c621ea/test/customExtension.js +35 -0
  177. package/.claude/worktrees/security-patches-review-c621ea/test/handlebarsSpecs.js +92 -0
  178. package/.claude/worktrees/security-patches-review-c621ea/test/helperSpecs.js +58 -0
  179. package/.claude/worktrees/security-patches-review-c621ea/test/helpers.js +24 -0
  180. package/.claude/worktrees/security-patches-review-c621ea/test/i18nSpecs.js +36 -0
  181. package/.claude/worktrees/security-patches-review-c621ea/test/issues/144/index.hbs +1 -0
  182. package/.claude/worktrees/security-patches-review-c621ea/test/issues/153/index.hbs +3 -0
  183. package/.claude/worktrees/security-patches-review-c621ea/test/issues/21/views/index.hbs +1 -0
  184. package/.claude/worktrees/security-patches-review-c621ea/test/issues/21/views/layouts/default.hbs +1 -0
  185. package/.claude/worktrees/security-patches-review-c621ea/test/issues/21/views/layouts/sub/child.hbs +1 -0
  186. package/.claude/worktrees/security-patches-review-c621ea/test/issues/21/views/sub/relativeLayout.hbs +1 -0
  187. package/.claude/worktrees/security-patches-review-c621ea/test/issues/21/views/sub/sub.hbs +1 -0
  188. package/.claude/worktrees/security-patches-review-c621ea/test/issues/21/views/useLayoutInDir.hbs +1 -0
  189. package/.claude/worktrees/security-patches-review-c621ea/test/issues/22/layout1.hbs +1 -0
  190. package/.claude/worktrees/security-patches-review-c621ea/test/issues/22/layout2.hbs +1 -0
  191. package/.claude/worktrees/security-patches-review-c621ea/test/issues/22/template.hbs +1 -0
  192. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/empty.hbs +0 -0
  193. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/emptyComment.hbs +1 -0
  194. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/emptyPartial.hbs +1 -0
  195. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/index.hbs +4 -0
  196. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/layout.hbs +1 -0
  197. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/partials/custom/comment-only.hbs +1 -0
  198. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/partials/custom/empty.hbs +0 -0
  199. package/.claude/worktrees/security-patches-review-c621ea/test/issues/23/partials/hello.hbs +1 -0
  200. package/.claude/worktrees/security-patches-review-c621ea/test/issues/49/error.hbs +1 -0
  201. package/.claude/worktrees/security-patches-review-c621ea/test/issues/49/front/error.hbs +1 -0
  202. package/.claude/worktrees/security-patches-review-c621ea/test/issues/49/index.hbs +2 -0
  203. package/.claude/worktrees/security-patches-review-c621ea/test/issues/49/layouts/default.hbs +1 -0
  204. package/.claude/worktrees/security-patches-review-c621ea/test/issues/49/partial.hbs +1 -0
  205. package/.claude/worktrees/security-patches-review-c621ea/test/issues/49/partials/partial-error.hbs +1 -0
  206. package/.claude/worktrees/security-patches-review-c621ea/test/issues/53/default.hbs +15 -0
  207. package/.claude/worktrees/security-patches-review-c621ea/test/issues/53/index.hbs +7 -0
  208. package/.claude/worktrees/security-patches-review-c621ea/test/issues/53/partials/.gitkeep +0 -0
  209. package/.claude/worktrees/security-patches-review-c621ea/test/issues/59/index.hbs +2 -0
  210. package/.claude/worktrees/security-patches-review-c621ea/test/issues/62/basic.hbs +2 -0
  211. package/.claude/worktrees/security-patches-review-c621ea/test/issues/62/block.hbs +11 -0
  212. package/.claude/worktrees/security-patches-review-c621ea/test/issues/73/index.hbs +5 -0
  213. package/.claude/worktrees/security-patches-review-c621ea/test/issues/73/partials/partial.hbs +6 -0
  214. package/.claude/worktrees/security-patches-review-c621ea/test/issues/76/mypartial.hbs +0 -0
  215. package/.claude/worktrees/security-patches-review-c621ea/test/issues/84/index.hbs +1 -0
  216. package/.claude/worktrees/security-patches-review-c621ea/test/issues/84/partials/abc/def/ghi/test.hbs +1 -0
  217. package/.claude/worktrees/security-patches-review-c621ea/test/issues.js +490 -0
  218. package/.claude/worktrees/security-patches-review-c621ea/test/layoutSpecs.js +116 -0
  219. package/.claude/worktrees/security-patches-review-c621ea/test/localTemplateOptions/data-access-template.hbs +1 -0
  220. package/.claude/worktrees/security-patches-review-c621ea/test/localTemplateOptions/template.hbs +1 -0
  221. package/.claude/worktrees/security-patches-review-c621ea/test/localTemplateOptions.js +125 -0
  222. package/.claude/worktrees/security-patches-review-c621ea/test/multiple.js +115 -0
  223. package/.claude/worktrees/security-patches-review-c621ea/test/nonExpress.js +36 -0
  224. package/.claude/worktrees/security-patches-review-c621ea/test/optionsSpecs.js +22 -0
  225. package/.claude/worktrees/security-patches-review-c621ea/test/resolverSpecs.js +54 -0
  226. package/.claude/worktrees/security-patches-review-c621ea/test/views/beautify/expected.hbs +9 -0
  227. package/.claude/worktrees/security-patches-review-c621ea/test/views/beautify/index.hbs +2 -0
  228. package/.claude/worktrees/security-patches-review-c621ea/test/views/customExtension/layout.server.view.html +1 -0
  229. package/.claude/worktrees/security-patches-review-c621ea/test/views/customExtension/partialsDir/partial1.server.view.html +1 -0
  230. package/.claude/worktrees/security-patches-review-c621ea/test/views/customExtension/partialsDir/partial2.server.view.html +1 -0
  231. package/.claude/worktrees/security-patches-review-c621ea/test/views/customExtension/partialsDir/subs/subPartial1.server.view.html +1 -0
  232. package/.claude/worktrees/security-patches-review-c621ea/test/views/customExtension/partialsDir/subs/subPartial2.server.view.html +1 -0
  233. package/.claude/worktrees/security-patches-review-c621ea/test/views/customExtension/template.server.view.html +5 -0
  234. package/.claude/worktrees/security-patches-review-c621ea/test/views/disableLayoutDirective/aside.hbs +1 -0
  235. package/.claude/worktrees/security-patches-review-c621ea/test/views/disableLayoutDirective/index.hbs +2 -0
  236. package/.claude/worktrees/security-patches-review-c621ea/test/views/disableLayoutDirective/layouts/default.hbs +1 -0
  237. package/.claude/worktrees/security-patches-review-c621ea/test/views/helpers/home/async.hbs +6 -0
  238. package/.claude/worktrees/security-patches-review-c621ea/test/views/helpers/home/index.hbs +3 -0
  239. package/.claude/worktrees/security-patches-review-c621ea/test/views/helpers/layouts/default.hbs +1 -0
  240. package/.claude/worktrees/security-patches-review-c621ea/test/views/multiple/views1/collide.hbs +1 -0
  241. package/.claude/worktrees/security-patches-review-c621ea/test/views/multiple/views1/error.hbs +1 -0
  242. package/.claude/worktrees/security-patches-review-c621ea/test/views/multiple/views1/test1.hbs +1 -0
  243. package/.claude/worktrees/security-patches-review-c621ea/test/views/multiple/views2/collide.hbs +1 -0
  244. package/.claude/worktrees/security-patches-review-c621ea/test/views/multiple/views2/error.hbs +1 -0
  245. package/.claude/worktrees/security-patches-review-c621ea/test/views/multiple/views2/test2.hbs +1 -0
  246. package/.claude/worktrees/security-patches-review-c621ea/test/views/viewsDir/layouts/default.hbs +1 -0
  247. package/.claude/worktrees/security-patches-review-c621ea/test/views/viewsDir/sub/directive.hbs +2 -0
  248. package/.claude/worktrees/security-patches-review-c621ea/test/views/viewsDir/sub/lay.hbs +1 -0
  249. package/README.md +3 -2
  250. package/example/app-layoutsDir.js +2 -1
  251. package/example/app.js +2 -1
  252. package/lib/hbs.js +24 -4
  253. package/lib/resolver.js +10 -3
  254. package/package.json +2 -2
  255. package/test/apps/async/index.js +2 -1
  256. package/test/apps/i18n/index.js +2 -1
  257. package/test/asyncSpecs.js +60 -0
  258. package/test/customExtension.js +2 -1
  259. package/test/handlebarsSpecs.js +19 -0
  260. package/test/helperSpecs.js +4 -2
  261. package/test/issues.js +48 -20
  262. package/test/layoutSpecs.js +48 -0
  263. package/test/localTemplateOptions.js +12 -4
  264. package/test/multiple.js +3 -1
  265. package/test/nonExpress.js +4 -2
  266. package/test/optionsSpecs.js +1 -1
  267. package/test/resolverSpecs.js +70 -0
  268. package/test/views/asyncPrefix/body.hbs +1 -0
  269. package/test/views/asyncPrefix/index.hbs +1 -0
@@ -0,0 +1,99 @@
1
+ // pnpm add express express-hbs
2
+
3
+ 'use strict';
4
+
5
+ var express = require('express');
6
+ var app = express();
7
+ var hbs = require('..'); // should be `require('express-hbs')` outside of this example
8
+ var fs = require('fs');
9
+ var fp = require('path');
10
+
11
+ function relative(path) {
12
+ return fp.join(__dirname, path);
13
+ }
14
+ var viewsDir = relative('views');
15
+
16
+ app.use(express.static(relative('public')));
17
+
18
+ // Hook in express-hbs and tell it where known directories reside
19
+ app.engine(
20
+ 'hbs',
21
+ hbs.express4({
22
+ partialsDir: [relative('views/partials'), relative('views/partials-other')],
23
+ layoutsDir: relative('views/layout'),
24
+ defaultLayout: relative('views/layout/default.hbs'),
25
+ restrictLayoutsTo: relative('views/layout'),
26
+ }),
27
+ );
28
+ app.set('view engine', 'hbs');
29
+ app.set('views', relative('views'));
30
+
31
+ // Register sync helper
32
+ hbs.registerHelper('link', function (text, options) {
33
+ var attrs = [];
34
+ for (var prop in options.hash) {
35
+ attrs.push(prop + '="' + options.hash[prop] + '"');
36
+ }
37
+ return new hbs.SafeString('<a ' + attrs.join(' ') + '>' + text + '</a>');
38
+ });
39
+
40
+ // Register Async helpers
41
+ hbs.registerAsyncHelper('readFile', function (filename, cb) {
42
+ fs.readFile(fp.join(viewsDir, filename), 'utf8', function (err, content) {
43
+ if (err) console.error(err);
44
+ cb(new hbs.SafeString(content));
45
+ });
46
+ });
47
+
48
+ var fruits = [{ name: 'apple' }, { name: 'orange' }, { name: 'pear' }];
49
+
50
+ var veggies = [{ name: 'asparagus' }, { name: 'carrot' }, { name: 'spinach' }];
51
+
52
+ app.get('/', function (req, res) {
53
+ res.render('index', {
54
+ title: 'express-hbs example',
55
+ });
56
+ });
57
+
58
+ app.get('/fruits', function (req, res) {
59
+ res.render('fruits/index-layoutsDir', {
60
+ title: 'My favorite fruits',
61
+ fruits: fruits,
62
+ });
63
+ });
64
+
65
+ app.get('/fruits/:name', function (req, res) {
66
+ res.render('fruits/details-layoutsDir', {
67
+ fruit: req.params.name,
68
+ });
69
+ });
70
+
71
+ app.get('/veggies', function (req, res) {
72
+ res.render('veggies', {
73
+ title: 'My favorite veggies',
74
+ veggies: veggies,
75
+ layout: 'veggie',
76
+ });
77
+ });
78
+
79
+ app.get('/veggies/explicit-dir', function (req, res) {
80
+ res.render('veggies', {
81
+ title: 'My favorite veggies',
82
+ veggies: veggies,
83
+ layout: relative('views/layout/veggie'),
84
+ });
85
+ });
86
+
87
+ app.get('/veggies/:name', function (req, res) {
88
+ res.render('veggies/details', {
89
+ veggie: req.params.name,
90
+ layout: 'veggie-details',
91
+ });
92
+ });
93
+
94
+ if (require.main === module) {
95
+ app.listen(3000);
96
+ console.log('Express server listening on port 3000');
97
+ } else {
98
+ module.exports = app;
99
+ }
@@ -0,0 +1,103 @@
1
+ 'use strict';
2
+ // pnpm add express express-hbs
3
+
4
+ function create(hbs, env) {
5
+ if (env) process.env.NODE_ENV = env;
6
+
7
+ var express = require('express');
8
+ var app = express();
9
+ var fs = require('fs');
10
+ var fp = require('path');
11
+
12
+ function relative(path) {
13
+ return fp.join(__dirname, path);
14
+ }
15
+
16
+ var viewsDir = relative('views');
17
+
18
+ app.use(express.static(relative('public')));
19
+
20
+ // Hook in express-hbs and tell it where known directories reside
21
+ app.engine(
22
+ 'hbs',
23
+ hbs.express4({
24
+ partialsDir: [relative('views/partials'), relative('views/partials-other')],
25
+ defaultLayout: relative('views/layout/default.hbs'),
26
+ restrictLayoutsTo: viewsDir,
27
+ }),
28
+ );
29
+ app.set('view engine', 'hbs');
30
+ app.set('views', viewsDir);
31
+
32
+ // Register sync helper
33
+ hbs.registerHelper('link', function (text, options) {
34
+ var attrs = [];
35
+ for (var prop in options.hash) {
36
+ attrs.push(prop + '="' + options.hash[prop] + '"');
37
+ }
38
+ return new hbs.SafeString('<a ' + attrs.join(' ') + '>' + text + '</a>');
39
+ });
40
+
41
+ // Register Async helpers
42
+ hbs.registerAsyncHelper('readFile', function (filename, cb) {
43
+ fs.readFile(fp.join(viewsDir, filename), 'utf8', function (err, content) {
44
+ if (err) console.error(err);
45
+ cb(new hbs.SafeString(content));
46
+ });
47
+ });
48
+
49
+ var fruits = [{ name: 'apple' }, { name: 'orange' }, { name: 'pear' }];
50
+
51
+ var veggies = [{ name: 'asparagus' }, { name: 'carrot' }, { name: 'spinach' }];
52
+
53
+ app.get('/', function (req, res) {
54
+ res.render('index', {
55
+ title: 'express-hbs example',
56
+ });
57
+ });
58
+
59
+ app.get('/replace', function (req, res) {
60
+ res.render('replace', {
61
+ title: 'express-hbs example',
62
+ });
63
+ });
64
+
65
+ app.get('/fruits', function (req, res) {
66
+ res.render('fruits/index', {
67
+ title: 'My favorite fruits',
68
+ fruits: fruits,
69
+ });
70
+ });
71
+
72
+ app.get('/fruits/:name', function (req, res) {
73
+ res.render('fruits/details', {
74
+ fruit: req.params.name,
75
+ });
76
+ });
77
+
78
+ app.get('/veggies', function (req, res) {
79
+ res.render('veggies', {
80
+ title: 'My favorite veggies',
81
+ veggies: veggies,
82
+ layout: 'layout/veggie',
83
+ });
84
+ });
85
+
86
+ app.get('/veggies/:name', function (req, res) {
87
+ res.render('veggies/details', {
88
+ veggie: req.params.name,
89
+ layout: 'layout/veggie-details',
90
+ });
91
+ });
92
+
93
+ return app;
94
+ }
95
+
96
+ if (require.main === module) {
97
+ var hbs = require('..');
98
+ var app = create(hbs);
99
+ app.listen(3000);
100
+ console.log('Express server listening on port 3000');
101
+ } else {
102
+ exports.create = create;
103
+ }
@@ -0,0 +1,17 @@
1
+ * {
2
+ font-family: Georgia, serif;
3
+ }
4
+
5
+ h1, h2 {
6
+ font-family: Helvetica, Arial, sans;
7
+ }
8
+
9
+ .veggie-details {
10
+ border: 5px solid green;
11
+ padding: 10px;
12
+ }
13
+
14
+ .fruit-details {
15
+ border: 5px solid red;
16
+ padding: 10px;
17
+ }
@@ -0,0 +1,4 @@
1
+ {{!< ../layout/fruit-details}}
2
+
3
+ {{fruit}}
4
+
@@ -0,0 +1,20 @@
1
+ <!-- name of layout -->
2
+ {{!< fruits}}
3
+
4
+ {{#contentFor 'pageStyles'}}
5
+ <style>
6
+ li a {
7
+ color: #800;
8
+ }
9
+ </style>
10
+ {{/contentFor}}
11
+
12
+
13
+ <h1>{{title}}</h1>
14
+ <ul>
15
+ {{#each fruits}}
16
+ <li>
17
+ <a href="/fruits/{{this.name}}">{{this.name}}</a>
18
+ </li>
19
+ {{/each}}
20
+ </ul>
@@ -0,0 +1,20 @@
1
+ <!-- name of layout -->
2
+ {{!< ../layout/fruits}}
3
+
4
+ {{#contentFor 'pageStyles'}}
5
+ <style>
6
+ li a {
7
+ color: #800;
8
+ }
9
+ </style>
10
+ {{/contentFor}}
11
+
12
+
13
+ <h1>{{title}}</h1>
14
+ <ul>
15
+ {{#each fruits}}
16
+ <li>
17
+ <a href="/fruits/{{this.name}}">{{this.name}}</a>
18
+ </li>
19
+ {{/each}}
20
+ </ul>
@@ -0,0 +1,34 @@
1
+ {{#contentFor 'pageStyles'}}
2
+ <style>
3
+ .clicker {
4
+ color: blue;
5
+ };
6
+ </style>
7
+ {{/contentFor}}
8
+
9
+
10
+ {{#contentFor 'pageScripts'}}
11
+ <script>
12
+ $(function() {
13
+ $('.clicker').click(function() {
14
+ $(this).text('Hello express-hbs!');
15
+ });
16
+ });
17
+ </script>
18
+ {{/contentFor}}
19
+
20
+
21
+ <h1>{{title}}</h1>
22
+ <p class='clicker'>Click me!</p>
23
+ <p>
24
+ <a href='/fruits'>Favorite fruits</a>
25
+ </p>
26
+ <p>
27
+ <!-- sync helper -->
28
+ {{{link 'Vegetables' href='/veggies'}}}
29
+ </p>
30
+
31
+ <!-- async helper -->
32
+ <div>
33
+ {{{readFile 'tos.txt'}}}
34
+ </div>
@@ -0,0 +1,13 @@
1
+ {{!< html-struct}}
2
+
3
+ <h2>DEFAULT LAYOUT</h2>
4
+
5
+ {{#block 'default-block'}}
6
+ Default block content
7
+ {{/block}}
8
+
9
+ {{#block 'replaced-default-block'}}
10
+ Default block content
11
+ {{/block}}
12
+
13
+ {{{body}}}
@@ -0,0 +1,9 @@
1
+ {{!< fruits}}
2
+
3
+ <h3>NESTED LAYOUT</h3>
4
+
5
+ <p>This is one of my favorite fruits!</p>
6
+
7
+ <span class="fruit-details">
8
+ {{{body}}}
9
+ </span>
@@ -0,0 +1,6 @@
1
+ {{!< html-struct}}
2
+
3
+ <h2>DECLARATIVE LAYOUT</h2>
4
+
5
+ <!-- Placeholder for page content. -->
6
+ {{{body}}}
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>{{title}}</title>
5
+ <link type="text/css" rel="stylesheet" href="/css/style.css"/>
6
+ {{{block "pageStyles"}}}
7
+ </head>
8
+
9
+ <body>
10
+
11
+ <!-- Placeholder for page content. -->
12
+ {{{body}}}
13
+
14
+ <!-- Partials are common snippets to be used 1 or more pages. -->
15
+ {{> scripts}}
16
+ {{> other}}
17
+
18
+ <!-- A block is placeholder for pieces of content defined in a page. -->
19
+ {{{block 'pageScripts'}}}
20
+ </body>
21
+ </html>
@@ -0,0 +1,9 @@
1
+ {{!< veggie}}
2
+
3
+ <h3>NESTED LAYOUT</h3>
4
+
5
+ <p>This is one of my favorite veggies!</p>
6
+
7
+ <span class="veggie-details">
8
+ {{{body}}}
9
+ </span>
@@ -0,0 +1,6 @@
1
+ {{!< html-struct}}
2
+
3
+ <h2>PROGRAMMATIC LAYOUT</h2>
4
+
5
+ <!-- Placeholder for page content. -->
6
+ {{{body}}}
@@ -0,0 +1,5 @@
1
+ {{#if production}}
2
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
3
+ {{else}}
4
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js"></script>
5
+ {{/if}}
@@ -0,0 +1,6 @@
1
+ {{#contentFor 'replaced-default-block'}}
2
+ Non-default block content
3
+ {{/contentFor}}
4
+
5
+
6
+ <h1>{{title}}</h1>
@@ -0,0 +1,3 @@
1
+ <h4>Terms of Service</h4>
2
+
3
+ <div>Async result!</div>
@@ -0,0 +1,17 @@
1
+ {{#contentFor 'pageStyles'}}
2
+ <style>
3
+ li a {
4
+ color: #800;
5
+ }
6
+ </style>
7
+ {{/contentFor}}
8
+
9
+ {{> sub/comment}}
10
+ <h1>{{title}}</h1>
11
+ <ul>
12
+ {{#each veggies}}
13
+ <li>
14
+ <a href="/veggies/{{this.name}}">{{this.name}}</a>
15
+ </li>
16
+ {{/each}}
17
+ </ul>
@@ -0,0 +1 @@
1
+ module.exports = require('./lib/hbs');
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_';
4
+
5
+ function generateId(length) {
6
+ if (!length) {
7
+ length = 8;
8
+ }
9
+ var res = '';
10
+ for (var i = 0; i < length; ++i) {
11
+ res += alphabet[Math.floor(Math.random() * alphabet.length)];
12
+ }
13
+ return res;
14
+ }
15
+
16
+ module.exports = generateId;