express-hbs 2.5.0 → 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 (257) 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/lib/hbs.js +16 -5
  250. package/lib/resolver.js +10 -3
  251. package/package.json +1 -1
  252. package/test/asyncSpecs.js +60 -0
  253. package/test/handlebarsSpecs.js +19 -0
  254. package/test/layoutSpecs.js +30 -0
  255. package/test/resolverSpecs.js +70 -0
  256. package/test/views/asyncPrefix/body.hbs +1 -0
  257. package/test/views/asyncPrefix/index.hbs +1 -0
@@ -0,0 +1,6 @@
1
+ strictDepBuilds: true
2
+ minimumReleaseAge: 4320
3
+ blockExoticSubdeps: true
4
+
5
+ minimumReleaseAgeExclude:
6
+ - '@tryghost/*'
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "local>TryGhost/renovate-config"
5
+ ],
6
+ "packageRules": [
7
+ {
8
+ "description": "Keep caret ranges on published dependencies so consumers can dedupe; bump the floor to the tested version",
9
+ "matchDepTypes": ["dependencies", "optionalDependencies"],
10
+ "rangeStrategy": "bump"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ var express = require('express');
4
+ var cookieParser = require('cookie-parser');
5
+ var fs = require('fs');
6
+ var path = require('path');
7
+ var url = require('url');
8
+
9
+ var pages = [
10
+ {
11
+ id: 1,
12
+ title: 'Title 1',
13
+ },
14
+ {
15
+ id: 2,
16
+ title: 'Title 2',
17
+ },
18
+ {
19
+ id: 3,
20
+ title: 'Title 3',
21
+ },
22
+ ];
23
+
24
+ var comments = [
25
+ {
26
+ id: 1,
27
+ page: 1,
28
+ subject: 'Title 1 Comment 1',
29
+ auther: 'JT',
30
+ },
31
+ {
32
+ id: 2,
33
+ page: 1,
34
+ subject: 'Title 1 Comment 2',
35
+ auther: 'Anna',
36
+ },
37
+ {
38
+ id: 3,
39
+ page: 1,
40
+ subject: 'Title 1 Comment 3',
41
+ auther: 'Jane',
42
+ },
43
+ {
44
+ id: 4,
45
+ page: 1,
46
+ subject: 'Title 1 Comment 4',
47
+ auther: 'Bob',
48
+ },
49
+ {
50
+ id: 5,
51
+ page: 4,
52
+ subject: 'This should not show!',
53
+ auther: 'Jill',
54
+ },
55
+ ];
56
+
57
+ function getRandomNumber(min, max) {
58
+ return Math.random() * (max - min) + min;
59
+ }
60
+
61
+ function create(hbs, env) {
62
+ if (env) process.env.NODE_ENV = env;
63
+ var app = express();
64
+ var viewsDir = path.join(__dirname, 'views');
65
+
66
+ // Hook in express-hbs and tell it where known directories reside
67
+ app.engine(
68
+ 'hbs',
69
+ hbs.express4({
70
+ defaultLayout: path.join(viewsDir, 'layout.hbs'),
71
+ restrictLayoutsTo: viewsDir,
72
+ }),
73
+ );
74
+ app.set('view engine', 'hbs');
75
+ app.set('views', viewsDir);
76
+
77
+ app.use(cookieParser());
78
+
79
+ app.get('/', function (req, res) {
80
+ res.render('index', {
81
+ message: 'Hello,',
82
+ username: req.cookies.user,
83
+ });
84
+ });
85
+
86
+ app.get('/fail', function (req, res) {
87
+ res.render('failer');
88
+ });
89
+
90
+ hbs.registerAsyncHelper('user', function (username, resultcb) {
91
+ setTimeout(
92
+ function () {
93
+ resultcb(username);
94
+ },
95
+ getRandomNumber(100, 900),
96
+ );
97
+ });
98
+
99
+ hbs.registerAsyncHelper('pages', function (options, resultcb) {
100
+ var self = this;
101
+ setTimeout(
102
+ function () {
103
+ var result = [];
104
+ for (var i = 0; i < pages.length; i++) {
105
+ options.data.page = pages[i];
106
+ result.push(options.fn.call(self, pages[i], options));
107
+ }
108
+ resultcb(result.join(''));
109
+ },
110
+ getRandomNumber(100, 900),
111
+ );
112
+ });
113
+
114
+ hbs.registerAsyncHelper('comments', function (options, resultcb) {
115
+ var self = this;
116
+ setTimeout(
117
+ function () {
118
+ var result = [];
119
+ for (var i = 0; i < comments.length; i++) {
120
+ if (options.hash.page === comments[i].page) {
121
+ result.push(options.fn(comments[i]));
122
+ }
123
+ }
124
+ resultcb(result.join(''));
125
+ },
126
+ getRandomNumber(100, 300),
127
+ );
128
+ });
129
+
130
+ hbs.registerAsyncHelper('failer', function (_, resultcb) {
131
+ setTimeout(function () {
132
+ resultcb(options.fn());
133
+ }, 100);
134
+ });
135
+
136
+ return app;
137
+ }
138
+
139
+ exports.create = create;
@@ -0,0 +1,4 @@
1
+ {{#contentFor "title"}}
2
+ Failer
3
+ {{/contentFor}}
4
+ <span id="text">This should fail {{#failer}}for sure{{/failer}}.</span>
@@ -0,0 +1,16 @@
1
+ {{#contentFor "title"}}
2
+ {{message}} {{{user username}}}
3
+ {{/contentFor}}
4
+ <span id="text">This should welcome {{username}}.</span>
5
+ <div class="pages">
6
+ {{#pages filter="tags:test"}}
7
+ <div class="page">
8
+ <span class="title">{{title}}</title>
9
+ <div class="top-comments">
10
+ {{#comments top="3" page=id}}
11
+ <span class="subject">{{subject}}</span>-<span class="auther">{{auther}}</span>
12
+ {{/comments}}
13
+ </div>
14
+ </div>
15
+ {{/pages}}
16
+ </div>
@@ -0,0 +1 @@
1
+ <html><title>{{{block "title"}}}</title><body>{{{body}}}</body></html>
@@ -0,0 +1,57 @@
1
+ /**
2
+ * This example is intended to show a cookie usage in express setup
3
+ * with handlebars (hbs) template engine and also to be run
4
+ * as integration test for concurrency issues.
5
+ *
6
+ * Please remove setTimeout(), if you intend to use it as a blueprint!
7
+ *
8
+ */
9
+
10
+ function create(hbs, env) {
11
+ 'use strict';
12
+
13
+ if (env) process.env.NODE_ENV = env;
14
+
15
+ var express = require('express');
16
+ var cookieParser = require('cookie-parser');
17
+ var app = express();
18
+ var fs = require('fs');
19
+ var path = require('path');
20
+ var viewsDir = __dirname + '/views';
21
+ var i18n = require('i18n');
22
+ var url = require('url');
23
+
24
+ // minimal config
25
+ i18n.configure({
26
+ locales: ['en', 'fr'],
27
+ cookie: 'locale',
28
+ directory: __dirname + '/locales',
29
+ });
30
+
31
+ // Hook in express-hbs and tell it where known directories reside
32
+ app.engine(
33
+ 'hbs',
34
+ hbs.express3({
35
+ i18n: i18n,
36
+ restrictLayoutsTo: viewsDir,
37
+ }),
38
+ );
39
+ app.set('view engine', 'hbs');
40
+ app.set('views', viewsDir);
41
+
42
+ // you'll need cookies
43
+ app.use(cookieParser());
44
+
45
+ // init i18n module for this loop
46
+ app.use(i18n.init);
47
+
48
+ app.get('/', function (req, res) {
49
+ res.render('index', {
50
+ array: [1, 2],
51
+ });
52
+ });
53
+
54
+ return app;
55
+ }
56
+
57
+ exports.create = create;
@@ -0,0 +1,8 @@
1
+ {
2
+ "text to test": "text to test",
3
+ "%d cat": {
4
+ "one": "%d cat",
5
+ "other": "%d cats"
6
+ },
7
+ "each": "each"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "text to test": "Texte à tester",
3
+ "%d cat": {
4
+ "one": "%d chat",
5
+ "other": "%d chats"
6
+ },
7
+ "each": "chaque"
8
+ }
@@ -0,0 +1,3 @@
1
+ <span id="text">{{__ "text to test"}}</span>
2
+ <br>
3
+ {{#each array}}<span class="{{__ "each"}}">{{__n "%d cat" "%d cats" .}}</span>{{/each}}
@@ -0,0 +1,69 @@
1
+ 'use stirct';
2
+
3
+ var request = require('supertest');
4
+ var assert = require('assert');
5
+ var hbs = require('..');
6
+ var asyncApp = require('./apps/async');
7
+ var resolver = require('../lib/resolver');
8
+
9
+ function makeUserRequest(app, user, cb) {
10
+ request(app)
11
+ .get('/')
12
+ .set('Cookie', 'user=' + user)
13
+ .end(function (err, res) {
14
+ if (err) cb(err);
15
+ if (res.text.search('Hello, ' + user) <= 0) {
16
+ return cb(new Error('Wrong template send for user ' + user + ': ' + res.text), user);
17
+ }
18
+ return cb(null, user, res.text);
19
+ });
20
+ }
21
+
22
+ function requestAll(app, users, cb) {
23
+ var status = {};
24
+ for (var i = 0; i < users.length; i++) {
25
+ status[users[i]] = 'Pending';
26
+ makeUserRequest(app, users[i], function (err, user) {
27
+ if (err) {
28
+ status[user] = 'Error: ' + err.message;
29
+ } else {
30
+ status[user] = 'Completed';
31
+ }
32
+ });
33
+ }
34
+ var checkTimer = setInterval(function () {
35
+ for (var i = 0; i < users.length; i++) {
36
+ if (status[users[i]] === 'Pending') {
37
+ return;
38
+ }
39
+ }
40
+ clearInterval(checkTimer);
41
+ cb(status);
42
+ }, 100);
43
+ }
44
+
45
+ describe('async', function () {
46
+ it('should render all async helpers', function (done) {
47
+ var app = asyncApp.create(hbs.create(), 'production');
48
+ requestAll(app, ['jt', 'anna', 'joe', 'jeff', 'jane'], function (results) {
49
+ assert.equal(results.jt, 'Completed');
50
+ assert.equal(results.anna, 'Completed');
51
+ assert.equal(results.joe, 'Completed');
52
+ assert.equal(results.jeff, 'Completed');
53
+ assert.equal(results.jane, 'Completed');
54
+ done();
55
+ });
56
+ });
57
+
58
+ it('should render nested async helpers', function (done) {
59
+ var app = asyncApp.create(hbs.create(), 'production');
60
+ makeUserRequest(app, 'jt', function (err, user, results) {
61
+ if (err) {
62
+ return done(err);
63
+ }
64
+ assert.equal(false, resolver.hasResolvers(results));
65
+ assert.equal(-1, results.search('This should not show!'));
66
+ done();
67
+ });
68
+ });
69
+ });
@@ -0,0 +1,135 @@
1
+ var request = require('supertest');
2
+ var path = require('path');
3
+ var rewire = require('rewire');
4
+ var assert = require('assert');
5
+ var fs = require('fs');
6
+
7
+ /**
8
+ * Creates instance of example app using an injected version of express-hbs to track the number of times a
9
+ * file is read. Additionally, the $NODE_ENV environment variable may be set.
10
+ *
11
+ * @param env
12
+ * @returns {{app: hbs, readCounts: {}}}
13
+ */
14
+ function createApp(env) {
15
+ var readCounts = {};
16
+ var hbs = rewire('../lib/hbs');
17
+ hbs.__set__('fs', {
18
+ readFileSync: function (filename, encoding) {
19
+ if (typeof readCounts[filename] === 'undefined') {
20
+ readCounts[filename] = 1;
21
+ } else {
22
+ readCounts[filename] += 1;
23
+ }
24
+
25
+ return fs.readFileSync(filename, encoding);
26
+ },
27
+
28
+ readFile: function (filename, encoding, cb) {
29
+ if (typeof readCounts[filename] === 'undefined') {
30
+ readCounts[filename] = 1;
31
+ } else {
32
+ readCounts[filename] += 1;
33
+ }
34
+
35
+ fs.readFile(filename, encoding, cb);
36
+ },
37
+ existsSync: function (filename, encoding) {
38
+ return fs.existsSync(filename, encoding);
39
+ },
40
+ });
41
+
42
+ // used mocked hbs in example
43
+ var example = require('../example/app');
44
+ var app = example.create(hbs, env);
45
+ return { app: app, readCounts: readCounts };
46
+ }
47
+
48
+ describe('express-hbs', function () {
49
+ describe('cache', function () {
50
+ it('should not cache layout in `development`', function (done) {
51
+ var mock = createApp('development');
52
+
53
+ request(mock.app)
54
+ .get('/')
55
+ .end(function (err) {
56
+ assert.ifError(err);
57
+
58
+ request(mock.app)
59
+ .get('/')
60
+ .expect(/DEFAULT LAYOUT/)
61
+ .end(function (err) {
62
+ assert.ifError(err);
63
+
64
+ var filename = path.resolve(__dirname, '../example/views/layout/default.hbs');
65
+ assert.equal(mock.readCounts[filename], 2);
66
+ done();
67
+ });
68
+ });
69
+ });
70
+
71
+ it('should cache layout in `production` reading file once', function (done) {
72
+ var mock = createApp('production');
73
+
74
+ // reads layout from fs once
75
+ request(mock.app)
76
+ .get('/')
77
+ .end(function (err) {
78
+ assert.ifError(err);
79
+
80
+ request(mock.app)
81
+ .get('/')
82
+ .expect(/DEFAULT LAYOUT/)
83
+ .end(function (err, res) {
84
+ assert.ifError(err);
85
+
86
+ var filename = path.resolve(__dirname, '../example/views/layout/default.hbs');
87
+ assert.equal(mock.readCounts[filename], 1);
88
+ done();
89
+ });
90
+ });
91
+ });
92
+
93
+ it('should not cache partials in `development`', function (done) {
94
+ var mock = createApp('development');
95
+
96
+ request(mock.app)
97
+ .get('/veggies')
98
+ .expect(/just a comment/)
99
+ .end(function (err) {
100
+ assert.ifError(err);
101
+ request(mock.app)
102
+ .get('/veggies')
103
+ .expect(/just a comment/)
104
+ .end(function (err) {
105
+ assert.ifError(err);
106
+
107
+ var filename = path.resolve(__dirname, '../example/views/partials/sub/comment.hbs');
108
+ assert.equal(mock.readCounts[filename], 2);
109
+ done();
110
+ });
111
+ });
112
+ });
113
+
114
+ it('should cache partials in `production', function (done) {
115
+ var mock = createApp('production');
116
+
117
+ request(mock.app)
118
+ .get('/veggies')
119
+ .expect(/just a comment/)
120
+ .end(function (err) {
121
+ assert.ifError(err);
122
+ request(mock.app)
123
+ .get('/veggies')
124
+ .expect(/just a comment/)
125
+ .end(function (err) {
126
+ assert.ifError(err);
127
+
128
+ var filename = path.resolve(__dirname, '../example/views/partials/sub/comment.hbs');
129
+ assert.equal(mock.readCounts[filename], 1);
130
+ done();
131
+ });
132
+ });
133
+ });
134
+ });
135
+ });
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+ var assert = require('assert');
3
+ var hbs = require('..');
4
+ var path = require('path');
5
+ var H = require('./helpers');
6
+
7
+ // MEANJS is using custom extension .server.view.html instead of .hbs
8
+ // https://github.com/meanjs/mean
9
+ describe('custom extension for partials view', function () {
10
+ var dirname = path.join(__dirname, 'views/customExtension');
11
+ var render = hbs.create().express4({
12
+ extname: '.server.view.html',
13
+ partialsDir: dirname + '/partialsDir',
14
+ restrictLayoutsTo: dirname,
15
+ });
16
+
17
+ it('should allow rendering multiple partials with custom extension', function (done) {
18
+ function check(err, html) {
19
+ assert.ifError(err);
20
+ assert.equal(
21
+ '<html>' +
22
+ '<subpartial>1</subpartial>' +
23
+ '<partial>1</partial>' +
24
+ '<subpartial>2</subpartial>' +
25
+ '<partial>2</partial>' +
26
+ '</html>',
27
+ H.stripWs(html),
28
+ );
29
+ done();
30
+ }
31
+
32
+ var options = { cache: true, settings: { views: dirname } };
33
+ render(dirname + '/template.server.view.html', options, check);
34
+ });
35
+ });
@@ -0,0 +1,92 @@
1
+ var request = require('supertest');
2
+ var assert = require('assert');
3
+ var hbs = require('..');
4
+
5
+ describe('express-hbs', function () {
6
+ describe('defaults', function () {
7
+ var app;
8
+
9
+ beforeEach(function () {
10
+ var example = require('../example/app');
11
+ app = example.create(hbs.create());
12
+ });
13
+
14
+ it('should render using default layout', function (done) {
15
+ request(app)
16
+ .get('/')
17
+ .expect(/DEFAULT LAYOUT/, done);
18
+ });
19
+
20
+ it('should render layout declared in markup', function (done) {
21
+ request(app)
22
+ .get('/fruits')
23
+ .expect(/DECLARATIVE LAYOUT/, done);
24
+ });
25
+
26
+ it('should render nested declarative layouts correctly', function (done) {
27
+ request(app)
28
+ .get('/fruits/apple')
29
+ .expect(/DECLARATIVE LAYOUT/)
30
+ .expect(/NESTED LAYOUT/, done);
31
+ });
32
+
33
+ it('should render layout specified as locals', function (done) {
34
+ request(app)
35
+ .get('/veggies')
36
+ .expect(/PROGRAMMATIC LAYOUT/, done);
37
+ });
38
+
39
+ it('should render nested layouts correctly when first layout is specified as locals', function (done) {
40
+ request(app)
41
+ .get('/veggies/carrot')
42
+ .expect(/PROGRAMMATIC LAYOUT/)
43
+ .expect(/NESTED LAYOUT/, done);
44
+ });
45
+
46
+ it('should render partial', function (done) {
47
+ request(app)
48
+ .get('/veggies')
49
+ .expect(/jquery\.js/)
50
+ .expect(/Other partial/, done);
51
+ });
52
+
53
+ it('should render sub partial', function (done) {
54
+ request(app)
55
+ .get('/veggies')
56
+ .expect(/just a comment/, done);
57
+ });
58
+
59
+ it('should render block', function (done) {
60
+ request(app)
61
+ .get('/')
62
+ .expect(/color: blue/, done);
63
+ });
64
+
65
+ it('should render block default content', function (done) {
66
+ request(app)
67
+ .get('/')
68
+ .expect(/Default block content/, done);
69
+ });
70
+
71
+ it('should render block content instead of default content when contentFor is declared', function (done) {
72
+ request(app)
73
+ .get('/replace')
74
+ .expect(/Non-default block content/, done);
75
+ });
76
+
77
+ it('should replace {{body}}', function (done) {
78
+ request(app)
79
+ .get('/')
80
+ .expect(/Vegetables/, done);
81
+ });
82
+ });
83
+
84
+ describe('instances', function () {
85
+ it('should create isolated instances', function () {
86
+ var hbs2 = hbs.create();
87
+ var hbs3 = hbs.create();
88
+
89
+ assert(hbs !== hbs2 && hbs !== hbs3 && hbs2 !== hbs3);
90
+ });
91
+ });
92
+ });
@@ -0,0 +1,58 @@
1
+ var assert = require('assert');
2
+ var hbs = require('..');
3
+ var H = require('./helpers');
4
+
5
+ describe('helpers', function () {
6
+ describe('sync', function () {
7
+ var dirname = __dirname + '/views/helpers';
8
+
9
+ function sync(s, options) {
10
+ return new hbs.SafeString('-sync-' + s);
11
+ }
12
+
13
+ it('should register functions', function (done) {
14
+ var hb = hbs.create();
15
+ hb.registerHelper('sync', sync);
16
+ var render = hb.express3({
17
+ viewsDir: dirname,
18
+ restrictLayoutsTo: dirname,
19
+ });
20
+ var locals = H.createLocals('express3', dirname);
21
+
22
+ render(dirname + '/home/index.hbs', locals, function (err, html) {
23
+ assert.equal('<default>index-sync-index</default>', H.stripWs(html));
24
+ done();
25
+ });
26
+ });
27
+ });
28
+
29
+ describe('async', function () {
30
+ var dirname = __dirname + '/views/helpers';
31
+ it('should register functions', function (done) {
32
+ var hb = hbs.create();
33
+ function async(s, cb) {
34
+ setTimeout(
35
+ function () {
36
+ cb(new hb.SafeString('-async-' + s));
37
+ },
38
+ Math.floor(Math.random() * 10 + 1),
39
+ );
40
+ }
41
+ hb.registerAsyncHelper('async', async);
42
+
43
+ var render = hb.express3({
44
+ viewsDir: dirname,
45
+ restrictLayoutsTo: dirname,
46
+ });
47
+ var locals = H.createLocals('express3', dirname);
48
+
49
+ render(dirname + '/home/async.hbs', locals, function (err, html) {
50
+ assert.equal(
51
+ '<default>asynctemplate-async-foo-async-bar-async-bah-async-baz</default>',
52
+ H.stripWs(html),
53
+ );
54
+ done();
55
+ });
56
+ });
57
+ });
58
+ });
@@ -0,0 +1,24 @@
1
+ function stripWs(s) {
2
+ return s.replace(/\s+/g, '');
3
+ }
4
+
5
+ function createLocals(which, viewsDir, locals) {
6
+ if (!locals) locals = {};
7
+ var opts = {};
8
+ if (which === 'express3' || which === 'express4') {
9
+ opts.settings = {
10
+ views: viewsDir,
11
+ };
12
+ opts.cache = process.env.NODE_ENV === 'production';
13
+ for (var k in locals) {
14
+ if (!locals.hasOwnProperty(k)) continue;
15
+ opts[k] = locals[k];
16
+ }
17
+ }
18
+ return opts;
19
+ }
20
+
21
+ module.exports = {
22
+ createLocals: createLocals,
23
+ stripWs: stripWs,
24
+ };