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,490 @@
1
+ 'use strict';
2
+ var assert = require('assert');
3
+ var hbs = require('..');
4
+ var path = require('path');
5
+ var H = require('./helpers');
6
+
7
+ describe('issue-22 template', function () {
8
+ var dirname = path.join(__dirname, 'issues/22');
9
+
10
+ it('should use multiple layouts with caching', function (done) {
11
+ var render = hbs.create().express3({
12
+ restrictLayoutsTo: dirname,
13
+ });
14
+ var locals1 = H.createLocals('express3', dirname, { layout: 'layout1', cache: true });
15
+ var locals2 = H.createLocals('express3', dirname, { layout: 'layout2', cache: true });
16
+
17
+ render(dirname + '/template.hbs', locals1, function (err, html) {
18
+ assert.ifError(err);
19
+ assert.equal('<layout1>template</layout1>', H.stripWs(html));
20
+ render(dirname + '/template.hbs', locals2, function (err, html) {
21
+ assert.ifError(err);
22
+ assert.equal('<layout2>template</layout2>', H.stripWs(html));
23
+ done();
24
+ });
25
+ });
26
+ });
27
+ });
28
+
29
+ describe('issue-23', function () {
30
+ var dirname = path.join(__dirname, 'issues/23');
31
+
32
+ it('should not pass an empty or missing partial to handlebars', function (done) {
33
+ var render = hbs.create().express3({
34
+ partialsDir: [dirname + '/partials'],
35
+ restrictLayoutsTo: dirname,
36
+ });
37
+
38
+ function check(err, html) {
39
+ assert.ifError(err);
40
+ assert.equal('<html>Hello</html>', H.stripWs(html));
41
+ done();
42
+ }
43
+ var result = render(
44
+ dirname + '/index.hbs',
45
+ { cache: true, settings: { views: dirname + '/views' } },
46
+ check,
47
+ );
48
+ });
49
+
50
+ it('should handle empty string', function (done) {
51
+ var render = hbs.create().express3({
52
+ partialsDir: [dirname + '/partials'],
53
+ restrictLayoutsTo: dirname,
54
+ });
55
+
56
+ function check(err, html) {
57
+ assert.ifError(err);
58
+ assert.equal('', H.stripWs(html));
59
+ done();
60
+ }
61
+ var result = render(
62
+ dirname + '/empty.hbs',
63
+ { cache: true, settings: { views: dirname + '/views' } },
64
+ check,
65
+ );
66
+ });
67
+
68
+ it('should register empty partial', function (done) {
69
+ var hb = hbs.create();
70
+ var render = hb.express3({
71
+ partialsDir: [dirname + '/partials'],
72
+ restrictLayoutsTo: dirname,
73
+ });
74
+ hb.handlebars.registerPartial('emptyPartial', '');
75
+
76
+ var pass = 0;
77
+ function check(err, html) {
78
+ pass++;
79
+ assert.ifError(err);
80
+ assert.equal('foo', H.stripWs(html));
81
+ if (pass < 3) {
82
+ doIt();
83
+ } else {
84
+ done();
85
+ }
86
+ }
87
+ function doIt() {
88
+ render(
89
+ dirname + '/emptyPartial.hbs',
90
+ { cache: true, settings: { views: dirname + '/views' } },
91
+ check,
92
+ );
93
+ }
94
+ doIt();
95
+ });
96
+
97
+ it('should register partial that results in empty string (comment)', function (done) {
98
+ var hb = hbs.create();
99
+ var render = hb.express3({
100
+ partialsDir: [dirname + '/partials'],
101
+ restrictLayoutsTo: dirname,
102
+ });
103
+ // this fails
104
+ //hb.handlebars.registerPartial('emptyComment', '{{! just a comment}}');
105
+ hb.registerPartial('emptyComment', '{{! just a comment}}');
106
+
107
+ var pass = 0;
108
+ function check(err, html) {
109
+ pass++;
110
+ assert.ifError(err);
111
+ assert.equal('foo', H.stripWs(html));
112
+ if (pass < 3) {
113
+ doIt();
114
+ } else {
115
+ done();
116
+ }
117
+ }
118
+ function doIt() {
119
+ render(
120
+ dirname + '/emptyComment.hbs',
121
+ { cache: true, settings: { views: dirname + '/views' } },
122
+ check,
123
+ );
124
+ }
125
+ doIt();
126
+ });
127
+ });
128
+
129
+ describe('issue-21', function () {
130
+ var dirname = path.join(__dirname, 'issues/21');
131
+ var render = hbs.create().express3({
132
+ layoutsDir: dirname + '/views/layouts',
133
+ restrictLayoutsTo: dirname,
134
+ });
135
+
136
+ it('should allow specifying layouts without the parent dir', function (done) {
137
+ function check(err, html) {
138
+ assert.ifError(err);
139
+ assert.equal('<html>index</html>', H.stripWs(html));
140
+ done();
141
+ }
142
+
143
+ var options = { cache: true, layout: 'default', settings: { views: dirname + '/views' } };
144
+ var result = render(dirname + '/views/index.hbs', options, check);
145
+ });
146
+
147
+ it('should allow specifying layouts without the parent dir in a sub view', function (done) {
148
+ function check(err, html) {
149
+ assert.ifError(err);
150
+ assert.equal('<html>sub</html>', H.stripWs(html));
151
+ done();
152
+ }
153
+
154
+ var options = { cache: true, layout: 'default', settings: { views: dirname + '/views' } };
155
+ var result = render(dirname + '/views/sub/sub.hbs', options, check);
156
+ });
157
+
158
+ it('should treat layouts that start with "." relative to template', function (done) {
159
+ function check(err, html) {
160
+ assert.ifError(err);
161
+ assert.equal('<relative>sub</relative>', H.stripWs(html));
162
+ done();
163
+ }
164
+
165
+ var options = {
166
+ cache: true,
167
+ layout: './relativeLayout',
168
+ settings: { views: dirname + '/views' },
169
+ };
170
+ var result = render(dirname + '/views/sub/sub.hbs', options, check);
171
+ });
172
+
173
+ it('should allow layouts in subfolders', function (done) {
174
+ function check(err, html) {
175
+ assert.ifError(err);
176
+ assert.equal('<sub>useLayoutInDir</sub>', H.stripWs(html));
177
+ done();
178
+ }
179
+
180
+ var options = { cache: true, layout: 'sub/child', settings: { views: dirname + '/views' } };
181
+ var result = render(dirname + '/views/useLayoutInDir.hbs', options, check);
182
+ });
183
+
184
+ it('should treat layouts relative to views directory if layoutsDir is not passed', function (done) {
185
+ var dirname = path.join(__dirname, 'issues/21');
186
+ var render = hbs.create().express3({
187
+ restrictLayoutsTo: dirname,
188
+ });
189
+
190
+ function check(err, html) {
191
+ assert.ifError(err);
192
+ assert.equal('<sub>sub</sub>', H.stripWs(html));
193
+ done();
194
+ }
195
+
196
+ var options = {
197
+ cache: true,
198
+ layout: 'layouts/sub/child',
199
+ settings: { views: dirname + '/views' },
200
+ };
201
+ var result = render(dirname + '/views/sub/sub.hbs', options, check);
202
+ });
203
+ });
204
+
205
+ describe('issue-49', function () {
206
+ var dirname = path.join(__dirname, 'issues/49');
207
+
208
+ it('should report filename with error', function (done) {
209
+ var hb = hbs.create();
210
+ var render = hb.express3({
211
+ restrictLayoutsTo: dirname,
212
+ });
213
+ var locals = H.createLocals('express3', dirname, {});
214
+ render(dirname + '/error.hbs', locals, function (err, html) {
215
+ assert(err.stack.indexOf('[error.hbs]') > 0);
216
+ done();
217
+ });
218
+ });
219
+
220
+ it('should report relative filename with error', function (done) {
221
+ var hb = hbs.create();
222
+ var render = hb.express3({
223
+ restrictLayoutsTo: dirname,
224
+ });
225
+ var locals = H.createLocals('express3', dirname, {});
226
+ render(dirname + '/front/error.hbs', locals, function (err, html) {
227
+ assert(err.stack.indexOf('[front/error.hbs]') > 0);
228
+ done();
229
+ });
230
+ });
231
+
232
+ it('should report filename with partial error', function (done) {
233
+ var hb = hbs.create();
234
+ var render = hb.express3({
235
+ partialsDir: dirname + '/partials',
236
+ restrictLayoutsTo: dirname,
237
+ });
238
+ var locals = H.createLocals('express3', dirname, {});
239
+ render(dirname + '/partial.hbs', locals, function (err, html) {
240
+ assert(err.stack.indexOf('[partial.hbs]') > 0);
241
+ done();
242
+ });
243
+ });
244
+
245
+ it('should report filename with layout error', function (done) {
246
+ var hb = hbs.create();
247
+ var render = hb.express3({
248
+ partialsDir: dirname + '/partials',
249
+ restrictLayoutsTo: dirname,
250
+ });
251
+ var locals = H.createLocals('express3', dirname, {});
252
+ render(dirname + '/index.hbs', locals, function (err, html) {
253
+ assert(err.stack.indexOf('[layouts/default.hbs]') > 0);
254
+ done();
255
+ });
256
+ });
257
+ });
258
+
259
+ describe('issue-53', function () {
260
+ var dirname = path.join(__dirname, 'issues/53');
261
+
262
+ it('should use block with async helpers', function (done) {
263
+ var hb = hbs.create();
264
+ var res = 0;
265
+ hb.registerAsyncHelper('weird', function (_, resultcb) {
266
+ setTimeout(function () {
267
+ resultcb(++res);
268
+ }, 1);
269
+ });
270
+ var render = hb.express3({
271
+ restrictLayoutsTo: dirname,
272
+ });
273
+ var locals = H.createLocals('express3', dirname, {});
274
+ render(dirname + '/index.hbs', locals, function (err, html) {
275
+ assert.ifError(err);
276
+ assert.ok(html.indexOf('__aSyNcId_') < 0);
277
+ done();
278
+ });
279
+ });
280
+ });
281
+
282
+ describe('issue-59', function () {
283
+ var dirname = __dirname + '/issues/59';
284
+ it('should escape or not', function (done) {
285
+ var hb = hbs.create();
286
+
287
+ function async(s, cb) {
288
+ cb('<strong>' + s + '</strong>');
289
+ }
290
+
291
+ hb.registerAsyncHelper('async', async);
292
+
293
+ var render = hb.express3({
294
+ viewsDir: dirname,
295
+ restrictLayoutsTo: dirname,
296
+ });
297
+ var locals = H.createLocals('express3', dirname);
298
+
299
+ render(dirname + '/index.hbs', locals, function (err, html) {
300
+ assert.equal(H.stripWs(html), '&lt;strong&gt;foo&lt;/strong&gt;<strong>foo</strong>');
301
+ done();
302
+ });
303
+ });
304
+ it('should not escape SafeString', function (done) {
305
+ var hb = hbs.create();
306
+
307
+ function async(s, cb) {
308
+ cb(new hb.SafeString('<em>' + s + '</em>'));
309
+ }
310
+
311
+ hb.registerAsyncHelper('async', async);
312
+
313
+ var render = hb.express3({
314
+ viewsDir: dirname,
315
+ restrictLayoutsTo: dirname,
316
+ });
317
+ var locals = H.createLocals('express3', dirname);
318
+
319
+ render(dirname + '/index.hbs', locals, function (err, html) {
320
+ assert.equal(H.stripWs(html), '<em>foo</em><em>foo</em>');
321
+ done();
322
+ });
323
+ });
324
+ });
325
+
326
+ describe('issue-73', function () {
327
+ var dirname = path.join(__dirname, 'issues/73');
328
+ it('should allow compile options', function (done) {
329
+ var hb = hbs.create();
330
+ var render = hb.express3({
331
+ viewsDir: dirname,
332
+ partialsDir: dirname + '/partials',
333
+ restrictLayoutsTo: dirname,
334
+ onCompile: function (eh, source, filename) {
335
+ var options;
336
+ if (filename && filename.indexOf('partials')) {
337
+ options = { preventIndent: true };
338
+ }
339
+ return eh.handlebars.compile(source, options);
340
+ },
341
+ });
342
+
343
+ var locals = H.createLocals('express3', dirname);
344
+ render(dirname + '/index.hbs', locals, function (err, html) {
345
+ if (err) return console.log('error', err);
346
+
347
+ assert.ifError(err);
348
+ assert.ok(html.match(/^Hello/m));
349
+ assert.ok(html.match(/^second line/m));
350
+ done();
351
+ });
352
+ });
353
+ });
354
+
355
+ describe('issue-62', function () {
356
+ var dirname = path.join(__dirname, 'issues/62');
357
+
358
+ it('should provide options for async helpers', function (done) {
359
+ var hb = hbs.create();
360
+
361
+ function async(c, o, cb) {
362
+ if (o.hash.type === 'em') {
363
+ cb('<em>' + c + '</em>');
364
+ } else {
365
+ cb('<strong>' + c + '</strong>');
366
+ }
367
+ }
368
+
369
+ hb.registerAsyncHelper('async', async);
370
+
371
+ var render = hb.express3({
372
+ viewsDir: dirname,
373
+ restrictLayoutsTo: dirname,
374
+ });
375
+ var locals = H.createLocals('express3', dirname);
376
+
377
+ render(dirname + '/basic.hbs', locals, function (err, html) {
378
+ assert.equal(H.stripWs(html), '&lt;strong&gt;foo&lt;/strong&gt;&lt;em&gt;foo&lt;/em&gt;');
379
+ done();
380
+ });
381
+ });
382
+
383
+ it('should allow for block async helpers', function (done) {
384
+ var hb = hbs.create();
385
+
386
+ function async(c, o, cb) {
387
+ var self = this;
388
+ self.output = c;
389
+
390
+ if (o.hash.inverse === 'true') {
391
+ cb(o.inverse(self));
392
+ } else {
393
+ cb(o.fn(self));
394
+ }
395
+ }
396
+
397
+ hb.registerAsyncHelper('async', async);
398
+
399
+ var render = hb.express3({
400
+ viewsDir: dirname,
401
+ restrictLayoutsTo: dirname,
402
+ });
403
+ var locals = H.createLocals('express3', dirname);
404
+
405
+ render(dirname + '/block.hbs', locals, function (err, html) {
406
+ assert.equal(H.stripWs(html), '<p>GoodbyeWorld</p><p>HelloHandlebars</p>');
407
+ done();
408
+ });
409
+ });
410
+ });
411
+
412
+ describe('issue-76', function () {
413
+ var dirname = path.join(__dirname, 'issues/76');
414
+
415
+ it('should allow cachePartials to be called independently of render', function (done) {
416
+ var hb = hbs.create();
417
+
418
+ var render = hb.express3({
419
+ partialsDir: dirname,
420
+ restrictLayoutsTo: dirname,
421
+ });
422
+
423
+ hb.cachePartials(function (err) {
424
+ assert.ifError(err);
425
+ assert.ok(true);
426
+ done();
427
+ });
428
+ });
429
+ });
430
+
431
+ describe('issue-84', function () {
432
+ var dirname = path.join(__dirname, 'issues/84');
433
+
434
+ it('should render deeply nested partials', function (done) {
435
+ var render = hbs.create().express3({
436
+ partialsDir: [dirname + '/partials'],
437
+ restrictLayoutsTo: dirname,
438
+ });
439
+
440
+ function check(err, html) {
441
+ if (err) {
442
+ done(err);
443
+ }
444
+ assert.equal('<div>Testing3levelsdown</div>', H.stripWs(html));
445
+ done();
446
+ }
447
+
448
+ render(dirname + '/index.hbs', { cache: true, settings: { views: dirname + '/views' } }, check);
449
+ });
450
+ });
451
+
452
+ describe('issue-144', function () {
453
+ var dirname = path.join(__dirname, 'issues/144');
454
+
455
+ it("should repalce with async helpers even special string like $'", function (done) {
456
+ var hb = hbs.create();
457
+ hb.registerAsyncHelper('special_string', function (_, resultcb) {
458
+ setTimeout(function () {
459
+ resultcb(new hbs.SafeString("<p><code>'$example$'</code> abcd</p>"));
460
+ }, 1);
461
+ });
462
+ var render = hb.express3({
463
+ restrictLayoutsTo: dirname,
464
+ });
465
+ var locals = H.createLocals('express3', dirname, {});
466
+ render(dirname + '/index.hbs', locals, function (err, html) {
467
+ assert.equal("<div><p><code>'$example$'</code> abcd</p></div>\n", html);
468
+ done();
469
+ });
470
+ });
471
+ });
472
+
473
+ describe('issue-153', function () {
474
+ var dirname = path.join(__dirname, 'issues/153');
475
+ it('should concat contentFor blocks with newline', function (done) {
476
+ var check = function (err, html) {
477
+ if (err) {
478
+ done(err);
479
+ }
480
+ assert.equal('1\n2', html.trim());
481
+ done();
482
+ };
483
+ var hb = hbs.create();
484
+ var render = hb.express3({
485
+ restrictLayoutsTo: dirname,
486
+ });
487
+ var locals = H.createLocals('express3', dirname, {});
488
+ render(dirname + '/index.hbs', locals, check);
489
+ });
490
+ });
@@ -0,0 +1,116 @@
1
+ var request = require('supertest');
2
+ var assert = require('assert');
3
+ var path = require('path');
4
+ var hbs = require('..');
5
+
6
+ function stripWs(s) {
7
+ return s.replace(/\s+/g, '');
8
+ }
9
+
10
+ function createLocals(which, viewsDir, locals) {
11
+ if (!locals) locals = {};
12
+ var opts = {};
13
+ if (which === 'express3') {
14
+ opts.settings = {
15
+ views: viewsDir,
16
+ };
17
+ opts.cache = process.env.NODE_ENV === 'production';
18
+ opts.settings.views = viewsDir;
19
+ for (var k in locals) {
20
+ if (!locals.hasOwnProperty(k)) continue;
21
+ opts[k] = locals[k];
22
+ }
23
+ }
24
+ return opts;
25
+ }
26
+
27
+ describe('layouts', function () {
28
+ var app;
29
+
30
+ beforeEach(function () {
31
+ var example = require('../example/app');
32
+ app = example.create(hbs.create());
33
+ });
34
+
35
+ describe('layoutsDir', function () {
36
+ var app;
37
+
38
+ beforeEach(function () {
39
+ app = require('../example/app-layoutsDir');
40
+ });
41
+
42
+ it('should render layout declared in markup', function (done) {
43
+ request(app)
44
+ .get('/fruits')
45
+ .expect(/DECLARATIVE LAYOUT/, done);
46
+ });
47
+
48
+ it('should allow specifying layout in locals without dir', function (done) {
49
+ request(app)
50
+ .get('/veggies')
51
+ .expect(/PROGRAMMATIC LAYOUT/, done);
52
+ });
53
+
54
+ it('should still allow specifying layout in locals with dir', function (done) {
55
+ request(app)
56
+ .get('/veggies/explicit-dir')
57
+ .expect(/PROGRAMMATIC LAYOUT/, done);
58
+ });
59
+ });
60
+
61
+ describe('options.layout', function () {
62
+ var dirname = __dirname + '/views/disableLayoutDirective';
63
+
64
+ it('should process template-specified layout without option', function (done) {
65
+ var render = hbs.create().express3({
66
+ restrictLayoutsTo: dirname,
67
+ });
68
+ var locals = createLocals('express3', dirname);
69
+
70
+ render(dirname + '/index.hbs', locals, function (err, html) {
71
+ assert.equal('<dld>dld</dld>', stripWs(html));
72
+ done();
73
+ });
74
+ });
75
+
76
+ it('should allow options.layout to be specified', function (done) {
77
+ var render = hbs.create().express3({
78
+ restrictLayoutsTo: dirname,
79
+ });
80
+ var locals = createLocals('express3', dirname, { layout: 'layouts/default' });
81
+
82
+ render(dirname + '/aside.hbs', locals, function (err, html) {
83
+ assert.equal('<dld>aside</dld>', stripWs(html));
84
+ done();
85
+ });
86
+ });
87
+
88
+ it('should error when using a layout outside of the restrictLayoutsTo', function (done) {
89
+ var render = hbs.create().express3({
90
+ restrictLayoutsTo: path.resolve(path.join(__dirname, '../')),
91
+ });
92
+ var locals = createLocals('express3', dirname, {
93
+ layout: '/Users/egg/Code/Ghost/ghost/core/package.json',
94
+ });
95
+
96
+ render(dirname + '/aside.hbs', locals, function (err, html) {
97
+ if (!err) {
98
+ return done(new Error('We expect an error when reading'));
99
+ }
100
+ return done();
101
+ });
102
+ });
103
+
104
+ it('should not process template-specified layout when options.layout is falsy', function (done) {
105
+ var render = hbs.create().express3({
106
+ restrictLayoutsTo: dirname,
107
+ });
108
+ var locals = createLocals('express3', dirname, { layout: false });
109
+
110
+ render(dirname + '/index.hbs', locals, function (err, html) {
111
+ assert.equal('dld', stripWs(html));
112
+ done();
113
+ });
114
+ });
115
+ });
116
+ });
@@ -0,0 +1 @@
1
+ {{_templateOptions.data.greeting}} {{_templateOptions.data.firstName}} {{_templateOptions.data.lastName}}
@@ -0,0 +1 @@
1
+ {{@greeting}} {{@firstName}} {{@lastName}}