gina 0.1.6-alpha.12 → 0.1.6-alpha.120

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 (390) hide show
  1. package/LICENSE +1 -1
  2. package/README-4Contributors.md +14 -8
  3. package/README.md +4 -4
  4. package/bin/cli +16 -2
  5. package/bin/gina +29 -1
  6. package/framework/{v0.1.6-alpha.12/lib/inherits → v0.1.6-alpha.120}/LICENSE +1 -1
  7. package/framework/v0.1.6-alpha.120/VERSION +1 -0
  8. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/plugin/README.md +1 -0
  9. package/framework/v0.1.6-alpha.120/core/asset/plugin/dist/vendor/gina/css/gina.min.css.map +1 -0
  10. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/plugin/dist/vendor/gina/html/toolbar.html +1 -1
  11. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/plugin/dist/vendor/gina/js/gina.js +617 -233
  12. package/framework/v0.1.6-alpha.120/core/asset/plugin/dist/vendor/gina/js/gina.min.js +778 -0
  13. package/framework/v0.1.6-alpha.120/core/asset/plugin/dist/vendor/gina/js/gina.min.js.map +8 -0
  14. package/framework/v0.1.6-alpha.120/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +8 -0
  15. package/framework/v0.1.6-alpha.120/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.map +8 -0
  16. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/config.js +157 -74
  17. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/index.js +108 -26
  18. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/connector.v4.js +124 -22
  19. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/controller/controller.js +683 -163
  20. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/controller/index.js +2 -2
  21. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/.github/workflows/ci.yml +24 -0
  22. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/.github/workflows/lint.yml +23 -0
  23. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/README.md +191 -0
  24. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/bench/bench-multipart-fields-100mb-big.js +149 -0
  25. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/bench/bench-multipart-fields-100mb-small.js +143 -0
  26. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/bench/bench-multipart-files-100mb-big.js +154 -0
  27. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/bench/bench-multipart-files-100mb-small.js +148 -0
  28. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/bench/bench-urlencoded-fields-100pairs-small.js +101 -0
  29. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/bench/bench-urlencoded-fields-900pairs-small-alt.js +84 -0
  30. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/lib/index.js +57 -0
  31. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/lib/types/multipart.js +680 -0
  32. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/lib/types/urlencoded.js +350 -0
  33. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/lib/utils.js +596 -0
  34. package/framework/v0.1.6-alpha.120/core/deps/busboy-1.6.0/package.json +22 -0
  35. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/.travis.yml +4 -0
  36. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/LICENSE +21 -0
  37. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/bool.js +10 -0
  38. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/boolean_double.js +7 -0
  39. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/boolean_single.js +7 -0
  40. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/default_hash.js +8 -0
  41. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/default_singles.js +7 -0
  42. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/divide.js +8 -0
  43. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/line_count.js +20 -0
  44. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/line_count_options.js +29 -0
  45. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/line_count_wrap.js +29 -0
  46. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/nonopt.js +4 -0
  47. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/reflect.js +2 -0
  48. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/short.js +3 -0
  49. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/string.js +11 -0
  50. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/usage-options.js +19 -0
  51. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/example/xup.js +10 -0
  52. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/index.js +343 -0
  53. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/package.json +31 -0
  54. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/package.json.dist +39 -0
  55. package/framework/v0.1.6-alpha.120/core/deps/optimist-0.6.1/readme.markdown +513 -0
  56. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/HISTORY.md +498 -0
  57. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/LICENSE +7 -0
  58. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/README.md +88 -0
  59. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/bin/swig.js +161 -0
  60. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/bin/swig.js.dist +161 -0
  61. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/dist/swig.min.js +7 -0
  62. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/dist/swig.min.js.map +8 -0
  63. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/index.js +1 -0
  64. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/dateformatter.js +198 -0
  65. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/filters.js +630 -0
  66. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/lexer.js +306 -0
  67. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/loaders/filesystem.js +59 -0
  68. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/loaders/index.js +53 -0
  69. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/loaders/memory.js +63 -0
  70. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/parser.js +744 -0
  71. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/swig.js +740 -0
  72. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/autoescape.js +37 -0
  73. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/block.js +25 -0
  74. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/else.js +25 -0
  75. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/elseif.js +28 -0
  76. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/extends.js +19 -0
  77. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/filter.js +68 -0
  78. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/for.js +130 -0
  79. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/if.js +86 -0
  80. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/import.js +91 -0
  81. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/include.js +100 -0
  82. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/index.js +16 -0
  83. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/macro.js +79 -0
  84. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/parent.js +51 -0
  85. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/raw.js +23 -0
  86. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/set.js +109 -0
  87. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/tags/spaceless.js +42 -0
  88. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/lib/utils.js +184 -0
  89. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/package.json +57 -0
  90. package/framework/v0.1.6-alpha.120/core/deps/swig-1.4.2/package.json.dist +61 -0
  91. package/framework/v0.1.6-alpha.120/core/deps/swig-client/swig.js +5031 -0
  92. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/dev/index.js +1 -1
  93. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/dev/lib/factory.js +1 -1
  94. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/gna.js +104 -22
  95. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/index.js +3 -3
  96. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/src/make.js +1 -1
  97. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/mime.types +1 -0
  98. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/model/entity.js +5 -5
  99. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/model/index.js +30 -26
  100. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/model/template/entityFactory.js +1 -1
  101. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/model/template/index.js +1 -1
  102. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/index.js +3 -3
  103. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/file/package.json +2 -2
  104. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/intl/package.json +2 -2
  105. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/storage/package.json +2 -2
  106. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/validator/package.json +2 -2
  107. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/validator/src/form-validator.js +39 -27
  108. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/validator/src/main.js +388 -101
  109. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/router.js +92 -47
  110. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/server.isaac.js +91 -10
  111. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/server.js +317 -130
  112. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/status.codes +1 -11
  113. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/controllers/setup.js +2 -2
  114. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/command/gina.tpl +1 -1
  115. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/conf/env.json +19 -0
  116. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/conf/templates.json +4 -2
  117. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/console.js +1 -1
  118. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/context.js +29 -12
  119. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/data/package.json +2 -2
  120. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/data/src/main.js +1 -1
  121. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/dateFormat.js +1 -1
  122. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/index.js +1 -1
  123. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/json/package.json +2 -2
  124. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/json/src/main.js +6 -4
  125. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/path.js +31 -15
  126. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/plugins/package.json +2 -2
  127. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/plugins/src/api-error.js +2 -2
  128. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/plugins/src/main.js +1 -1
  129. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/task.js +2 -2
  130. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/text.js +1 -1
  131. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/archiver/package.json +2 -2
  132. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/archiver/src/main.js +11 -11
  133. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/add.js +2 -1
  134. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/start.js +21 -8
  135. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/get.js +1 -1
  136. package/framework/v0.1.6-alpha.120/lib/cmd/env/help.js +30 -0
  137. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/build.js +1 -1
  138. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/dot.js +21 -0
  139. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/init.js +18 -0
  140. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/link-node-modules.js +2 -3
  141. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/link.js +1 -0
  142. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/tail.js +28 -11
  143. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/version.js +15 -1
  144. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/helper.js +6 -2
  145. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/index.js +1 -1
  146. package/framework/v0.1.6-alpha.120/lib/cmd/minion/help.txt +18 -0
  147. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/add.js +3 -2
  148. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/build.js +4 -4
  149. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/list.js +1 -1
  150. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/protocol/list.js +71 -50
  151. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/collection/package.json +2 -2
  152. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/collection/src/main.js +20 -14
  153. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/config.js +1 -1
  154. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cron/package.json +2 -2
  155. package/framework/v0.1.6-alpha.120/lib/domain/dist/2025-03-14_13-41-20_UTC.dat +15754 -0
  156. package/framework/v0.1.6-alpha.120/lib/domain/dist/public_suffix_list.dat +15754 -0
  157. package/framework/v0.1.6-alpha.120/lib/domain/exemples/backend.js +12 -0
  158. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/domain/package.json +2 -2
  159. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/domain/src/main.js +20 -6
  160. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/generator/index.js +1 -1
  161. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/index.js +1 -1
  162. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120/lib/inherits}/LICENSE +1 -1
  163. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/inherits/package.json +2 -2
  164. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/inherits/src/main.js +1 -1
  165. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/package.json +2 -2
  166. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/containers/mq/listener.js +10 -2
  167. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/helper.js +1 -1
  168. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/main.js +1 -1
  169. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/math/index.js +1 -1
  170. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/merge/package.json +2 -2
  171. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/model.js +3 -3
  172. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/proc.js +10 -2
  173. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/routing/package.json +2 -2
  174. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/routing/src/main.js +72 -25
  175. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/session-store.js +3 -3
  176. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/swig-filters/package.json +2 -2
  177. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/swig-filters/src/main.js +70 -15
  178. package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/validator.js +2 -2
  179. package/framework/v0.1.6-alpha.120/package.json +11 -0
  180. package/package.json +3 -3
  181. package/resources/package.json.template +1 -1
  182. package/script/post_install.js +1 -1
  183. package/script/pre_install.js +1 -1
  184. package/utils/helper.js +33 -9
  185. package/framework/v0.1.6-alpha.12/VERSION +0 -1
  186. package/framework/v0.1.6-alpha.12/core/asset/plugin/dist/vendor/gina/css/gina.min.css.map +0 -1
  187. package/framework/v0.1.6-alpha.12/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -766
  188. package/framework/v0.1.6-alpha.12/core/asset/plugin/dist/vendor/gina/js/gina.min.js.map +0 -8
  189. package/framework/v0.1.6-alpha.12/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -7
  190. package/framework/v0.1.6-alpha.12/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.map +0 -8
  191. package/framework/v0.1.6-alpha.12/core/deps/busboy/.travis.yml +0 -17
  192. package/framework/v0.1.6-alpha.12/core/deps/busboy/README.md +0 -225
  193. package/framework/v0.1.6-alpha.12/core/deps/busboy/deps/encoding/encoding-indexes.js +0 -73
  194. package/framework/v0.1.6-alpha.12/core/deps/busboy/deps/encoding/encoding.js +0 -2391
  195. package/framework/v0.1.6-alpha.12/core/deps/busboy/lib/main.js +0 -89
  196. package/framework/v0.1.6-alpha.12/core/deps/busboy/lib/types/multipart.js +0 -328
  197. package/framework/v0.1.6-alpha.12/core/deps/busboy/lib/types/urlencoded.js +0 -214
  198. package/framework/v0.1.6-alpha.12/core/deps/busboy/lib/utils.js +0 -191
  199. package/framework/v0.1.6-alpha.12/core/deps/busboy/package.json +0 -69
  200. package/framework/v0.1.6-alpha.12/lib/domain/dist/public_suffix_list.dat +0 -14186
  201. package/framework/v0.1.6-alpha.12/lib/domain/exemples/backend.js +0 -0
  202. package/framework/v0.1.6-alpha.12/package.json +0 -14
  203. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/AUTHORS +0 -0
  204. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/html/nolayout.html +0 -0
  205. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/html/static.html +0 -0
  206. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/img/android-chrome-192x192.png +0 -0
  207. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/img/android-chrome-512x512.png +0 -0
  208. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/img/apple-touch-icon.png +0 -0
  209. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/img/favicon-16x16.png +0 -0
  210. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/img/favicon-32x32.png +0 -0
  211. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/img/favicon.ico +0 -0
  212. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  213. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/asset/plugin/uuid.json +0 -0
  214. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/connector.js +0 -0
  215. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  216. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  217. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/n1ql.js +0 -0
  218. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/session-store.js +0 -0
  219. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  220. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  221. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  222. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/controller/controller.framework.js +0 -0
  223. /package/framework/{v0.1.6-alpha.12/core/deps/busboy → v0.1.6-alpha.120/core/deps/busboy-1.6.0}/LICENSE +0 -0
  224. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/deps/swig-client/swig-2.0.0.min.js +0 -0
  225. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/dev/lib/class.js +0 -0
  226. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/dev/lib/tools.js +0 -0
  227. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/README.md +0 -0
  228. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/currency.json +0 -0
  229. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/dist/language/en.json +0 -0
  230. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/dist/language/fr.json +0 -0
  231. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/dist/region/en.json +0 -0
  232. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/dist/region/fr.json +0 -0
  233. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/src/resources/currency.csv +0 -0
  234. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/src/resources/region.csv +0 -0
  235. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/locales/src/resources/region.mapping.json +0 -0
  236. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/README.md +0 -0
  237. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/file/README.md +0 -0
  238. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/file/build.json +0 -0
  239. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/intl/README.md +0 -0
  240. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/intl/build.json +0 -0
  241. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/intl/src/main.js +0 -0
  242. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/storage/README.md +0 -0
  243. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/storage/build.json +0 -0
  244. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/storage/src/main.js +0 -0
  245. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/validator/README.md +0 -0
  246. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/plugins/lib/validator/build.json +0 -0
  247. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/server.express.js +0 -0
  248. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/_gitignore +0 -0
  249. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/config/app.json +0 -0
  250. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/config/routing.json +0 -0
  251. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/config/settings.json +0 -0
  252. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  253. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/config/templates.json +0 -0
  254. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  255. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  256. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle/index.js +0 -0
  257. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  258. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  259. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  260. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  261. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  262. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_public/readme.md +0 -0
  263. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  264. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  265. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  266. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  267. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  268. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/command/gina.bat.tpl +0 -0
  269. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/conf/manifest.json +0 -0
  270. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/conf/package.json +0 -0
  271. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/conf/settings.json +0 -0
  272. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/conf/statics.json +0 -0
  273. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/error/client/json/401.json +0 -0
  274. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/error/client/json/403.json +0 -0
  275. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/error/client/json/404.json +0 -0
  276. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/error/server/html/50x.html +0 -0
  277. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/error/server/json/500.json +0 -0
  278. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/error/server/json/503.json +0 -0
  279. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/core/template/extensions/logger/config.json +0 -0
  280. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/data/LICENSE +0 -0
  281. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/data/README.md +0 -0
  282. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/json/LICENSE +0 -0
  283. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/json/README.md +0 -0
  284. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/plugins/README.md +0 -0
  285. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/helpers/prototypes.js +0 -0
  286. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/archiver/README.md +0 -0
  287. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/archiver/build.json +0 -0
  288. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/archiver/src/dep/jszip.min.js +0 -0
  289. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/aliases.json +0 -0
  290. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/arguments.json +0 -0
  291. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/copy.js +0 -0
  292. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/cp.js +0 -0
  293. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/help.js +0 -0
  294. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/help.txt +0 -0
  295. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/list.js +0 -0
  296. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/remove.js +0 -0
  297. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/rename.js +0 -0
  298. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/restart.js +0 -0
  299. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/rm.js +0 -0
  300. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/status.js +0 -0
  301. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/bundle/stop.js +0 -0
  302. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/add.js +0 -0
  303. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/help.txt +0 -0
  304. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/link-dev.js +0 -0
  305. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/list.js +0 -0
  306. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/remove.js +0 -0
  307. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/rm.js +0 -0
  308. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/set.js +0 -0
  309. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/unset.js +0 -0
  310. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/env/use.js +0 -0
  311. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/get.js +0 -0
  312. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/help.js +0 -0
  313. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/help.txt +0 -0
  314. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/msg.json +0 -0
  315. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/open.js +0 -0
  316. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/restart.js +0 -0
  317. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/set.js +0 -0
  318. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/start.js +0 -0
  319. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/status.js +0 -0
  320. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/stop.js +0 -0
  321. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/framework/update.js +0 -0
  322. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/gina-dev.1.md +0 -0
  323. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/gina-framework.1.md +0 -0
  324. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/gina.1.md +0 -0
  325. /package/framework/{v0.1.6-alpha.12/lib/cmd/env → v0.1.6-alpha.120/lib/cmd/minion}/help.js +0 -0
  326. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/msg.json +0 -0
  327. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/port/help.js +0 -0
  328. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/port/help.txt +0 -0
  329. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/port/inc/scan.js +0 -0
  330. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/port/list.js +0 -0
  331. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/port/reset.js +0 -0
  332. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/port/set.js +0 -0
  333. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/arguments.json +0 -0
  334. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/help.js +0 -0
  335. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/help.txt +0 -0
  336. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/import.js +0 -0
  337. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/move.js +0 -0
  338. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/remove.js +0 -0
  339. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/rename.js +0 -0
  340. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/restart.js +0 -0
  341. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/rm.js +0 -0
  342. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/start.js +0 -0
  343. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/status.js +0 -0
  344. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/project/stop.js +0 -0
  345. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/protocol/help.js +0 -0
  346. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/protocol/help.txt +0 -0
  347. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/protocol/set.js +0 -0
  348. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/add.js +0 -0
  349. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/help.js +0 -0
  350. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/help.txt +0 -0
  351. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/link-local.js +0 -0
  352. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/link-production.js +0 -0
  353. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/list.js +0 -0
  354. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/remove.js +0 -0
  355. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/rm.js +0 -0
  356. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/scope/use.js +0 -0
  357. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cmd/view/add.js +0 -0
  358. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/collection/README.md +0 -0
  359. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/collection/build.json +0 -0
  360. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cron/README.md +0 -0
  361. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/cron/src/main.js +0 -0
  362. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/domain/LICENSE +0 -0
  363. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/domain/README.md +0 -0
  364. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/domain/exemples/frontend.html +0 -0
  365. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/inherits/README.md +0 -0
  366. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/inherits/example/inheriting_eventemitter.js +0 -0
  367. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/inherits/example/protected_inheritance.js +0 -0
  368. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/inherits/example/simple_inheritance.js +0 -0
  369. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/inherits/example/super_attribute_overridden_by_child_on_init.js +0 -0
  370. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/README.md +0 -0
  371. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/containers/default/index.js +0 -0
  372. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/containers/file/index.js +0 -0
  373. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  374. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  375. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/containers/mq/index.js +0 -0
  376. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/logger/src/containers/mq/speaker.js +0 -0
  377. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/merge/README.md +0 -0
  378. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/merge/example/merge.js +0 -0
  379. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/merge/example/merge_2_literal objects.js +0 -0
  380. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/merge/example/merge_and_preserve_first.js +0 -0
  381. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/merge/src/main.js +0 -0
  382. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/routing/README.md +0 -0
  383. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/routing/build.json +0 -0
  384. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/shell.js +0 -0
  385. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/swig-filters/README.md +0 -0
  386. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/url/README.md +0 -0
  387. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/url/index.js +0 -0
  388. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/url/mocks.json +0 -0
  389. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/url/routing.json +0 -0
  390. /package/framework/{v0.1.6-alpha.12 → v0.1.6-alpha.120}/lib/url/test.js +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /*
3
3
  * This file is part of the gina package.
4
- * Copyright (c) 2009-2023 Rhinostone <contact@gina.io>
4
+ * Copyright (c) 2009-2025 Rhinostone <contact@gina.io>
5
5
  *
6
6
  * For the full copyright and license information, please view the LICENSE
7
7
  * file that was distributed with this source code.
@@ -10,12 +10,14 @@
10
10
  //Imports.
11
11
  var fs = require('fs');
12
12
  const {promises: {readFile}} = require("fs");
13
+ const exec = require('child_process').exec;
13
14
  var util = require('util');
14
15
  var promisify = util.promisify;
15
16
  var EventEmitter = require('events').EventEmitter;
16
- var zlib = require('zlib');
17
+ var zlib = require('zlib'); // Included with NodeJS
17
18
 
18
- //var dns = require('dns');
19
+ const { Resolver } = require('node:dns').promises;
20
+ const resolver = new Resolver();
19
21
  // var tls = require('tls');
20
22
  // var crypto = require('crypto');
21
23
 
@@ -25,9 +27,10 @@ var inherits = lib.inherits;
25
27
  var console = lib.logger;
26
28
  var Collection = lib.Collection;
27
29
  var routingLib = lib.routing;
28
- var swig = require('swig');
29
- // Swig 2
30
- // var swig = require('./../deps/swig-client/swig-2.0.0.min.js');
30
+ var Domain = lib.Domain;
31
+ var domainLib = new Domain();
32
+ var swig = require('./../deps/swig-1.4.2');
33
+ const { type } = require('node:os');
31
34
  var SwigFilters = lib.SwigFilters;
32
35
  var statusCodes = requireJSON( _( getPath('gina').core + '/status.codes') );
33
36
 
@@ -68,24 +71,19 @@ function SuperController(options) {
68
71
  var init = function() {
69
72
 
70
73
  if ( typeof(SuperController.initialized) != 'undefined' ) {
71
- return getInstance()
72
- } else {
73
-
74
- SuperController.instance = self;
75
-
76
-
77
- if (local.options) {
78
- SuperController.instance._options = local.options;
79
- }
80
-
81
- SuperController.initialized = true;
74
+ return getInstance();
75
+ }
82
76
 
77
+ SuperController.instance = self;
78
+ if (local.options) {
79
+ SuperController.instance._options = local.options;
83
80
  }
81
+ SuperController.initialized = true;
84
82
  }
85
83
 
86
84
  var getInstance = function() {
87
85
  local.options = SuperController.instance._options = options;
88
- // 2022-03-07 Fix for none-developpement environnements (without cache)
86
+ // Fixed on 2022-03-07 for none-developpement environnements (without cache)
89
87
  self._options = local.options;
90
88
 
91
89
  return SuperController.instance;
@@ -240,12 +238,12 @@ function SuperController(options) {
240
238
 
241
239
  if ( /^:/.test(value) ) {
242
240
  str = 'page.view.params.'+ key + '.';
243
- set(str.substr(0, str.length-1), req.params[value.substr(1)]);
241
+ set(str.substring(0, str.length-1), req.params[value.substring(1)]);
244
242
  } else if (/^(file|title)$/.test(key)) {
245
243
  str = 'page.view.'+ key + '.';
246
- set(str.substr(0, str.length-1), value);
244
+ set(str.substring(0, str.length-1), value);
247
245
  } else {
248
- set(str.substr(0, str.length-1), value)
246
+ set(str.substring(0, str.length-1), value)
249
247
  }
250
248
 
251
249
  str = 'page.'
@@ -322,10 +320,24 @@ function SuperController(options) {
322
320
 
323
321
  var ctx = getContext('gina');
324
322
  // new declaration && overrides
323
+ var arch = process.arch;
324
+ switch (process.arch) {
325
+ case 'x64':
326
+ arch = 'amd64'
327
+ break;
328
+ case 'armv7l':
329
+ arch = 'armhf'
330
+ break;
331
+ case 'x86':
332
+ arch = 'i386'
333
+ break;
334
+ default:
335
+ break;
336
+ }
325
337
  var version = {
326
338
  "number" : ctx.version,
327
339
  "platform" : process.platform,
328
- "arch" : process.arch,
340
+ "arch" : arch,
329
341
  "nodejs" : process.versions.node,
330
342
  "middleware" : ctx.middleware
331
343
  };
@@ -336,15 +348,124 @@ function SuperController(options) {
336
348
  set('page.environment.gina pid', GINA_PID);
337
349
  set('page.environment.nodejs', version.nodejs +' '+ version.platform +' '+ version.arch);
338
350
  set('page.environment.engine', options.conf.server.engine);//version.middleware
351
+ set('page.environment.uvThreadpoolSize', process.env.UV_THREADPOOL_SIZE);
339
352
  set('page.environment.env', process.env.NODE_ENV);
340
- set('page.environment.envIsDev', self.isCacheless());
353
+ set('page.environment.envIsDev', /^true$/i.test(process.env.NODE_ENV_IS_DEV) );
341
354
  set('page.environment.scope', process.env.NODE_SCOPE);
342
355
  set('page.environment.scopeIsLocal', /^true$/i.test(process.env.NODE_SCOPE_IS_LOCAL) );
343
356
  set('page.environment.scopeIsProduction', /^true$/i.test(process.env.NODE_SCOPE_IS_PRODUCTION) );
344
357
  set('page.environment.date.now', new Date().format("isoDateTime"));
358
+ set('page.environment.isCacheless', self.isCacheless());
359
+
360
+ // var requestPort = req.headers.port || req.headers[':port'];
361
+ // var isProxyHost = (
362
+ // typeof(req.headers.host) != 'undefined'
363
+ // && typeof(requestPort) != 'undefined'
364
+ // && /^(80|443)$/.test(requestPort)
365
+ // && local.options.conf.server.scheme +'://'+ req.headers.host +':'+ requestPort != local.options.conf.hostname.replace(/\:\d+$/, '') +':'+ local.options.conf.server.port
366
+ // ||
367
+ // typeof(req.headers[':authority']) != 'undefined'
368
+ // && local.options.conf.server.scheme +'://'+ req.headers[':authority'] != local.options.conf.hostname
369
+ // ||
370
+ // typeof(req.headers.host) != 'undefined'
371
+ // && typeof(requestPort) != 'undefined'
372
+ // && /^(80|443)$/.test(requestPort)
373
+ // && req.headers.host == local.options.conf.host
374
+ // ||
375
+ // typeof(req.headers['x-nginx-proxy']) != 'undefined'
376
+ // && /^true$/i.test(req.headers['x-nginx-proxy'])
377
+ // ) ? true : false;
378
+ // setContext('isProxyHost', isProxyHost);
379
+ var isProxyHost = getContext('isProxyHost') || false;
380
+ set('page.environment.isProxyHost', isProxyHost);
381
+ if ( /^true$/.test(isProxyHost) ) {
382
+ set('page.environment.proxyHost', process.gina.PROXY_HOST);
383
+ set('page.environment.proxyHostname', process.gina.PROXY_HOSTNAME);
384
+ }
385
+
386
+ var _config = ctx.config.envConf[options.conf.bundle][process.env.NODE_ENV];
387
+ // by default
388
+ var hostname = _config.hostname + _config.server.webroot;
389
+ var scheme = hostname.match(/^(https|http)/)[0];
390
+ var requestPort = (local.req.headers.port||local.req.headers[':port']);
391
+
392
+ var hostPort = hostname.match(/(\:d+\/|\:\d+)$/);
393
+ hostPort = (hostPort) ? ~~(hostPort[0].replace(/\:/g, '')) : _config.port[_config.server.protocol][_config.server.scheme];
394
+ // Linking bundle B from bundle A wihtout proxy
395
+ var isSpecialCase = (
396
+ getContext('bundle') != _config.bundle
397
+ && requestPort != hostPort
398
+ && local.req.headers[':host'] != process.gina.PROXY_HOST
399
+ ) ? true : false;
400
+
401
+ if (isSpecialCase) {
402
+ hostname = _config.hostname;
403
+ }
404
+
405
+ // if (
406
+ // isProxyHost
407
+ // && !isSpecialCase
408
+ // ) {
409
+ // // Rewrite hostname vs req.headers.host
410
+ // hostname = scheme + '://'+ (local.req.headers.host||local.req.headers[':host']);
411
+
412
+ // if (
413
+ // !/^(80|443)$/.test(requestPort)
414
+ // && !new RegExp(requestPort+'$').test(hostname)
415
+ // ) {
416
+ // hostname += ':'+ requestPort;
417
+ // }
418
+ // }
419
+
420
+ set('page.environment.hostname', hostname);
421
+ // Updating _config.rootDomain - 2024/04/15
422
+ // _config.rootDomain = domainLib.getRootDomain(hostname).value;
423
+
424
+
425
+ set('page.environment.rootDomain', _config.rootDomain);
426
+ set('page.environment.webroot', options.conf.server.webroot);
427
+
428
+ if ( typeof(ctx.config.envConf._isRoutingUpdateNeeded) == 'undefined') {
429
+ ctx.config.envConf._isRoutingUpdateNeeded = false;
430
+ }
431
+
432
+ if (
433
+ typeof(ctx.config.envConf._proxyHostname) == 'undefined'
434
+ ||
435
+ hostname != ctx.config.envConf._proxyHostname
436
+ ) {
437
+ ctx.config.envConf._proxyHostname = (isProxyHost) ? hostname : null;
438
+ ctx.config.envConf._isRoutingUpdateNeeded = true;
439
+ }
440
+
441
+ if ( typeof(ctx.config.envConf._routingCloned) == 'undefined' ) {
442
+ ctx.config.envConf._routingCloned = JSON.clone(ctx.config.envConf.routing);
443
+ }
444
+
445
+ var routing = local.options.conf.routing = ctx.config.envConf._routingCloned; // all routes
446
+ if ( /^true$/i.test(ctx.config.envConf._isRoutingUpdateNeeded) ) {
345
447
 
448
+ for (let r in ctx.config.envConf.routing) {
449
+ if ( isProxyHost ) {
450
+ local.options.conf.routing[r].host = hostname.replace(/^(https|http)\:\/\//, '');
451
+ local.options.conf.routing[r].hostname = hostname;
452
+ let scheme = hostname.match(/^(https|http)/)[0];
453
+ local.options.conf.routing[r].hostname = scheme + '://'+ (local.req.headers.host||local.req.headers[':host']);
454
+ let requestPort = (local.req.headers.port||local.req.headers[':port']);
455
+ if (
456
+ !/^(80|443)$/.test(requestPort)
457
+ && !new RegExp(requestPort+'$').test(local.options.conf.routing[r].hostname)
458
+ ) {
459
+ local.options.conf.routing[r].hostname += ':'+ requestPort
460
+ }
461
+ continue;
462
+ }
463
+ local.options.conf.routing[r].host = ctx.config.envConf.routing[r].host;
464
+ local.options.conf.routing[r].hostname = ctx.config.envConf.routing[r].hostname;
465
+ }
466
+ ctx.config.envConf._isRoutingUpdateNeeded = false;
346
467
 
347
- var routing = local.options.conf.routing = ctx.config.envConf.routing; // all routes
468
+ }
348
469
  set('page.environment.routing', encodeRFC5987ValueChars(JSON.stringify(routing))); // export for GFF
349
470
  //reverseRouting
350
471
  var reverseRouting = local.options.conf.reverseRouting = ctx.config.envConf.reverseRouting; // all routes
@@ -354,9 +475,8 @@ function SuperController(options) {
354
475
  set('page.environment.forms', encodeRFC5987ValueChars(JSON.stringify(forms))); // export for GFF
355
476
  set('page.forms', options.conf.content.forms);
356
477
 
357
- set('page.environment.hostname', ctx.config.envConf[options.conf.bundle][process.env.NODE_ENV].hostname);
358
- set('page.environment.rootDomain', ctx.config.envConf[options.conf.bundle][process.env.NODE_ENV].rootDomain);
359
- set('page.environment.webroot', options.conf.server.webroot);
478
+
479
+
360
480
  set('page.environment.bundle', options.conf.bundle);
361
481
  set('page.environment.project', options.conf.projectName);
362
482
  set('page.environment.protocol', options.conf.server.protocol);
@@ -426,7 +546,7 @@ function SuperController(options) {
426
546
  // user locale
427
547
  options.conf.locale = new Collection(userLocales).findOne({ short: userCountryCode }) || {};
428
548
 
429
- //set('page.date.now', new Date().format("isoDateTime"));
549
+ // current date
430
550
  if ( typeof(options.conf.locale) == 'undefined' || !options.conf.locale ) {
431
551
  options.conf.locale = {}
432
552
  }
@@ -437,11 +557,6 @@ function SuperController(options) {
437
557
  set('page.view.lang', userCulture);
438
558
  }
439
559
 
440
- if ( !getContext('isProxyHost') ) {
441
- var isProxyHost = ( typeof(req.headers.host) != 'undefined' && local.options.conf.server.scheme +'://'+ req.headers.host != local.options.conf.hostname || typeof(req.headers[':authority']) != 'undefined' && local.options.conf.server.scheme +'://'+ req.headers[':authority'] != local.options.conf.hostname ) ? true : false;
442
- setContext('isProxyHost', isProxyHost);
443
- isProxyHost = null;
444
- }
445
560
 
446
561
  //TODO - detect when to use swig
447
562
  var dir = null;
@@ -451,7 +566,7 @@ function SuperController(options) {
451
566
  var swigOptions = {
452
567
  autoescape : ( typeof(local.options.autoescape) != 'undefined') ? local.options.autoescape : false,
453
568
  // `memory` is no working yet ... advanced rendering setup required
454
- // cache : (local.options.cacheless) ? false : 'memory'
569
+ // cache : (local.options.isCacheless) ? false : 'memory'
455
570
  cache : false
456
571
  };
457
572
  if (dir) {
@@ -498,7 +613,7 @@ function SuperController(options) {
498
613
  * Extend default filters
499
614
  * - length
500
615
  *
501
- * Avilable filters:
616
+ * Available filters:
502
617
  * - getWebroot()
503
618
  * - getUrl()
504
619
  *
@@ -839,12 +954,28 @@ function SuperController(options) {
839
954
  return;
840
955
  }
841
956
 
957
+ var localRequestPort = local.req.headers.port || local.req.headers[':port'];
842
958
  var isProxyHost = (
843
959
  typeof(local.req.headers.host) != 'undefined'
844
- && localOptions.conf.server.scheme +'://'+ local.req.headers.host != localOptions.conf.hostname
845
- || typeof(local.req.headers[':authority']) != 'undefined'
846
- && localOptions.conf.server.scheme +'://'+ local.req.headers[':authority'] != localOptions.conf.hostname
960
+ && typeof(localRequestPort) != 'undefined'
961
+ && /^(80|443)$/.test(localRequestPort)
962
+ && localOptions.conf.server.scheme +'://'+ local.req.headers.host+':'+ localRequestPort != localOptions.conf.hostname.replace(/\:\d+$/, '') +':'+ localOptions.conf.server.port
963
+ ||
964
+ typeof(local.req.headers[':authority']) != 'undefined'
965
+ && localOptions.conf.server.scheme +'://'+ local.req.headers[':authority'] != localOptions.conf.hostname
966
+ ||
967
+ typeof(local.req.headers.host) != 'undefined'
968
+ && typeof(localRequestPort) != 'undefined'
969
+ && /^(80|443)$/.test(localRequestPort)
970
+ && local.req.headers.host == localOptions.conf.host
971
+ ||
972
+ typeof(local.req.headers['x-nginx-proxy']) != 'undefined'
973
+ && /^true$/i.test(local.req.headers['x-nginx-proxy'])
974
+ ||
975
+ typeof(process.gina.PROXY_HOSTNAME) != 'undefined'
847
976
  ) ? true : false;
977
+
978
+
848
979
  // setup swig default filters
849
980
  var filters = SwigFilters({
850
981
  options : JSON.clone(localOptions),
@@ -883,6 +1014,7 @@ function SuperController(options) {
883
1014
  , XHRData = null
884
1015
  , XHRView = null
885
1016
  , isDeferModeEnabled = null
1017
+ , hasExternalsPlugins = null
886
1018
  , viewInfos = null
887
1019
  , filename = null
888
1020
  , isWithSwigLayout = null
@@ -898,7 +1030,9 @@ function SuperController(options) {
898
1030
  if (isWithoutLayout) {
899
1031
  data.page.view.layout = layoutPath;
900
1032
  }
901
- } else { // without layout case
1033
+ }
1034
+ // without layout case
1035
+ else {
902
1036
 
903
1037
  // by default
904
1038
  layoutPath = localOptions.template.layout;
@@ -926,10 +1060,8 @@ function SuperController(options) {
926
1060
  self.throwError(err);
927
1061
  return;
928
1062
  }
929
-
930
1063
  }
931
1064
 
932
-
933
1065
  var isLoadingPartial = false;
934
1066
  try {
935
1067
  assets = {assets:"${assets}"};
@@ -1023,6 +1155,7 @@ function SuperController(options) {
1023
1155
  // }
1024
1156
 
1025
1157
  isDeferModeEnabled = localOptions.template.javascriptsDeferEnabled || localOptions.conf.content.templates._common.javascriptsDeferEnabled || false;
1158
+ hasExternalsPlugins = (localOptions.template.externalPlugins.length > 0) ? true : false;
1026
1159
 
1027
1160
  // iframe case - without HTML TAG
1028
1161
  if (!self.isXMLRequest() && !/\<html/.test(layout) ) {
@@ -1092,8 +1225,8 @@ function SuperController(options) {
1092
1225
  + '{%- set userDataInspector.view.scripts = "ignored-by-toolbar" -%}'
1093
1226
  + '{%- set userDataInspector.view.stylesheets = "ignored-by-toolbar" -%}'
1094
1227
  + '{%- set userDataInspector.view.assets = '+ JSON.stringify(assets) +' -%}'
1095
- + '{%- include "'+ getPath('gina').core +'/asset/plugin/dist/vendor/gina/html/toolbar.html" with { gina: ginaDataInspector, user: userDataInspector } -%}'// jshint ignore:line
1096
1228
  + '{# END Gina Toolbar #}'
1229
+ + '{%- include "'+ getPath('gina').core +'/asset/plugin/dist/vendor/gina/html/toolbar.html" with { gina: ginaDataInspector, user: userDataInspector } -%}'// jshint ignore:line
1097
1230
  ;
1098
1231
 
1099
1232
 
@@ -1124,10 +1257,18 @@ function SuperController(options) {
1124
1257
  if (isLoadingPartial) {
1125
1258
  layout += '\t{{ page.view.scripts }}';
1126
1259
  } else {
1260
+ // placed in the HEAD
1127
1261
  if ( isDeferModeEnabled ) {
1128
1262
  layout = layout.replace(/\<\/head\>/i, '\t{{ page.view.scripts }}\n\t</head>');
1129
- } else { // placed in the BODY
1263
+ }
1264
+ // placed in the BODY
1265
+ else {
1130
1266
  layout = layout.replace(/\<\/body\>/i, '\t{{ page.view.scripts }}\n</body>');
1267
+ if (hasExternalsPlugins) {
1268
+ for (let i =0, len = localOptions.template.externalPlugins.length; i<len; i++) {
1269
+ layout = layout.replace(/\<\/head\>/i, '\t'+ localOptions.template.externalPlugins +'\n</head>');
1270
+ }
1271
+ }
1131
1272
  }
1132
1273
  }
1133
1274
 
@@ -1173,6 +1314,11 @@ function SuperController(options) {
1173
1314
  // layout = layout.replace(/\<\/head\>/i, '\t{{ page.view.scripts }}\n\t</head>');
1174
1315
  // } else { // placed in the BODY
1175
1316
  // layout = layout.replace(/\<\/body\>/i, '\t{{ page.view.scripts }}\n</body>');
1317
+ // if (hasExternalsPlugins) {
1318
+ // for (let i =0, len = localOptions.template.externalPlugins.length; i<len; i++) {
1319
+ // layout = layout.replace(/\<\/head\>/i, '\t'+ localOptions.template.externalPlugins +'\n</head>');
1320
+ // }
1321
+ // }
1176
1322
  // }
1177
1323
  // }
1178
1324
 
@@ -1189,11 +1335,18 @@ function SuperController(options) {
1189
1335
  layout += '\t'+ localOptions.template.ginaLoader +'\n';
1190
1336
  }
1191
1337
  } else {
1338
+ // placed in the HEAD
1192
1339
  if ( isDeferModeEnabled && /\<\/head\>/i.test(layout) ) { // placed in the HEAD
1193
1340
  layout = layout.replace(/\<\/head\>/i, '\t{{ page.view.scripts }}\n\t</head>');
1194
-
1195
- } else { // placed in the BODY
1341
+ }
1342
+ // placed in the BODY
1343
+ else {
1196
1344
  layout = layout.replace(/\<\/body\>/i, '\t{{ page.view.scripts }}\n</body>');
1345
+ if (hasExternalsPlugins) {
1346
+ for (let i =0, len = localOptions.template.externalPlugins.length; i<len; i++) {
1347
+ layout = layout.replace(/\<\/head\>/i, '\t'+ localOptions.template.externalPlugins +'\n</head>');
1348
+ }
1349
+ }
1197
1350
  }
1198
1351
  // ginaLoader cannot be deferred
1199
1352
  if ( !localOptions.template.javascriptsExcluded || localOptions.template.javascriptsExcluded != '**' ) {
@@ -1295,6 +1448,40 @@ function SuperController(options) {
1295
1448
  ) {
1296
1449
  layout = layout.replace('{"assets":"${assets}"}', assets );
1297
1450
  }
1451
+
1452
+ if ( !self.isCacheless() ) {
1453
+ var links = local.options.template.h2Links;
1454
+ for (let l in localOptions.template.assets) {
1455
+ let link = localOptions.template.assets[l]
1456
+ if (
1457
+ /^_/.test(l)
1458
+ || typeof(link.as) == 'undefined'
1459
+ || typeof(link.as) != 'undefined'
1460
+ && link.as != 'null'
1461
+ && !link.isAvailable
1462
+ || !link.as
1463
+ ) {
1464
+ // ignoring
1465
+ continue;
1466
+ }
1467
+
1468
+ links += '<'+ l +'>; as='+ link.as +'; '
1469
+ if ( link.imagesrcset) {
1470
+ links += 'imagesrcset='+ link.imagesrcset +'; ';
1471
+ }
1472
+ if ( link.imagesizes) {
1473
+ links += 'imagesizes='+ link.imagesizes +'; ';
1474
+ }
1475
+ links += 'rel=preload,'
1476
+
1477
+ }
1478
+ if ( /\,$/.test(links) ) {
1479
+ links = links.substring(0, links.length-1);
1480
+ }
1481
+ local.res.setHeader('link', links);
1482
+ links = null;
1483
+ }
1484
+
1298
1485
  assets = null;
1299
1486
 
1300
1487
  } catch (err) {
@@ -1425,7 +1612,6 @@ function SuperController(options) {
1425
1612
  }
1426
1613
  }
1427
1614
 
1428
-
1429
1615
  // Internet Explorer override
1430
1616
  if ( /msie/i.test(request.headers['user-agent']) ) {
1431
1617
  response.setHeader('content-type', 'text/plain' + '; charset='+ local.options.conf.encoding)
@@ -1433,58 +1619,57 @@ function SuperController(options) {
1433
1619
  response.setHeader('content-type', local.options.conf.server.coreConfiguration.mime['json'] + '; charset='+ local.options.conf.encoding)
1434
1620
  }
1435
1621
 
1436
- // if ( !headersSent(response) ) {
1437
- console.info(request.method +' ['+ response.statusCode +'] '+ request.url);
1438
-
1439
-
1440
- if ( local.options.isXMLRequest && self.isWithCredentials() ) {
1622
+ console.info(request.method +' ['+ response.statusCode +'] '+ request.url);
1441
1623
 
1442
- // content length must be the right size !
1443
- var len = Buffer.byteLength(data, 'utf8') || 0;
1444
- if ( !headersSent(response) ) {
1445
- response.setHeader("content-length", len);
1446
- }
1447
-
1448
- response.write(data);
1449
1624
 
1450
- // required to close connection
1451
- setTimeout(function () {
1452
- response.end();
1453
- try {
1454
- response.headersSent = true;
1455
- } catch(err) {
1456
- // Ignoring warning
1457
- //console.warn(err);
1458
- }
1625
+ if ( local.options.isXMLRequest && self.isWithCredentials() ) {
1459
1626
 
1460
- if ( next ) {
1461
- next()
1462
- }
1627
+ // content length must be the right size !
1628
+ var len = Buffer.byteLength(data, 'utf8') || 0;
1629
+ if ( !headersSent(response) ) {
1630
+ response.setHeader("content-length", len);
1631
+ }
1463
1632
 
1464
- freeMemory([jsonObj, data, request, response, next]);
1465
- }, 200);
1633
+ response.write(data);
1466
1634
 
1467
- // force completion
1468
- return
1469
- }
1470
- // normal case
1471
- response.end(JSON.stringify(jsonObj));
1472
- if (!headersSent(response)) {
1635
+ // required to close connection
1636
+ setTimeout(function () {
1637
+ response.end();
1473
1638
  try {
1474
1639
  response.headersSent = true;
1475
1640
  } catch(err) {
1476
1641
  // Ignoring warning
1477
1642
  //console.warn(err);
1478
1643
  }
1644
+
1645
+ if ( next ) {
1646
+ next()
1647
+ }
1648
+
1649
+ freeMemory([jsonObj, data, request, response, next]);
1650
+ }, 200);
1651
+
1652
+ // force completion
1653
+ return
1654
+ }
1655
+ // normal case
1656
+ response.end(JSON.stringify(jsonObj));
1657
+ if (!headersSent(response)) {
1658
+ try {
1659
+ response.headersSent = true;
1660
+ } catch(err) {
1661
+ // Ignoring warning
1662
+ //console.warn(err);
1479
1663
  }
1480
- if ( next ) {
1481
- return next()
1482
- }
1664
+ }
1665
+ if ( next ) {
1666
+ return next()
1667
+ }
1483
1668
 
1484
- freeMemory([jsonObj, data, request, response, next]);
1669
+ freeMemory([jsonObj, data, request, response, next]);
1670
+
1671
+ return;
1485
1672
 
1486
- return;
1487
- // }
1488
1673
  } catch (err) {
1489
1674
  return self.throwError(response, 500, err);
1490
1675
  }
@@ -1577,7 +1762,7 @@ function SuperController(options) {
1577
1762
 
1578
1763
  ++_count;
1579
1764
  if (k == len-1) {
1580
- str = str.substr(0, str.length-1);
1765
+ str = str.substring(0, str.length-1);
1581
1766
  str += "\"_content_\"";
1582
1767
  for (let c = 0; c<_count; ++c) {
1583
1768
  str += "}"
@@ -1619,22 +1804,35 @@ function SuperController(options) {
1619
1804
  var authority = ( typeof(local.req.headers['x-forwarded-proto']) != 'undefined' ) ? local.req.headers['x-forwarded-proto'] : local.options.conf.server.scheme;
1620
1805
  authority += '://'+ local.req.headers.host;
1621
1806
  var useWebroot = false;
1622
- if ( !/^\/$/.test(local.options.conf.server.webroot) && local.options.conf.server.webroot.length > 0 && local.options.conf.hostname.replace(/\:\d+$/, '') == authority ) {
1807
+ if (
1808
+ !/^\/$/.test(local.options.conf.server.webroot)
1809
+ && local.options.conf.server.webroot.length > 0
1810
+ // && local.options.conf.hostname.replace(/\:\d+$/, '') == authority
1811
+ ) {
1623
1812
  useWebroot = true
1624
1813
  }
1625
1814
  authority = null;
1626
1815
 
1627
1816
  var reURL = new RegExp('^'+ local.options.conf.server.webroot);
1628
1817
 
1629
- var cssStr = '', jsStr = '';
1630
-
1818
+ var cssStr = ''
1819
+ , jsStr = ''
1820
+ ;
1631
1821
  //Get css
1632
1822
  if( viewConf.stylesheets ) {
1633
- cssStr = getNodeRes('css', viewConf.stylesheets, useWebroot, reURL)
1823
+ // cssStr = getNodeRes('css', viewConf.stylesheets, useWebroot, reURL);
1824
+ // Fixed on 2025-03-08: ordered by route, making sure that _common could all be loaded first
1825
+ var cssColl = new Collection(viewConf.stylesheets).orderBy({route: 'asc'})
1826
+ cssStr = getNodeRes('css', cssColl, useWebroot, reURL);
1827
+ cssColl = null;
1634
1828
  }
1635
1829
  //Get js
1636
1830
  if( viewConf.javascripts ) {
1637
- jsStr = getNodeRes('js', viewConf.javascripts, useWebroot, reURL)
1831
+ // jsStr = getNodeRes('js', viewConf.javascripts, useWebroot, reURL);
1832
+ // Fixed on 2025-03-08: ordered by route, making sure that _common could all be loaded first
1833
+ var jsColl = new Collection(viewConf.javascripts).orderBy({route: 'asc'})
1834
+ jsStr = getNodeRes('js', jsColl, useWebroot, reURL);
1835
+ jsColl = null;
1638
1836
  }
1639
1837
 
1640
1838
  set('page.view.stylesheets', cssStr);
@@ -1651,7 +1849,8 @@ function SuperController(options) {
1651
1849
  * @param {string} type
1652
1850
  * @param {string} resStr
1653
1851
  * @param {array} resArr
1654
- * @param {object} resObj
1852
+ * @param {boolean} useWebroot
1853
+ * @param {object} reURL - RegExp for webroot
1655
1854
  *
1656
1855
  * @returns {object} content
1657
1856
  *
@@ -1663,29 +1862,69 @@ function SuperController(options) {
1663
1862
  , rLen = resArr.length
1664
1863
  , obj = null
1665
1864
  , str = ''
1865
+ , isProxyHost = getContext('isProxyHost')
1666
1866
  , requestHost = ( /http\/2/.test(local.options.conf.server.protocol) )
1667
1867
  ? local.req.headers[':host']
1668
1868
  : local.req.headers.host
1669
1869
  , hostname = ( typeof(requestHost) != 'undefined' && local.options.conf.host != requestHost)
1670
- ? local.options.conf.server.scheme +'://'+ requestHost + ':'+ local.options.conf.server.port
1870
+ ? local.options.conf.server.scheme +'://'+ requestHost
1671
1871
  : local.options.conf.hostname
1872
+ , scheme = hostname.match(/^(https|http)/)[0]
1672
1873
  ;
1874
+ var requestPort = (local.req.headers.port||local.req.headers[':port']);
1875
+ var hostPort = local.options.conf.hostname.match(/(\:d+\/|\:\d+)$/);
1876
+ hostPort = (hostPort) ? ~~(hostPort[0].replace(/\:/g, '')) : local.options.conf.port[local.options.conf.server.protocol][local.options.conf.server.scheme];
1877
+ // Linking bundle B from bundle A wihtout proxy
1878
+ var isSpecialCase = (
1879
+ getContext('bundle') != local.options.conf.bundle
1880
+ && requestPort != hostPort
1881
+ && local.req.headers[':host'] != process.gina.PROXY_HOST
1882
+ ) ? true : false;
1883
+
1884
+ if (isSpecialCase) {
1885
+ hostname = local.options.conf.hostname
1886
+ }
1887
+
1888
+
1889
+ if (
1890
+ isProxyHost
1891
+ && !isSpecialCase
1892
+ ) {
1893
+
1894
+ hostname = scheme + '://'+ (local.req.headers.host||local.req.headers[':host']||process.gina.PROXY_HOST);
1895
+
1896
+ if (
1897
+ !/^(80|443)$/.test(requestPort)
1898
+ && !new RegExp(requestPort+'$').test(hostname)
1899
+ ) {
1900
+ hostname += ':'+ requestPort;
1901
+ }
1902
+ }
1903
+
1673
1904
  switch(type){
1674
1905
  case 'css':
1675
1906
  for (; r < rLen; ++r) {
1676
1907
  obj = resArr[r];
1677
1908
  if (useWebroot && !reURL.test(obj.url) ) {
1678
- obj.url = local.options.conf.server.webroot + obj.url.substr(1);
1909
+ obj.url = local.options.conf.server.webroot + obj.url.substring(1);
1910
+ }
1911
+ // HTTP2 Push via Link
1912
+ if (
1913
+ /http\/2/.test(local.options.conf.server.protocol)
1914
+ && !self.isCacheless()
1915
+ ) {
1916
+ local.options.template.h2Links += '<'+ obj.url +'>; as=style; rel=preload,'
1679
1917
  }
1680
1918
  // TODO - add support for cdn
1681
1919
  if (!/\:\/\//.test(obj.url) ) {
1682
1920
  obj.url = hostname + obj.url;
1683
1921
  }
1684
1922
 
1685
- if (obj.media)
1923
+ if (obj.media) {
1686
1924
  str += '\n\t\t<link href="'+ obj.url +'" media="'+ obj.media +'" rel="'+ obj.rel +'" type="'+ obj.type +'">';
1687
- else
1925
+ } else {
1688
1926
  str += '\n\t\t<link href="'+ obj.url +'" rel="'+ obj.rel +'" type="'+ obj.type +'">';
1927
+ }
1689
1928
  }
1690
1929
  break;
1691
1930
 
@@ -1695,13 +1934,34 @@ function SuperController(options) {
1695
1934
  for (; r < rLen; ++r) {
1696
1935
  obj = resArr[r];
1697
1936
  if (useWebroot && !reURL.test(obj.url) ) {
1698
- obj.url = local.options.conf.server.webroot + obj.url.substr(1);
1937
+ obj.url = local.options.conf.server.webroot + obj.url.substring(1);
1938
+ }
1939
+ // HTTP2 Push via Link
1940
+ if (
1941
+ /http\/2/.test(local.options.conf.server.protocol)
1942
+ && !self.isCacheless()
1943
+ ) {
1944
+ local.options.template.h2Links += '<'+ obj.url +'>; as=script; rel=preload,'
1699
1945
  }
1700
1946
  // TODO - add support for cdn
1701
1947
  if (!/\:\/\//.test(obj.url) ) {
1702
1948
  obj.url = hostname + obj.url;
1703
1949
  }
1704
- str += '\n\t\t<script'+ deferMode +' type="'+ obj.type +'" src="'+ obj.url +'"></script>'
1950
+
1951
+
1952
+ if ( /\/jquery\.(.*)\.(min\.js|js)$/i.test(obj.url) ) {
1953
+ console.warn('jQuery Plugin found in templates.json !\nIf you want to load it before [gina.min.js], you should declare it at the top of your handler using requireJS or add property "isExternalPlugin: true" in your templates.json, under: '+ (obj.route || local.req.routing.rule) +' .');
1954
+ }
1955
+ // Allow jQuery & other external plugins to be loaded in the HEAD section before gina
1956
+ if (
1957
+ obj.isExternalPlugin
1958
+ ) {
1959
+ local.options.template.externalPlugins.splice(1, 0, '\n\t\t<script'+ deferMode +' type="'+ obj.type +'" src="'+ obj.url +'"></script>');
1960
+ }
1961
+ else {
1962
+ // normal case
1963
+ str += '\n\t\t<script'+ deferMode +' type="'+ obj.type +'" src="'+ obj.url +'"></script>';
1964
+ }
1705
1965
  }
1706
1966
  break;
1707
1967
  }
@@ -1797,7 +2057,7 @@ function SuperController(options) {
1797
2057
 
1798
2058
  if (
1799
2059
  staticProps.isStaticFilename && staticsArr.indexOf(url) > -1
1800
- || staticProps.isStaticFilename && staticsArr.indexOf( url.replace(url.substr(url.lastIndexOf('/')+1), '') ) > -1
2060
+ || staticProps.isStaticFilename && staticsArr.indexOf( url.replace(url.substring(url.lastIndexOf('/')+1), '') ) > -1
1801
2061
  || staticProps.isStaticFilename && staticsArr.indexOf(staticProps.firstLevel) > -1
1802
2062
  ) {
1803
2063
  staticProps = null;
@@ -1895,9 +2155,9 @@ function SuperController(options) {
1895
2155
  // ignoreWebRoot = false
1896
2156
  // } else
1897
2157
  if (typeof(res) === 'string' || typeof(res) === 'number' || typeof(res) === 'boolean') {
1898
- if ( /true|1/.test(res) ) {
2158
+ if ( /^(true|1)$/i.test(res) ) {
1899
2159
  ignoreWebRoot = true
1900
- } else if ( /false|0/.test(res) ) {
2160
+ } else if ( /^(false|0)$/i.test(res) ) {
1901
2161
  ignoreWebRoot = false
1902
2162
  } else {
1903
2163
  res = local.res;
@@ -1918,13 +2178,13 @@ function SuperController(options) {
1918
2178
 
1919
2179
  }
1920
2180
 
1921
- if ( req.substr(0,1) === '/') { // is relative (not checking if the URI is defined in the routing.json)
1922
- // if (wroot.substr(wroot.length-1,1) == '/') {
1923
- // wroot = wroot.substr(wroot.length-1,1).replace('/', '')
2181
+ if ( req.substring(0,1) === '/') { // is relative (not checking if the URI is defined in the routing.json)
2182
+ // if (wroot.substring(wroot.length-1,1) == '/') {
2183
+ // wroot = wroot.substring(wroot.length-1,1).replace('/', '')
1924
2184
  // }
1925
2185
 
1926
2186
  if ( /^\//.test(req) && !ignoreWebRoot )
1927
- req = req.substr(1);
2187
+ req = req.substring(1);
1928
2188
 
1929
2189
  rte = ( ignoreWebRoot != null && ignoreWebRoot ) ? req : wroot + req;
1930
2190
  // cleaning url in case of ?param=value
@@ -2015,11 +2275,32 @@ function SuperController(options) {
2015
2275
 
2016
2276
  if ( !self.forward404Unless(condition, req, res) ) { // forward to 404 if bad route
2017
2277
 
2018
- var isProxyHost = ( typeof(local.req.headers.host) != 'undefined' && local.options.conf.server.scheme +'://'+ local.req.headers.host != local.options.conf.hostname || typeof(local.req.headers[':authority']) != 'undefined' && local.options.conf.server.scheme +'://'+ local.req.headers[':authority'] != local.options.conf.hostname ) ? true : false;
2019
- var hostname = (isProxyHost) ? ctx.config.envConf[bundle][env].hostname.replace(/\:\d+$/, '') : ctx.config.envConf[bundle][env].hostname;
2278
+ var localRequestPort = local.req.headers.port || local.req.headers[':port'];
2279
+ var isProxyHost = (
2280
+ typeof(local.req.headers.host) != 'undefined'
2281
+ && typeof(localRequestPort) != 'undefined'
2282
+ && /^(80|443)$/.test(localRequestPort)
2283
+ && local.options.conf.server.scheme +'://'+ local.req.headers.host +':'+ localRequestPort != local.options.conf.hostname.replace(/\:\d+$/, '') +':'+ local.options.conf.server.port
2284
+ ||
2285
+ typeof(local.req.headers[':authority']) != 'undefined'
2286
+ && local.options.conf.server.scheme +'://'+ local.req.headers[':authority'] != local.options.conf.hostname
2287
+ ||
2288
+ typeof(local.req.headers.host) != 'undefined'
2289
+ && typeof(localRequestPort) != 'undefined'
2290
+ && /^(80|443)$/.test(localRequestPort)
2291
+ && req.headers.host == local.options.conf.host
2292
+ ||
2293
+ typeof(local.req.headers['x-nginx-proxy']) != 'undefined'
2294
+ && /^true$/i.test(local.req.headers['x-nginx-proxy'])
2295
+ ||
2296
+ typeof(process.gina.PROXY_HOSTNAME) != 'undefined'
2297
+ ) ? true : false;
2298
+
2299
+ // var isProxyHost = getContext('isProxyHost');
2300
+ var hostname = (isProxyHost)
2301
+ ? process.gina.PROXY_HOSTNAME
2302
+ : ctx.config.envConf[bundle][env].hostname;
2020
2303
 
2021
- // if ( !/\:\d+$/.test(req.headers.host) )
2022
- // hostname = hostname.replace(/\:\d+$/, '');
2023
2304
 
2024
2305
  if (route) { // will go with route first
2025
2306
 
@@ -2078,7 +2359,7 @@ function SuperController(options) {
2078
2359
  originalMethod && !/GET/i.test(originalMethod)
2079
2360
  ) { // trying to redirect using the wrong method ?
2080
2361
 
2081
- console.warn(new Error('Your are trying to redirect using the wrong method: `'+ req.method+'`.\nThis can often occur while redirecting from a controller to another controller or from a bundle to another.\nA redirection is not permitted in this scenario.\nD\'ont panic :)\nSwitching request method to `GET` method instead.\n').message);
2362
+ console.warn(new Error('Your are trying to redirect using the wrong method: `'+ req.method+'`.\nThis can often occur while redirecting from a controller to another controller or from a bundle to another.\nA redirection is not permitted in this scenario.\nDon\'t panic :)\nSwitching request method to `GET` method instead.\n').message);
2082
2363
  method = local.req.method = self.setRequestMethod('GET', conf);
2083
2364
  code = 303;
2084
2365
  }
@@ -2326,15 +2607,13 @@ function SuperController(options) {
2326
2607
 
2327
2608
  if ( /\:\/\//.test(url) ) {
2328
2609
  scheme = url.match(/^\w+\:/)[0];
2329
- scheme = scheme.substr(0, scheme.length-1);
2610
+ scheme = scheme.substring(0, scheme.length-1);
2330
2611
 
2331
2612
  if ( !/^http/.test(scheme) ) {
2332
2613
  self.throwError(local.res, 500, new Error('[ '+ scheme +' ] Scheme not supported. Ref.: `http` or `https` only'));
2333
2614
  return;
2334
2615
  }
2335
2616
 
2336
-
2337
-
2338
2617
  } else { // by default
2339
2618
  scheme = 'http';
2340
2619
  }
@@ -2342,9 +2621,10 @@ function SuperController(options) {
2342
2621
  requestOptions.scheme = scheme +':';
2343
2622
 
2344
2623
  //defining port
2624
+ // console.debug('[ CONTROLLER ][ HTTP/2.0#downloadFromURL ] defining port from: ', url);
2345
2625
  var port = url.match(/\:\d+\//) || null;
2346
2626
  if ( port != null ) {
2347
- port = port[0].substr(1, port[0].length-2);
2627
+ port = port[0].match(/\d+/)[0];
2348
2628
  requestOptions.port = ~~port;
2349
2629
  }
2350
2630
 
@@ -2376,7 +2656,7 @@ function SuperController(options) {
2376
2656
  opt.contentDisposition += '; filename=' + filename;
2377
2657
  }
2378
2658
 
2379
- var ext = filename.match(/\.\w+$/)[0].substr(1)
2659
+ var ext = filename.match(/\.\w+$/)[0].substring(1)
2380
2660
  , contentType = null
2381
2661
  , tmp = _(GINA_TMPDIR +'/'+ filename, true)
2382
2662
  ;
@@ -2394,8 +2674,29 @@ function SuperController(options) {
2394
2674
  requestOptions.headers['content-type'] = contentType;
2395
2675
  requestOptions.headers['content-disposition'] = opt.contentDisposition;
2396
2676
 
2677
+ if (
2678
+ typeof(local.req.headers['x-client-ip']) != 'undefined'
2679
+ && local.req.headers['x-client-ip'] != requestOptions.headers['x-client-ip']
2680
+ ) {
2681
+ requestOptions.headers['x-client-ip'] = local.req.headers['x-client-ip']
2682
+ }
2683
+
2684
+ if (
2685
+ typeof(local.req.headers['x-ingress-ip']) != 'undefined'
2686
+ && local.req.headers['x-ingress-ip'] != requestOptions.headers['x-ingress-ip']
2687
+ ) {
2688
+ requestOptions.headers['x-ingress-ip'] = local.req.headers['x-ingress-ip']
2689
+ }
2690
+
2691
+ if (
2692
+ typeof(local.req.headers['x-forwarded-for']) != 'undefined'
2693
+ && local.req.headers['x-forwarded-for'] != requestOptions.headers['x-forwarded-for']
2694
+ ) {
2695
+ requestOptions.headers['x-forwarded-for'] = local.req.headers['x-forwarded-for']
2696
+ }
2697
+
2397
2698
  var browser = require(''+ scheme);
2398
- //console.debug('requestOptions: \n', JSON.stringify(requestOptions, null, 4));
2699
+ // console.debug('requestOptions: \n', JSON.stringify(requestOptions, null, 2));
2399
2700
 
2400
2701
  browser
2401
2702
  .get(requestOptions, function(response) {
@@ -2659,7 +2960,8 @@ function SuperController(options) {
2659
2960
  ) {
2660
2961
  return false
2661
2962
  }
2662
- self.isProcessingError = false; // by default
2963
+ // by default
2964
+ self.isProcessingError = false;
2663
2965
 
2664
2966
  var queryData = {}
2665
2967
  , defaultOptions = local.query.options
@@ -2669,14 +2971,14 @@ function SuperController(options) {
2669
2971
 
2670
2972
  // options must be used as a copy in case of multiple calls of self.query(options, ...)
2671
2973
  options = merge(JSON.clone(options), defaultOptions);
2672
- // options = merge(options, defaultOptions);
2673
2974
 
2674
- for (var o in options) {//cleaning
2975
+ for (let o in options) {//cleaning
2675
2976
  if ( typeof(options[o]) == 'undefined' || options[o] == undefined) {
2676
2977
  delete options[o]
2677
2978
  }
2678
2979
  }
2679
2980
 
2981
+
2680
2982
  if (self.isCacheless() || self.isLocalScope() ) {
2681
2983
  options.rejectUnauthorized = false;
2682
2984
  }
@@ -2745,14 +3047,17 @@ function SuperController(options) {
2745
3047
  if ( local.req != null && typeof(local.req.ginaHeaders) != 'undefined' ) {
2746
3048
  // gina form headers
2747
3049
  for (let h in local.req.ginaHeaders.form) {
2748
- let k = h.substr(0,1).toUpperCase() + h.substr(1);
3050
+ let k = h.substring(0,1).toUpperCase() + h.substring(1);
2749
3051
  options.headers['X-Gina-Form-' + k ] = local.req.ginaHeaders.form[h];
2750
3052
  }
2751
3053
  }
2752
3054
 
2753
- var ctx = getContext()
2754
- , protocol = null
2755
- , scheme = null
3055
+ var ctx = getContext()
3056
+ , protocol = null
3057
+ , scheme = null
3058
+ , isProxyHost = getContext('isProxyHost')
3059
+ , bundle = null
3060
+ , webroot = options.webroot || ctx.gina.config.envConf[ctx.bundle][ctx.env].server.webroot;// bundle servers's webroot by default
2756
3061
  ;
2757
3062
  // cleanup options.path
2758
3063
  if (/\:\/\//.test(options.path)) {
@@ -2769,11 +3074,16 @@ function SuperController(options) {
2769
3074
  .replace(':'+port, '');
2770
3075
  }
2771
3076
 
3077
+ // if ( typeof(options.protocol) == 'undefined' ) {
3078
+ // options.protocol = ctx.gina.config.envConf[ctx.bundle][ctx.env].server.protocol;
3079
+ // }
3080
+
2772
3081
  // retrieve protocol & scheme: if empty, take the bundles protocol
2773
3082
  protocol = options.protocol || ctx.gina.config.envConf[ctx.bundle][ctx.env].server.protocol;// bundle servers's protocol by default
2774
3083
  protocol = protocol.match(/[.a-z 0-9]+/ig)[0];
2775
3084
  scheme = options.scheme || ctx.gina.config.envConf[ctx.bundle][ctx.env].server.scheme;// bundle servers's scheme by default
2776
3085
  scheme = scheme.match(/[a-z 0-9]+/ig)[0];
3086
+
2777
3087
  // retrieve credentials
2778
3088
  if ( typeof(options.ca) == 'undefined' || ! options.ca ) {
2779
3089
  options.ca = ctx.gina.config.envConf[ctx.bundle][ctx.env].server.credentials.ca;
@@ -2782,24 +3092,18 @@ function SuperController(options) {
2782
3092
  //retrieving dynamic host, hostname & port
2783
3093
  if ( /\@/.test(options.hostname) ) {
2784
3094
 
2785
- var bundle = ( options.hostname.replace(/(.*)\:\/\//, '') ).split(/\@/)[0];
2786
-
3095
+ bundle = ( options.hostname.replace(/(.*)\:\/\//, '') ).split(/\@/)[0];
2787
3096
  // No shorcut possible because conf.hostname might differ from user inputs
2788
3097
  options.host = ctx.gina.config.envConf[bundle][ctx.env].host.replace(/(.*)\:\/\//, '').replace(/\:\d+/, '');
2789
3098
  options.hostname = ctx.gina.config.envConf[bundle][ctx.env].hostname;
2790
3099
  options.port = ctx.gina.config.envConf[bundle][ctx.env].server.port;
2791
-
2792
- options.protocol = ctx.gina.config.envConf[bundle][ctx.env].server.protocol;
3100
+ options.protocol = options.protocol || ctx.gina.config.envConf[bundle][ctx.env].server.protocol;
2793
3101
  options.scheme = ctx.gina.config.envConf[bundle][ctx.env].server.scheme;
2794
3102
 
2795
3103
  // retrieve credentials
2796
3104
  if ( typeof(options.ca) == 'undefined' || ! options.ca ) {
2797
3105
  options.ca = ctx.gina.config.envConf[bundle][ctx.env].server.credentials.ca;
2798
3106
  }
2799
-
2800
- // might be != from the bundle requesting
2801
- //options.protocol = ctx.gina.config.envConf[bundle][ctx.env].content.settings.server.protocol || ctx.gina.config.envConf[bundle][ctx.env].server.protocol;
2802
- //options.scheme = ctx.gina.config.envConf[bundle][ctx.env].content.settings.server.scheme || ctx.gina.config.envConf[bundle][ctx.env].server.scheme;
2803
3107
  }
2804
3108
 
2805
3109
  if ( typeof(options.protocol) == 'undefined' ) {
@@ -2813,45 +3117,224 @@ function SuperController(options) {
2813
3117
 
2814
3118
 
2815
3119
  // reformating scheme
2816
- if( !/\:$/.test(options.scheme) )
3120
+ if( !/\:$/.test(options.scheme) ) {
2817
3121
  options.scheme += ':';
3122
+ }
3123
+
3124
+ if (isProxyHost) {
3125
+ // X-Forwarded-Host
3126
+ options.headers['x-forwarded-host'] = process.gina.PROXY_HOST;
3127
+ // X-Forwarded-Proto
3128
+ options.headers['x-forwarded-proto'] = process.gina.PROXY_SCHEME;
3129
+ }
3130
+
3131
+ if ( ctx.gina.config.envConf[ctx.bundle][ctx.env].server.resolvers.length > 0 ) {
3132
+ var resolversColl = new Collection(ctx.gina.config.envConf[ctx.bundle][ctx.env].server.resolvers);
3133
+ options.nameservers = resolversColl.findOne({ scope: process.env.NODE_SCOPE}).nameservers;
3134
+ resolversColl = null;
3135
+ }
2818
3136
 
2819
3137
  try {
2820
3138
  options.queryData = queryData;
3139
+
3140
+ bundle = null;
3141
+
3142
+ // TODO - Add preferred communication method option: cCurl or HTTP
3143
+ // return handleCurlRequest(options, callback);
3144
+
2821
3145
  var protocolVersion = ~~options.protocol.match(/\/(.*)$/)[1].replace(/\.\d+/, '');
2822
3146
  var httpLib = options.protocol.match(/^(.*)\//)[1] + ( (protocolVersion >= 2) ? protocolVersion : '' );
2823
3147
  if ( !/http2/.test(httpLib) && /https/.test(options.scheme) ) {
2824
3148
  httpLib += 's';
2825
3149
  }
2826
-
2827
3150
  browser = require(''+ httpLib);
2828
-
2829
3151
  if ( /http2/.test(httpLib) ) {
2830
3152
  return handleHTTP2ClientRequest(browser, options, callback);
2831
3153
  } else {
2832
3154
  return handleHTTP1ClientRequest(browser, options, callback);
2833
3155
  }
2834
3156
 
2835
-
2836
3157
  } catch(err) {
2837
3158
  if (callback) {
2838
3159
  return callback(err)
2839
3160
  }
2840
3161
  self.emit('query#complete', err)
2841
3162
  }
3163
+ }
3164
+
3165
+ var handleCurlRequest = async function(opt, callback) {
3166
+
3167
+
3168
+ var body = null;
3169
+ // https://docs.couchbase.com/server/current/n1ql-rest-query/index.html#Request
3170
+ var cmd = [
3171
+ '$(which curl)'
3172
+ ];
3173
+
3174
+ if (!opt.rejectUnauthorized) {
3175
+ // (SSL) This option explicitly allows curl to perform "insecure" SSL connections and transfers
3176
+ // same as --insecure
3177
+ cmd.splice(1,0,'-k');
3178
+ }
3179
+
3180
+ // method
3181
+ if ( !/get/i.test(opt.method) ) {
3182
+ cmd.splice(1,0,'-X '+ opt.method.toUpperCase() );
3183
+ }
3184
+
3185
+
3186
+ if ( /(post|put)/i.test(opt.method) && opt.queryData.length > 0) {
3187
+ cmd.push('-d '+ opt.queryData );
3188
+ body = Buffer.from(opt.queryData);
3189
+ opt.headers['content-length'] = body.length;
3190
+ } else if (
3191
+ /get/i.test(opt.method)
3192
+ && typeof(opt.headers['content-length']) != 'undefined'
3193
+ ) {
3194
+ delete opt.headers['content-length'];
3195
+ }
3196
+
3197
+ if ( opt.headers.count() > 0) {
3198
+ for (let h in opt.headers) {
3199
+ cmd.splice(1,0,'-H "'+ h +': '+ opt.headers[h] +'"');
3200
+ }
3201
+ }
3202
+
3203
+ // resolvers
3204
+ if (opt.nameservers) {
3205
+ resolver.setServers(opt.nameservers);
3206
+ await resolver
3207
+ .resolve4(opt.host)
3208
+ .catch( function onResolverErr(e) {
3209
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
3210
+ var msg = 'Could not resolve with these `settings.server.resolvers`:\n'+ opt.nameservers.toString() +'\n' + e.stack+ '\nController Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r';
3211
+ var exception = new Error(msg);
3212
+ exception.status = 500;
3213
+ return self.throwError(exception);
3214
+ })
3215
+ .then( function onResolved(ips) {
3216
+ if ( typeof(ips) == 'undefined' || !Array.isArray(ips) || !ips.length ) {
3217
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
3218
+ var e = new Error('`Unable to resolve ${opt.host}`');
3219
+ var msg = 'Please check`settings.server.resolvers`:\n'+ opt.nameservers.toString() +'\n'+ e.stack + 'Controller Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r';
3220
+ var exception = new Error(msg);
3221
+ exception.status = 500;
3222
+ return self.throwError(exception);
3223
+ }
3224
+ for (let i=0, len=ips.length; i<len; i++) {
3225
+ // e.g.: --resolve www.example.com:443:127.0.0.1
3226
+ cmd.push('--resolve '+ opt.host +':'+ opt.port +':'+ ips[i]);
3227
+ }
3228
+ });
3229
+ }
3230
+
3231
+
3232
+
3233
+
3234
+ cmd.push('-v "'+ opt.hostname + opt.path +'"');
3235
+
3236
+ // Default maxBuffer is 200KB (=> 1024 * 200)
3237
+ // Setting it to 10MB - preventing: stdout maxBuffer length exceeded
3238
+ var maxBuffer = (1024 * 1024 * 10);
3239
+ exec(cmd.join(' '), { maxBuffer: maxBuffer }, function onResult(err, dataStr, infos) {
3240
+ var error = null;
3241
+ if (err) {
3242
+ try {
3243
+ // by default
3244
+ error = new Error('[ CONTROLLER ][ CURL#query ] request aborted\n'+ err.stack);
3245
+ if (
3246
+ typeof(err.message) != 'undefined'
3247
+ && /Failed to connect/i.test(err.message)
3248
+ ) {
3249
+ var port = getContext('gina').ports[opt.protocol][opt.scheme.replace(/\:/, '')][ opt.port ];
3250
+ error.accessPoint = port;
3251
+ error.message = 'Could not connect to [ ' + error.accessPoint + ' ].\nThe `'+port.split(/\@/)[0]+'` bundle is offline or unreachable.\n';
3252
+ }
3253
+ console.error(error.stack);
3254
+ if ( typeof(callback) != 'undefined' ) {
3255
+ callback(error)
3256
+ } else {
3257
+ self.emit('query#complete', error)
3258
+ }
3259
+ } catch (e) {
3260
+ // console.error(e.stack);
3261
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
3262
+ var msg = 'Controller Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r' + e.stack;
3263
+ var exception = new Error(msg);
3264
+ exception.status = 500;
3265
+ self.throwError(exception);
3266
+ }
3267
+ return;
3268
+ }
3269
+
2842
3270
 
3271
+ try {
3272
+ let data = JSON.parse(dataStr);
3273
+ if ( typeof(data) == 'undefined' ) {
3274
+ data = {}
3275
+ }
3276
+ if ( typeof(callback) != 'undefined' ) {
3277
+ callback(err, data)
3278
+ } else {
3279
+ self.emit('query#complete', err, data)
3280
+ }
3281
+ } catch (e) {
3282
+ // _err.stack = '[ CONTROLLER ][ CURL#query ] onCallbackError: '+ e.stack;
3283
+ // console.error(e.stack);
3284
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
3285
+ var msg = 'Controller Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r' + e.stack;
3286
+ var exception = new Error(msg);
3287
+ exception.status = 500;
3288
+ self.throwError(exception);
3289
+ return;
3290
+ }
3291
+ });
2843
3292
  }
2844
3293
 
3294
+ var handleHTTP1ClientRequestv2 = function (browser, options, callback) {
3295
+ var agent = new browser.Agent({ keepAlive: true });
3296
+ var options = {
3297
+ host: options.host,
3298
+ port: options.port,
3299
+ path: options.path,
3300
+ method: 'GET',
3301
+ agent: agent
3302
+ };
3303
+
3304
+ var req = browser.request(options, function(res) {
3305
+ var str = "";
3306
+ var err = false;
3307
+ res.on('data', function (chunk) {
3308
+ str += chunk;
3309
+ });
3310
+ res.on('end', function () {
3311
+ // done
3312
+ return callback( err, data );
3313
+ });
3314
+ });
3315
+ req.write('');
3316
+ req.end();
3317
+ req.on('error', function(error) {
3318
+ err = error
3319
+ });
3320
+ };
3321
+
2845
3322
  var handleHTTP1ClientRequest = function(browser, options, callback) {
2846
3323
 
2847
3324
  var altOpt = JSON.clone(options);
3325
+ // var credentials = self.getConfig('settings').server.credentials;
3326
+ // options.ca = credentials.ca;
3327
+ // options.encKey = credentials.privateKey;
3328
+ // options.encCert = credentials.certificate;
3329
+
2848
3330
 
2849
3331
  altOpt.protocol = options.scheme;
2850
3332
  altOpt.hostname = options.host;
2851
3333
  altOpt.port = options.port;
3334
+ altOpt.maxSockets = options.maxSockets || 1;
2852
3335
  if ( typeof(altOpt.encKey) != 'undefined' ) {
2853
3336
  try {
2854
- altOpt.encKey = fs.readFileSync(options.encKey);
3337
+ altOpt.encKey = fs.readFileSync(altOpt.encKey);
2855
3338
  } catch(err) {
2856
3339
  self.emit('query#complete', err);
2857
3340
  }
@@ -2862,7 +3345,7 @@ function SuperController(options) {
2862
3345
 
2863
3346
  if ( typeof(altOpt.encCert) != 'undefined' ) {
2864
3347
  try {
2865
- altOpt.encCert = fs.readFileSync(options.encCert);
3348
+ altOpt.encCert = fs.readFileSync(altOpt.encCert);
2866
3349
  } catch(err) {
2867
3350
  self.emit('query#complete', err);
2868
3351
  }
@@ -2871,6 +3354,11 @@ function SuperController(options) {
2871
3354
  console.warn('[ CONTROLLER ][ HTTP/1.0#query ] options.encCert not found !');
2872
3355
  }
2873
3356
 
3357
+
3358
+ delete altOpt.ca;
3359
+ delete altOpt.encKey;
3360
+ delete altOpt.encCert;
3361
+
2874
3362
  altOpt.agent = new browser.Agent(altOpt);
2875
3363
 
2876
3364
  var req = browser.request(altOpt, function(res) {
@@ -2930,7 +3418,7 @@ function SuperController(options) {
2930
3418
  return;
2931
3419
  }
2932
3420
  } catch (e) {
2933
- var infos = local.options, controllerName = infos.controller.substr(infos.controller.lastIndexOf('/'));
3421
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
2934
3422
  var msg = 'Controller Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r' + e.stack;
2935
3423
  var exception = new Error(msg);
2936
3424
  exception.status = 500;
@@ -3024,7 +3512,7 @@ function SuperController(options) {
3024
3512
  cb(err, data)
3025
3513
  }
3026
3514
  } catch (e) {
3027
- var infos = local.options, controllerName = infos.controller.substr(infos.controller.lastIndexOf('/'));
3515
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
3028
3516
  var msg = 'Controller Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r' + e.stack;
3029
3517
  var exception = new Error(msg);
3030
3518
  exception.status = 500;
@@ -3101,10 +3589,8 @@ function SuperController(options) {
3101
3589
  delete options.queryData;
3102
3590
 
3103
3591
 
3104
-
3105
3592
  const client = browser.connect(options.hostname, options);
3106
3593
 
3107
-
3108
3594
  const {
3109
3595
  HTTP2_HEADER_PROTOCOL,
3110
3596
  HTTP2_HEADER_SCHEME,
@@ -3127,6 +3613,32 @@ function SuperController(options) {
3127
3613
  options.headers['content-type'] = local.req.headers['content-type']
3128
3614
  }
3129
3615
 
3616
+ if ( typeof(local.req.headers['x-client-ip']) != 'undefined' && local.req.headers['x-client-ip'] != options.headers['x-client-ip'] ) {
3617
+ options.headers['x-client-ip'] = local.req.headers['x-client-ip']
3618
+ }
3619
+
3620
+ if ( typeof(local.req.headers['x-ingress-ip']) != 'undefined' && local.req.headers['x-ingress-ip'] != options.headers['x-ingress-ip'] ) {
3621
+ options.headers['x-ingress-ip'] = local.req.headers['x-ingress-ip']
3622
+ }
3623
+
3624
+ // x-forwarded-for check
3625
+ // console.debug('[ CONTROLLER ][ HTTP/2.0#query ] checking x-forwarded-for');
3626
+ if (
3627
+ // Previous proxies
3628
+ typeof(local.req.headers['x-forwarded-for']) != 'undefined'
3629
+ && local.req.headers['x-forwarded-for'] != ""
3630
+ // current proxy
3631
+ && typeof(local.req.headers['x-real-ip']) != 'undefined'
3632
+ ) {
3633
+ // console.debug('[ CONTROLLER ][ HTTP/2.0#query ] options.headers', JSON.stringify(options.headers, null, 2));
3634
+ // console.debug('[ CONTROLLER ][ HTTP/2.0#query ] local.req.headers', JSON.stringify(local.req.headers, null, 2));
3635
+ var xForwardedFor = "" + local.req.headers['x-forwarded-for'];
3636
+ // Adding the current PI to the list
3637
+ xForwardedFor += ", "+local.req.headers['x-real-ip'];
3638
+ xForwardedFor = null;
3639
+ // console.debug('[ CONTROLLER ][ HTTP/2.0#query ] options.headers["x-forwarded-for"]', options.headers['x-forwarded-for']);
3640
+ }
3641
+
3130
3642
  var headers = merge({
3131
3643
  [HTTP2_HEADER_METHOD]: options[':method'],
3132
3644
  [HTTP2_HEADER_PATH]: options[':path']
@@ -3134,7 +3646,11 @@ function SuperController(options) {
3134
3646
 
3135
3647
  // merging with user options
3136
3648
  for (var o in options) {
3137
- if (!/^\:/.test(o) && !/headers/.test(o) && typeof(headers[o]) == 'undefined' ) {
3649
+ if (
3650
+ !/^\:/.test(o)
3651
+ && !/headers/.test(o)
3652
+ && typeof(headers[o]) == 'undefined'
3653
+ ) {
3138
3654
  headers[o] = options[o]
3139
3655
  }
3140
3656
  }
@@ -3154,6 +3670,7 @@ function SuperController(options) {
3154
3670
  }
3155
3671
 
3156
3672
 
3673
+
3157
3674
  client.on('error', (error) => {
3158
3675
 
3159
3676
  console.error( '`'+ options[':path']+ '` : '+ error.stack||error.message);
@@ -3289,7 +3806,7 @@ function SuperController(options) {
3289
3806
  }
3290
3807
 
3291
3808
  } catch (e) {
3292
- var infos = local.options, controllerName = infos.controller.substr(infos.controller.lastIndexOf('/'));
3809
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
3293
3810
  var msg = 'Controller Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r' + e.stack;
3294
3811
  var exception = new Error(msg);
3295
3812
  exception.status = 500;
@@ -3367,7 +3884,7 @@ function SuperController(options) {
3367
3884
  cb(err, data)
3368
3885
  }
3369
3886
  } catch (e) {
3370
- var infos = local.options, controllerName = infos.controller.substr(infos.controller.lastIndexOf('/'));
3887
+ var infos = local.options, controllerName = infos.controller.substring(infos.controller.lastIndexOf('/'));
3371
3888
  var msg = 'Controller Query Exception while catching back.\nBundle: '+ infos.bundle +'\nController File: /controllers'+ controllerName +'\nControl: this.'+ infos.control +'(...)\n\r' + e.stack;
3372
3889
  var exception = new Error(msg);
3373
3890
  exception.status = 500;
@@ -3502,11 +4019,11 @@ function SuperController(options) {
3502
4019
  project = route.param.project;
3503
4020
  } // TODO - add support for project pointer : getContext('gina').projects[project]
3504
4021
  if (/\@(.*)$/.test(route.param.url)) {
3505
- var targetedBundle = route.param.url.substr(route.param.url.lastIndexOf('@')+1);
4022
+ var targetedBundle = route.param.url.substring(route.param.url.lastIndexOf('@')+1);
3506
4023
  hostname = targetedBundle +'@'+ project;
3507
4024
  port = hostname;
3508
4025
  var webroot = getContext('gina').config.envConf[targetedBundle][local.options.conf.env].server.webroot;
3509
- path = (/\/$/.test(webroot)) ? webroot.substr(0, webroot.length-1) : webroot;
4026
+ path = (/\/$/.test(webroot)) ? webroot.substring(0, webroot.length-1) : webroot;
3510
4027
  } else {
3511
4028
  hostname = route.param.hostname;
3512
4029
  port = route.param.port;
@@ -3560,24 +4077,28 @@ function SuperController(options) {
3560
4077
  *
3561
4078
  * */
3562
4079
  this.getConfig = function(name) {
4080
+ var tmp = null;
3563
4081
  if ( typeof(name) != 'undefined' ) {
3564
4082
  try {
3565
- // needs to be read only
3566
- //config = JSON.clone(local.options.conf.content[name]);
3567
- //config = Object.freeze(local.options.conf.content[name]);
3568
- //Object.seal(local.options.conf.content[name]);
3569
- //Object.freeze(local.options.conf.content[name]);
3570
- // if ( self.isCacheless() ) {
3571
- // }
3572
- return JSON.clone(local.options.conf.content[name]);
4083
+ // Needs to be read only
4084
+ tmp = JSON.clone(local.options.conf.content[name]);
3573
4085
  } catch (err) {
3574
4086
  return undefined;
3575
4087
  }
3576
4088
  } else {
3577
- // config = JSON.stringify(local.options.conf);
3578
- // return JSON.parse(config)
3579
- return JSON.clone(local.options.conf);
4089
+ tmp = JSON.clone(local.options.conf);
3580
4090
  }
4091
+
4092
+ if (
4093
+ getContext('isProxyHost')
4094
+ && typeof(tmp.hostname) != 'undefined'
4095
+ ) {
4096
+ tmp.hostname = process.gina.PROXY_HOSTNAME;
4097
+ tmp.host = process.gina.PROXY_HOST;
4098
+ // tmp.hostname = getContext('gina').config.envConf._proxyHostname
4099
+ // tmp.host = tmp.hostname.replace(/^(https|http)\:\/\//, '');
4100
+ }
4101
+ return tmp;
3581
4102
  }
3582
4103
 
3583
4104
  /**
@@ -4002,7 +4523,7 @@ function SuperController(options) {
4002
4523
  //instance: self.serverInstance,
4003
4524
  //template: (routeHasViews) ? bundleConf.content.templates[templateName] : undefined,
4004
4525
  //isUsingTemplate: local.isUsingTemplate,
4005
- //cacheless: cacheless,
4526
+ //isCacheless: isCacheless,
4006
4527
  path: null //, // user custom path : namespace should be ignored | left blank
4007
4528
  //assets: {}
4008
4529
  };
@@ -4228,11 +4749,11 @@ function SuperController(options) {
4228
4749
  , ext = null
4229
4750
  , isHtmlContent = false
4230
4751
  , hasCustomErrorFile = false
4231
- , eCode = code.toString().substr(0,1) + 'xx'
4752
+ , eCode = code.toString().substring(0,1) + 'xx'
4232
4753
  ;
4233
- var extArr = url.substr(url.lastIndexOf('.')).match(/(\.[A-Za-z0-9]+)/);
4754
+ var extArr = url.substring(url.lastIndexOf('.')).match(/(\.[A-Za-z0-9]+)/);
4234
4755
  if (extArr) {
4235
- ext = extArr[0].substr(1);
4756
+ ext = extArr[0].substring(1);
4236
4757
  }
4237
4758
  if ( !ext || /^(html|htm)$/i.test(ext) ) {
4238
4759
  isHtmlContent = true;
@@ -4306,8 +4827,7 @@ function SuperController(options) {
4306
4827
 
4307
4828
  local.req.routing = routeObj;
4308
4829
  local.req.params.errorObject = errorObject;
4309
- self.renderCustomError(local.req, res, local.next);
4310
- return;
4830
+ return self.renderCustomError(local.req, res, local.next);
4311
4831
  }
4312
4832
 
4313
4833
  }
@@ -4390,7 +4910,7 @@ function SuperController(options) {
4390
4910
  return next();
4391
4911
  }
4392
4912
 
4393
- if ( /http\/2/.test(protocol) ) {
4913
+ if ( stream && /http\/2/.test(protocol) ) {
4394
4914
  return stream.end();
4395
4915
  }
4396
4916