gina 0.1.8 → 0.1.9-alpha.2

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 (355) hide show
  1. package/.github/workflows/test.yml +33 -0
  2. package/CONTRIBUTING.md +10 -1
  3. package/GOVERNANCE.md +1 -1
  4. package/README.md +29 -10
  5. package/ROADMAP.md +69 -11
  6. package/framework/v0.1.9-alpha.2/VERSION +1 -0
  7. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  8. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.gz +0 -0
  9. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  10. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  11. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/index.js +62 -15
  12. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.v2.js +56 -16
  13. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.v3.js +134 -107
  14. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.v4.js +127 -84
  15. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.v3.js +32 -50
  16. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.v4.js +1 -1
  17. package/framework/v0.1.9-alpha.2/core/connectors/redis/index.js +30 -0
  18. package/framework/v0.1.9-alpha.2/core/connectors/redis/lib/session-store.js +229 -0
  19. package/framework/v0.1.9-alpha.2/core/connectors/sqlite/index.js +32 -0
  20. package/framework/v0.1.9-alpha.2/core/connectors/sqlite/lib/session-store.js +262 -0
  21. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.js +27 -78
  22. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.render-json.js +6 -8
  23. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/gna.js +23 -0
  24. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/entity.js +19 -14
  25. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/server.isaac.js +11 -2
  26. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/server.js +2 -4
  27. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/app.json +1 -0
  28. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/connectors.json +11 -9
  29. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/routing.json +2 -1
  30. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/settings.json +1 -0
  31. package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/index.js +23 -1
  32. package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/public_suffix_list.dat.gz +0 -0
  33. package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/session-store.js +8 -5
  34. package/package.json +12 -9
  35. package/schema/app.crons.json +50 -0
  36. package/schema/app.json +72 -0
  37. package/schema/connectors.json +63 -0
  38. package/schema/routing.json +75 -0
  39. package/schema/settings.json +132 -0
  40. package/framework/v0.1.8/VERSION +0 -1
  41. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/AUTHORS +0 -0
  42. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/LICENSE +0 -0
  43. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/html/nolayout.html +0 -0
  44. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/html/static.html +0 -0
  45. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/android-chrome-192x192.png +0 -0
  46. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/android-chrome-512x512.png +0 -0
  47. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/apple-touch-icon.png +0 -0
  48. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/favicon-16x16.png +0 -0
  49. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/favicon-32x32.png +0 -0
  50. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/favicon.ico +0 -0
  51. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/README.md +0 -0
  52. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  53. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  54. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html +0 -0
  55. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.br +0 -0
  56. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
  57. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  58. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  59. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  60. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  61. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/uuid.json +0 -0
  62. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/config.js +0 -0
  63. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.js +0 -0
  64. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/n1ql.js +0 -0
  65. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.js +0 -0
  66. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  67. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/content.encoding +0 -0
  68. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.framework.js +0 -0
  69. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.render-swig.js +0 -0
  70. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.render-v1.js +0 -0
  71. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/index.js +0 -0
  72. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/LICENSE +0 -0
  73. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/README.md +0 -0
  74. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  75. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  76. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  77. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  78. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/package.json +0 -0
  79. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/LICENSE +0 -0
  80. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/index.js +0 -0
  81. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/package.json +0 -0
  82. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/readme.markdown +0 -0
  83. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/HISTORY.md +0 -0
  84. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/LICENSE +0 -0
  85. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/README.md +0 -0
  86. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/bin/swig.js +0 -0
  87. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/dist/swig.min.js +0 -0
  88. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/index.js +0 -0
  89. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/dateformatter.js +0 -0
  90. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/filters.js +0 -0
  91. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/lexer.js +0 -0
  92. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/loaders/filesystem.js +0 -0
  93. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/loaders/index.js +0 -0
  94. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/loaders/memory.js +0 -0
  95. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/parser.js +0 -0
  96. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/swig.js +0 -0
  97. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/autoescape.js +0 -0
  98. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/block.js +0 -0
  99. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/else.js +0 -0
  100. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/elseif.js +0 -0
  101. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/extends.js +0 -0
  102. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/filter.js +0 -0
  103. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/for.js +0 -0
  104. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/if.js +0 -0
  105. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/import.js +0 -0
  106. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/include.js +0 -0
  107. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/index.js +0 -0
  108. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/macro.js +0 -0
  109. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/parent.js +0 -0
  110. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/raw.js +0 -0
  111. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/set.js +0 -0
  112. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/spaceless.js +0 -0
  113. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/utils.js +0 -0
  114. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/package.json +0 -0
  115. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-client/swig-2.0.0.min.js +0 -0
  116. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-client/swig.js +0 -0
  117. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/index.js +0 -0
  118. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/lib/class.js +0 -0
  119. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/lib/factory.js +0 -0
  120. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/lib/tools.js +0 -0
  121. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/README.md +0 -0
  122. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/currency.json +0 -0
  123. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/language/en.json +0 -0
  124. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/language/fr.json +0 -0
  125. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/region/en.json +0 -0
  126. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/region/fr.json +0 -0
  127. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/index.js +0 -0
  128. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/mime.types +0 -0
  129. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/index.js +0 -0
  130. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/template/entityFactory.js +0 -0
  131. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/template/index.js +0 -0
  132. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/README.md +0 -0
  133. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/index.js +0 -0
  134. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/file/README.md +0 -0
  135. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/file/build.json +0 -0
  136. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/file/package.json +0 -0
  137. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/README.md +0 -0
  138. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/build.json +0 -0
  139. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/package.json +0 -0
  140. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/src/main.js +0 -0
  141. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/README.md +0 -0
  142. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/build.json +0 -0
  143. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/package.json +0 -0
  144. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/src/main.js +0 -0
  145. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/README.md +0 -0
  146. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/build.json +0 -0
  147. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/package.json +0 -0
  148. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/src/form-validator.js +0 -0
  149. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/src/main.js +0 -0
  150. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/router.js +0 -0
  151. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/server.express.js +0 -0
  152. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/status.codes +0 -0
  153. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/_gitignore +0 -0
  154. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  155. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/templates.json +0 -0
  156. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  157. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  158. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  159. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  160. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  161. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  162. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  163. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  164. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  165. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/readme.md +0 -0
  166. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  167. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  168. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  169. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  170. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  171. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/command/gina.bat.tpl +0 -0
  172. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/command/gina.tpl +0 -0
  173. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/env.json +0 -0
  174. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/manifest.json +0 -0
  175. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/package.json +0 -0
  176. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/settings.json +0 -0
  177. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/statics.json +0 -0
  178. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/templates.json +0 -0
  179. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/client/json/401.json +0 -0
  180. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/client/json/403.json +0 -0
  181. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/client/json/404.json +0 -0
  182. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/server/html/50x.html +0 -0
  183. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/server/json/500.json +0 -0
  184. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/server/json/503.json +0 -0
  185. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/extensions/logger/config.json +0 -0
  186. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/console.js +0 -0
  187. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/context.js +0 -0
  188. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/LICENSE +0 -0
  189. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/README.md +0 -0
  190. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/package.json +0 -0
  191. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/src/main.js +0 -0
  192. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/dateFormat.js +0 -0
  193. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/index.js +0 -0
  194. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/LICENSE +0 -0
  195. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/README.md +0 -0
  196. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/package.json +0 -0
  197. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/src/main.js +0 -0
  198. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/path.js +0 -0
  199. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/README.md +0 -0
  200. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/package.json +0 -0
  201. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/src/api-error.js +0 -0
  202. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/src/main.js +0 -0
  203. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/prototypes.js +0 -0
  204. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/task.js +0 -0
  205. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/text.js +0 -0
  206. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/README.md +0 -0
  207. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/build.json +0 -0
  208. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/package.json +0 -0
  209. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/src/dep/jszip.min.js +0 -0
  210. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/src/main.js +0 -0
  211. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/README.md +0 -0
  212. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/build.json +0 -0
  213. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/package.json +0 -0
  214. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/src/main.js +0 -0
  215. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/aliases.json +0 -0
  216. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/add.js +0 -0
  217. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/arguments.json +0 -0
  218. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/build.js +0 -0
  219. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/copy.js +0 -0
  220. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/cp.js +0 -0
  221. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/help.js +0 -0
  222. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/help.txt +0 -0
  223. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/list.js +0 -0
  224. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/remove.js +0 -0
  225. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/rename.js +0 -0
  226. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/restart.js +0 -0
  227. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/rm.js +0 -0
  228. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/start.js +0 -0
  229. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/status.js +0 -0
  230. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/stop.js +0 -0
  231. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/cache/stats.js +0 -0
  232. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/add.js +0 -0
  233. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/get.js +0 -0
  234. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/help.js +0 -0
  235. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/help.txt +0 -0
  236. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/link-dev.js +0 -0
  237. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/list.js +0 -0
  238. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/remove.js +0 -0
  239. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/rm.js +0 -0
  240. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/set.js +0 -0
  241. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/unset.js +0 -0
  242. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/use.js +0 -0
  243. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/arguments.json +0 -0
  244. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/build.js +0 -0
  245. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/dot.js +0 -0
  246. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/get.js +0 -0
  247. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/help.js +0 -0
  248. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/help.txt +0 -0
  249. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/init.js +0 -0
  250. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/link-node-modules.js +0 -0
  251. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/link.js +0 -0
  252. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/msg.json +0 -0
  253. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/open.js +0 -0
  254. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/restart.js +0 -0
  255. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/set.js +0 -0
  256. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/start.js +0 -0
  257. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/status.js +0 -0
  258. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/stop.js +0 -0
  259. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/tail.js +0 -0
  260. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/update.js +0 -0
  261. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/version.js +0 -0
  262. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/gina-dev.1.md +0 -0
  263. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/gina-framework.1.md +0 -0
  264. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/gina.1.md +0 -0
  265. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/helper.js +0 -0
  266. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/index.js +0 -0
  267. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/minion/help.js +0 -0
  268. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/minion/help.txt +0 -0
  269. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/msg.json +0 -0
  270. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/help.js +0 -0
  271. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/help.txt +0 -0
  272. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/inc/scan.js +0 -0
  273. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/list.js +0 -0
  274. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/reset.js +0 -0
  275. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/set.js +0 -0
  276. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/add.js +0 -0
  277. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/arguments.json +0 -0
  278. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/build.js +0 -0
  279. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/help.js +0 -0
  280. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/help.txt +0 -0
  281. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/import.js +0 -0
  282. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/list.js +0 -0
  283. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/move.js +0 -0
  284. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/remove.js +0 -0
  285. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/rename.js +0 -0
  286. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/restart.js +0 -0
  287. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/rm.js +0 -0
  288. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/start.js +0 -0
  289. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/status.js +0 -0
  290. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/stop.js +0 -0
  291. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/help.js +0 -0
  292. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/help.txt +0 -0
  293. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/list.js +0 -0
  294. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/set.js +0 -0
  295. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/add.js +0 -0
  296. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/help.js +0 -0
  297. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/help.txt +0 -0
  298. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/link-local.js +0 -0
  299. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/link-production.js +0 -0
  300. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/list.js +0 -0
  301. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/remove.js +0 -0
  302. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/rm.js +0 -0
  303. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/use.js +0 -0
  304. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/view/add.js +0 -0
  305. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/README.md +0 -0
  306. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/build.json +0 -0
  307. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/package.json +0 -0
  308. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/src/main.js +0 -0
  309. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/config.js +0 -0
  310. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cron/README.md +0 -0
  311. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cron/package.json +0 -0
  312. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cron/src/main.js +0 -0
  313. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/LICENSE +0 -0
  314. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/README.md +0 -0
  315. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/2025-03-14_13-41-20_UTC.dat +0 -0
  316. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/public_suffix_list.dat +0 -0
  317. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/public_suffix_list.dat.br +0 -0
  318. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/package.json +0 -0
  319. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/src/main.js +0 -0
  320. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/generator/index.js +0 -0
  321. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/index.js +0 -0
  322. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/LICENSE +0 -0
  323. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/README.md +0 -0
  324. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/package.json +0 -0
  325. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/src/main.js +0 -0
  326. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/README.md +0 -0
  327. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/package.json +0 -0
  328. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/default/index.js +0 -0
  329. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/file/index.js +0 -0
  330. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  331. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  332. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/mq/index.js +0 -0
  333. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/mq/listener.js +0 -0
  334. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/mq/speaker.js +0 -0
  335. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/helper.js +0 -0
  336. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/main.js +0 -0
  337. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/math/index.js +0 -0
  338. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/merge/README.md +0 -0
  339. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/merge/package.json +0 -0
  340. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/merge/src/main.js +0 -0
  341. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/model.js +0 -0
  342. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/proc.js +0 -0
  343. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/README.md +0 -0
  344. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/build.json +0 -0
  345. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/package.json +0 -0
  346. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/src/main.js +0 -0
  347. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/shell.js +0 -0
  348. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/swig-filters/README.md +0 -0
  349. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/swig-filters/package.json +0 -0
  350. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/swig-filters/src/main.js +0 -0
  351. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/url/README.md +0 -0
  352. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/url/index.js +0 -0
  353. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/url/routing.json +0 -0
  354. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/validator.js +0 -0
  355. /package/framework/{v0.1.8 → v0.1.9-alpha.2}/package.json +0 -0
@@ -0,0 +1,33 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [develop, master]
6
+ pull_request:
7
+ branches: [develop, master]
8
+
9
+ jobs:
10
+ test:
11
+ name: Node.js ${{ matrix.node-version }}
12
+ runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ node-version: [18, 20, 22]
18
+
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+
22
+ - name: Use Node.js ${{ matrix.node-version }}
23
+ uses: actions/setup-node@v4
24
+ with:
25
+ node-version: ${{ matrix.node-version }}
26
+
27
+ - name: Run tests
28
+ run: |
29
+ node --test \
30
+ 'test/core/*.test.js' \
31
+ 'test/lib/*.test.js' \
32
+ 'test/bin/*.test.js' \
33
+ 'test/integration/helper.test.js'
package/CONTRIBUTING.md CHANGED
@@ -170,7 +170,7 @@ Before opening a PR against `develop`:
170
170
  - [ ] New behaviour is covered by a test (or an explanation is provided for why it cannot be)
171
171
  - [ ] A `changie new` entry exists for any user-facing change
172
172
  - [ ] Commit messages follow the style above
173
- - [ ] Docs updated if public API, CLI, or config schema changed
173
+ - [ ] Docs updated if public API, CLI, or config schema changed (see [gina-io/docs/CONTRIBUTING.md](https://github.com/gina-io/docs/blob/main/CONTRIBUTING.md))
174
174
 
175
175
  ---
176
176
 
@@ -188,3 +188,12 @@ Open a [GitHub issue](https://github.com/Rhinostone/gina/issues) and include:
188
188
  ## Proposing features
189
189
 
190
190
  Open a GitHub issue describing the use case **before** writing code. Features that align with the [roadmap](./ROADMAP.md) and architecture are most likely to be accepted. Significant API changes go through a public discussion period before being finalised.
191
+
192
+ ---
193
+
194
+ ## Maintainers
195
+
196
+ | Name | Role | Profile |
197
+ | --- | --- | --- |
198
+ | Martin Luther | Lead maintainer | [rhinostone.com](https://rhinostone.com) |
199
+ | Fabrice Delaneau | Co-author | [fdelaneau.com](https://fdelaneau.com) |
package/GOVERNANCE.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gina follows the **BDFL** (Benevolent Dictator For Life) model with a commitment to transparency.
4
4
 
5
- Gina is developed and maintained by **Martin Luther** ([Rhinostone](https://www.rhinostone.com/)). Final decisions on direction, API design, and releases rest with the maintainer. Community contributions and RFCs are welcome and taken seriously.
5
+ Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **Fabrice Delaneau** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously.
6
6
 
7
7
  ## How decisions are made
8
8
 
package/README.md CHANGED
@@ -1,21 +1,40 @@
1
1
  # Gina <img src="https://gina.io/favicon-16x16.png" alt="Gina icon" style="position: absolute; top:10px; margin-right: 10px;" />
2
2
 
3
- [![GitHub version](https://badge.fury.io/gh/Rhinostone%2Fgina.svg)](https://badge.fury.io/gh/Rhinostone%2Fgina) [![npm version](https://badge.fury.io/js/gina.svg)](https://badge.fury.io/js/gina)
3
+ [![npm version](https://badge.fury.io/js/gina.svg)](https://badge.fury.io/js/gina) [![GitHub version](https://badge.fury.io/gh/Rhinostone%2Fgina.svg)](https://badge.fury.io/gh/Rhinostone%2Fgina) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Node.js >= 18](https://img.shields.io/badge/node-%3E%3D%2018-brightgreen)](https://nodejs.org) [![Tests](https://github.com/Rhinostone/gina/actions/workflows/test.yml/badge.svg)](https://github.com/Rhinostone/gina/actions/workflows/test.yml)
4
4
 
5
- > **Documentation:** [https://gina.io/docs/](https://gina.io/docs/)
5
+ > **Documentation:** [https://gina.io/docs/](https://gina.io/docs/) · **Issues:** [GitHub](https://github.com/Rhinostone/gina/issues)
6
6
 
7
- <strong>Gina I/O</strong> - Node.js MVC and Event Driven framework
7
+ Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency.
8
8
 
9
- > We are looking for people to help us test and improve `Windows` support.
10
- > Meanwhile, __Windows users__ can use Docker or an alternative to run Gina and their projects.
9
+ - **HTTP/2 first.** Built-in HTTP/2 server (`isaac`) with TLS, connection warmup, graceful shutdown, and GOAWAY retry — no Express or Connect required.
10
+ - **Multi-bundle.** One project hosts multiple independent bundles (API, web, admin, …). Each bundle has its own routing, controllers, models, and config. Share code via the project layer.
11
+ - **Scope isolation.** Run `local`, `beta`, and `production` from the same codebase. Scopes propagate through routing, config interpolation, and data (every DB record is stamped with `_scope`).
11
12
 
12
- ## Philosophy behind
13
+ ## Features
13
14
 
14
- Gina was designed to be accessible, flexible, scalable and maintainable. Our main purpose was to allow developers to create easier and faster web applications.
15
+ | Feature | Detail |
16
+ | --- | --- |
17
+ | HTTP/2 server | Built-in `isaac` engine — TLS, h2c, ALPN, HTTP/1.1 fallback |
18
+ | Multi-bundle | One project, N independent bundles with shared config layer |
19
+ | Scope isolation | `local` / `beta` / `production` — per-request and per-record |
20
+ | MVC routing | `routing.json` — no code needed to declare a route |
21
+ | ORM / entities | EventEmitter-based entity system, Couchbase connector included |
22
+ | Template engine | Swig 1.4.2 (built-in, patched) — Nunjucks coming in 0.5.0 |
23
+ | Hot reload | Dev-mode module cache eviction on every request |
24
+ | K8s ready | `gina-container`, `gina-init`, SIGTERM drain, JSON stdout logging |
25
+ | Dependency injection | Mockable connectors and config for unit testing |
15
26
 
16
- Gina comes with essential features at this moment, but most of the things we don't have yet can be replaced by some alternatives written in other languages like: Ruby, PHP, .net, Python or C++. You are free to use such alternatives until we implement similar features.
27
+ ## Quick start
17
28
 
18
- Note that Gina does not rely on Connect or ExpressJS, still, you can use all plugins or middlewares designed for those frameworks ;-)
29
+ ```bash
30
+ npm install -g gina@latest --prefix=~/.npm-global # install
31
+ gina new myproject # scaffold project
32
+ gina bundle:add api @myproject # add a bundle
33
+ gina bundle:start api @myproject # start
34
+ open https://localhost:3100 # browse
35
+ ```
36
+
37
+ ---
19
38
 
20
39
  ## Getting started with Gina I/O
21
40
 
@@ -621,7 +640,7 @@ For the full documentation, visit [https://gina.io/docs/](https://gina.io/docs/)
621
640
 
622
641
  ## Governance
623
642
 
624
- Gina is led by Martin Luther (Rhinostone). Final decisions on direction, API design, and releases rest with the maintainer. Community contributions and RFCs are welcome and taken seriously. See [GOVERNANCE.md](./GOVERNANCE.md) for details.
643
+ Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **Fabrice Delaneau** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously. See [GOVERNANCE.md](./GOVERNANCE.md) for details.
625
644
 
626
645
  ## License (MIT)
627
646
 
package/ROADMAP.md CHANGED
@@ -11,10 +11,10 @@ This roadmap covers planned features, architectural improvements, new connectors
11
11
  | Period | Version | Focus |
12
12
  | --- | --- | --- |
13
13
  | **Apr 2026** | `0.1.8` ✅ | Scaffold correctness · K8s support · Dependency injection · Automatic version migration |
14
- | **Q2 2026** | `0.2.0` | Stability · WatcherService · Redis & SQLite connectors · K8s session storage · Startup cache |
15
- | **Q3 2026** | `0.3.0` | Async/await · Dev hot-reload · MySQL & PostgreSQL connectors · AI Phase 2 · Tutorials · Mobile backend guide · Route radix tree |
16
- | **Q4 2026** | `0.4.0` | TypeScript declarations · AI agents (OpenAPI, MCP) · ScyllaDB connector · PWA scaffold · Advanced tutorial · Website redesign · Bun investigation |
17
- | **Q1 2027** | `0.5.0` | ESM support · Template engine migration · Structured logging |
14
+ | **Q2 2026** | `0.2.0` | Stability · WatcherService · Redis & SQLite connectors · K8s session storage · Startup cache · Pointer compression · Couchbase v2 deprecation · Couchbase security & critical bug fixes · HTTP/2 security hardening |
15
+ | **Q3 2026** | `0.3.0` | Async/await · Dev hot-reload · MySQL & PostgreSQL connectors · AI Phase 2 · Tutorials · Mobile backend guide · Route radix tree · Connector peerDependencies · 103 Early Hints · HTTP/2 observability · Security & CVE page · Couchbase connector hardening |
16
+ | **Q4 2026** | `0.4.0` | TypeScript declarations · AI agents (OpenAPI, MCP) · ScyllaDB connector · PWA scaffold · Advanced tutorial · Website redesign · Docs offline ZIP · Bun investigation · Couchbase v2 removal · HTTP/2 hardening · Trailer support |
17
+ | **Q1 2027** | `0.5.0` | ESM support · Template engine migration · Structured logging · Alt-Svc · HTTP/2 priorities · WebSocket over HTTP/2 |
18
18
  | **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
19
19
 
20
20
  ---
@@ -35,9 +35,9 @@ This roadmap covers planned features, architectural improvements, new connectors
35
35
 
36
36
  | Status | Feature | Version | Target |
37
37
  | --- | --- | --- | --- |
38
- | 📋 | **Per-request controller instances** — Each request gets its own controller instance, eliminating shared mutable state under concurrency. | `0.2.0` | Q2 2026 |
38
+ | 📋 | **Per-request controller instances** — Each HTTP request gets its own isolated controller instance with its own request state. Removes dead singleton infrastructure and fixes edge-case memory retention in error paths. | `0.2.0` | Q2 2026 |
39
39
  | 📋 | **Entity `_arguments` buffer scoped to call** — Move the event result buffer from the entity to the individual call, preventing concurrent callers from sharing state. | `0.2.0` | Q2 2026 |
40
- | 📋 | **Retire `freeMemory`** — Once per-request instances land (#M1), there is no shared `local` closure to null. Replace `freeMemory` call sites with explicit `local.req = null; local.res = null; local.next = null` at response exit points. | `0.2.0` | Q2 2026 |
40
+ | | **Retire `freeMemory`** — Once per-request instances land (#M1), there is no shared `local` closure to null. Replace `freeMemory` call sites with explicit `local.req = null; local.res = null; local.next = null` at response exit points. | `0.2.0` | Q2 2026 |
41
41
 
42
42
  ### Phase 2 — Async
43
43
 
@@ -67,6 +67,7 @@ This roadmap covers planned features, architectural improvements, new connectors
67
67
  | 📋 | **ESM compatibility layer** — Dual CJS/ESM entry points via `"exports"` in `package.json`. Framework internals stay CJS; public API gets ESM re-exports. | `0.5.0` | Q1 2027 |
68
68
  | 📋 | **Pluggable template engine** — Swig 1.4.2 stays fully integrated and remains the default. Nunjucks added as a supported alternative (opt-in per project via config). The render layer is abstracted behind a common interface so both engines co-exist. Switching to Nunjucks requires a per-project migration guide (breaking differences: `{% parent %}` → `{{ super() }}`, filter renames, autoescape default, `date` format strings, no `{% spaceless %}` — see docs). | `0.5.0` | Q1 2027 |
69
69
  | 📋 | **Structured logging** — JSON log output (`{ level, message, bundle, requestId, durationMs }`). Additive — existing consumers are unaffected. Enables log aggregation (Loki, Datadog, CloudWatch). | `0.5.0` | Q1 2027 |
70
+ | 📋 | **Research `AsyncLocalStorage` for request context** — Evaluate `node:async_hooks` `AsyncLocalStorage` as a replacement for the `local` closure pattern, giving true async isolation across `setTimeout`, Promises, and `async/await` chains without any closure threading. Output: decision doc + proof-of-concept branch. | `0.5.0` | Q1 2027 |
70
71
 
71
72
  ---
72
73
 
@@ -76,12 +77,47 @@ New database connectors follow the same interface as the existing Couchbase conn
76
77
 
77
78
  | Status | Connector | Version | Target | Notes |
78
79
  | --- | --- | --- | --- | --- |
79
- | 📋 | **Redis** | `0.2.0` | Q2 2026 | Session store and general-purpose cache. Client: `ioredis`. Required for K8s horizontal scaling. |
80
- | 📋 | **SQLite** | `0.2.0` | Q2 2026 | Three use cases: framework state storage (replaces JSON files under `~/.gina/`), session store for single-pod/dev deployments, and embedded ORM connector. Uses `node:sqlite` (Node.js built-in since v22.5.0 — zero npm deps). |
80
+ | | **Redis** | `0.2.0` | Q2 2026 | Session store and general-purpose cache. Client: `ioredis`. Required for K8s horizontal scaling. |
81
+ | 🔶 | **SQLite** | `0.2.0` | Q2 2026 | Three use cases: framework state storage (replaces JSON files under `~/.gina/`), session store for single-pod/dev deployments, and embedded ORM connector. Uses `node:sqlite` (Node.js built-in since v22.5.0 — zero npm deps). Session store done (v1); ORM and state storage deferred. |
81
82
  | 📋 | **MySQL / MariaDB** | `0.3.0` | Q3 2026 | ORM connector. Client: `mysql2`. |
82
83
  | 📋 | **PostgreSQL** | `0.3.0` | Q3 2026 | ORM connector. Client: `pg` (node-postgres). |
83
84
  | 📋 | **ScyllaDB** | `0.4.0` | Q4 2026 | Cassandra-compatible wide-column store. Client: `@scylladb/scylla-driver`. |
84
85
  | 📋 | **MongoDB** | `0.4.0` | Q4 2026 | Document store connector. Client: `mongodb` (official driver). Interface approach TBD — MongoDB's document model differs from the N1QL/SQL pattern used by existing connectors. |
86
+ | ✅ | **Couchbase SDK v2 deprecation** | `0.2.0` | 2026-03-27 | Couchbase Server SDK v2 reached end-of-life in 2021. `connector.v2.js` now logs a deprecation warning at connection time, and a fatal error when V8 pointer compression is active (NAN bindings are incompatible). Upgrade path: set `sdk.version` to `3` or `4` in your bundle's `connectors.json`. |
87
+ | 📋 | **Couchbase SDK v2 removal** | `0.4.0` | Q4 2026 | `connector.v2.js` and all `sdk.version <= 2` branches removed. Default falls back to v3 when `sdk.version` is unset. Full migration guide in `CHANGELOG.md`. |
88
+ | 📋 | **`peerDependencies` for connector clients** | `0.3.0` | Q3 2026 | Connector client libraries (`ioredis`, `mysql2`, `pg`, `mongodb`, `@scylladb/scylla-driver`, `couchbase`) are loaded from the user's project — gina has zero runtime npm dependencies. `peerDependencies` (all optional) will signal the tested version range and surface an `npm install` compatibility warning when a user pins an untested version. |
89
+
90
+ ---
91
+
92
+ ## Couchbase Connector Hardening
93
+
94
+ A cold audit of the Couchbase connector identified two critical security vulnerabilities and four high-severity bugs. All items are contained to specific code paths and do not affect the common case (v4 SDK, Promise API, no `useRestApi`), but they should be resolved before the next stable release.
95
+
96
+ ### Critical — Security
97
+
98
+ | Status | Feature | Version | Target |
99
+ | --- | --- | --- | --- |
100
+ | ✅ | **Credential exposure in process list (`restQuery`)** — The `useRestApi: true` path built a shell command containing `-u username:password` passed to `exec()`. Plaintext credentials were visible in `ps aux` for the duration of the call. Fixed: replaced `exec()` with `execFile()` — credentials passed as positional arguments, never in the shell string. | `0.2.0` | 2026-03-27 |
101
+ | ✅ | **Shell command injection in `restQuery`** — The same `exec()` path joined the N1QL statement and query parameters into a single shell string. Metacharacters (`$`, `;`, `&`, `|`, backtick) in parameters were not neutralised. Fixed: same change as above — `execFile()` eliminates the shell entirely. | `0.2.0` | 2026-03-27 |
102
+
103
+ ### High — Bugs
104
+
105
+ | Status | Feature | Version | Target |
106
+ | --- | --- | --- | --- |
107
+ | ✅ | **`gina.onError()` handler accumulates on every reconnect** — The error handler was registered inside `onConnect()`, which fired on every reconnection. After N reconnects, N stacked handlers raced on the same error. Fixed: `_errorHandlerRegistered` guard ensures the handler is registered only once per connector instance. | `0.2.0` | 2026-03-27 |
108
+ | ✅ | **`session-store.v3 get()` always returns "session not found"** — `.then()/.catch()` callbacks are microtasks; the `if (!data)` guard ran synchronously before they resolved. Every session read returned empty. Fixed: rewrote `get()` with `async/await`, matching the v4 store. | `0.2.0` | 2026-03-27 |
109
+ | ✅ | **`session-store.v3 set()` silently discards writes** — Same async/sync confusion. `fn(false, null)` was called before the upsert Promise resolved. Fixed: rewrote `set()` with `async/await`. | `0.2.0` | 2026-03-27 |
110
+ | ✅ | **Infinite recursion when `keepAlive: false`** — The `else` branch in `ping()` called itself unconditionally. Stack overflow on first connection with `keepAlive: false`. Fixed: replaced the unconditional self-call with `return`. | `0.2.0` | 2026-03-27 |
111
+
112
+ ### Medium
113
+
114
+ | Status | Feature | Version | Target |
115
+ | --- | --- | --- | --- |
116
+ | ✅ | **300ms arbitrary startup delay** — A `setTimeout(300)` was firing `ready` instead of a condition. Added 300ms to every Couchbase-connected bundle startup and was unreliable under load. Fixed: `self.emit('ready')` now fires directly. | `0.3.0` | 2026-03-28 |
117
+ | ✅ | **`ping()` drops reconnection callback in v2/v3** — `typeof(next)` was checked but `next` was not in scope, so reconnect-from-ping always called `connect()` without a callback, silently swallowing errors. Fixed: changed to `typeof(ncb)` and pass `ncb` on reconnect. | `0.3.0` | 2026-03-28 |
118
+ | ✅ | **Stack traces in HTTP 500 responses** — `err.stack` was included in the JSON sent to the HTTP client, exposing absolute filesystem paths and internal module names. Fixed: stack logged server-side; client receives only the error message. | `0.3.0` | 2026-03-27 |
119
+ | ✅ | **`eval()` for `@options` parsing** — `@options` directives in `.sql` files were evaluated with `eval()`. Fixed: replaced with a regex key-normalisation pass then `JSON.parse()` — handles all production value shapes correctly. | `0.3.0` | 2026-03-28 |
120
+ | ✅ | **`bulkInsert` does not return a Promise** — Unlike all other N1QL entity methods, `bulkInsert` returned a plain `{onComplete: fn}` object. Fixed: converted to the Option B Promise pattern with `.onComplete(cb)` chaining. | `0.3.0` | 2026-03-28 |
85
121
 
86
122
  ---
87
123
 
@@ -93,7 +129,25 @@ New database connectors follow the same interface as the existing Couchbase conn
93
129
  | ✅ | **`gina-container` foreground launcher** — Drop-in entrypoint for Docker/K8s. Spawns the bundle non-detached, forwards SIGTERM, exits with the child's code. No framework socket server required. | `0.1.8` | 2026-03-06 |
94
130
  | ✅ | **Stdout/stderr structured logging** — `GINA_LOG_STDOUT=true` emits JSON lines compatible with `kubectl logs`, Fluentd, and Datadog. | `0.1.8` | 2026-03-21 |
95
131
  | ✅ | **`gina-init` — stateless container bootstrap** — Generates all required `~/.gina/` config from env vars or a mounted JSON file. Idempotent. Makes the framework init-container friendly. | `0.1.8` | 2026-03-22 |
96
- | 📋 | **Session storage for horizontal scaling** — Plug-in session store backed by Redis (#CN1) for multi-pod deployments. Default in-memory store remains available for single-pod and development. | `0.2.0` | Q2 2026 |
132
+ | | **Session storage for horizontal scaling** — Redis session store (multi-pod) + SQLite session store (single-pod/dev) + full sessions guide. | `0.2.0` | Q2 2026 |
133
+
134
+ ---
135
+
136
+ ## HTTP/2
137
+
138
+ | Status | Feature | Version | Target | Notes |
139
+ | --- | --- | --- | --- | --- |
140
+ | ✅ | **Fix `/_gina/info` HTTP/2 endpoint** — `stream.end(infoStatus)` not `stream.end(infoHeaders)` | `0.2.0` | Q2 2026 | The HTTP/2 branch of the info endpoint passes the headers object instead of the JSON string. Returns `[object Object]` instead of JSON. One-line fix. |
141
+ | ✅ | **Add stream-closed guard to HTML error response** — `stream.destroyed \|\| stream.closed` check in `throwError()` | `0.2.0` | Q2 2026 | JSON error path has this guard; HTML path does not. If the stream closes during error handling, Node.js emits an unhandled error. |
142
+ | ✅ | **HTTP/2 server security settings** — `maxHeaderListSize: 65536`, `enablePush: false`, `maxSessionInvalidFrames`, `maxSessionRejectedStreams` | `0.2.0` | Q2 2026 | Four missing settings on the server. `maxHeaderListSize` prevents HPACK bomb attacks (only set on the client today). `enablePush: false` — server push is deprecated in Chrome 106+ and removed in Firefox 132+. `maxSessionInvalidFrames` and `maxSessionRejectedStreams` defend against CONTINUATION flood (CVE-2024-27316) and RST flood / rapid reset (CVE-2023-44487). |
143
+ | 📋 | **103 Early Hints** — send `Link` preload headers as informational response before the final response | `0.3.0` | Q3 2026 | `Link: <url>; rel=preload` headers are correctly built but sent with the final response. Calling `stream.additionalHeaders({ ':status': 103, 'link': links })` before `stream.respond()` allows the browser to start preloading CSS/JS while the template is still rendering. Modern replacement for server push. |
144
+ | 📋 | **HTTP/2 session metrics** — expose active session count, stream count, GOAWAY and RST_STREAM totals via `/_gina/info` | `0.3.0` | Q3 2026 | No counters exist for the session pool state. Adds observability for ops teams without requiring an external APM. |
145
+ | 📋 | **Configurable `maxConcurrentStreams` and `initialWindowSize`** — move from hardcoded to `settings.server.json` | `0.3.0` | Q3 2026 | Currently `maxConcurrentStreams: 1000` (very permissive) and `initialWindowSize: 655,350` (10× default) are hardcoded. Move to bundle config with sensible defaults (256 / 65,535). Existing deployments unaffected until they opt in. |
146
+ | 📋 | **Application-level rapid reset rate limiter** (CVE-2023-44487) — per-session stream creation counter | `0.4.0` | Q4 2026 | Node.js ≥ 20.12.1 has the OS-level fix. Add an application-level counter: if a session creates more than N streams per second, close with GOAWAY. Important for public-facing deployments. |
147
+ | 📋 | **Trailer support** — `stream.sendTrailers()` + `waitForTrailers: true` | `0.4.0` | Q4 2026 | No trailer support today. Required for gRPC-style streaming (grpc-status trailer) and content integrity use cases. Opt-in: activated only when a controller calls `self.sendTrailers(fields)`. |
148
+ | 📋 | **Alt-Svc header** — advertise HTTP/3 availability | `0.5.0` | Q1 2027 | Set `Alt-Svc: h3=":443"; ma=86400` response header to advertise HTTP/3 (QUIC) availability via a QUIC-capable reverse proxy (nginx, Caddy, Cloudflare). Gina does not need to implement QUIC — just announce it. Opt-in via `settings.server.json`. Native HTTP/3 is out of scope: Node.js has no stable QUIC API, and the standard deployment topology (Gina → proxy → client) already delivers HTTP/3 at the edge. |
149
+ | 📋 | **RFC 9218 Extensible Priorities** — read `Priority: u=N, i` request header | `0.5.0` | Q1 2027 | Use the RFC 9218 priority header to order response writes for multiplexed API clients. Low value for typical HTML page loads; high value for parallel API requests with declared urgency. |
150
+ | 📋 | **WebSocket over HTTP/2** (RFC 8441 — CONNECT method extension) | `0.5.0` | Q1 2027 | Tunnel WebSocket over an HTTP/2 stream without a separate HTTP/1.1 connection. Node.js supports this since v10.19. Enables WebSocket in HTTP/2-only deployments. |
97
151
 
98
152
  ---
99
153
 
@@ -127,9 +181,10 @@ New database connectors follow the same interface as the existing Couchbase conn
127
181
 
128
182
  | Status | Feature | Version | Target | Notes |
129
183
  | --- | --- | --- | --- | --- |
130
- | 📋 | **`NODE_COMPILE_CACHE` — V8 bytecode startup cache** | `0.2.0` | Q2 2026 | Node.js 22.8+ caches compiled V8 bytecode to disk. Set once at startup — 30–60% faster cold start on subsequent runs with zero code changes to user bundles. No-op on Node < 22.8, so safe to ship unconditionally. |
184
+ | | **`NODE_COMPILE_CACHE` — V8 bytecode startup cache** | `0.2.0` | Q2 2026 | Node.js 22.8+ caches compiled V8 bytecode to disk. Set once at startup — 30–60% faster cold start on subsequent runs with zero code changes to user bundles. No-op on Node < 22.8, so safe to ship unconditionally. |
131
185
  | 📋 | **Route radix tree — compile `routing.json` at startup** | `0.3.0` | Q3 2026 | Current router does linear matching against `routing.json` on every request. Pre-compile routes into a radix tree at bundle startup for O(log n) matching. 2–3x faster routing layer. Internal change — no user-facing API change. |
132
186
  | 📋 | **Bun runtime compatibility investigation** | `0.4.0` | Q4 2026 | Prototype Gina under Bun. Two blockers to verify: `require.cache` deletion (dev hot-reload) and `node:http2` completeness. If both pass, Bun gives 3–10x faster startup and meaningful throughput gains. Deliverable: a compatibility report. |
187
+ | ✅ | **V8 pointer compression support** | `0.2.0` | Q2 2026 | Node.js built with `--experimental-enable-pointer-compression` (e.g. [node-caged](https://github.com/platformatic/node-caged) or a custom build) delivers ~50% heap memory reduction across all pointer-heavy structures. Gina is pure JS — compatible out of the box. Adds: startup detection + `GINA_V8_POINTER_COMPRESSED` env var, Dockerfile guide with custom build recipe (full-icu + pointer compression), 4 GB ceiling documentation, N-API-only connector policy. |
133
188
 
134
189
  ---
135
190
 
@@ -149,6 +204,7 @@ Windows compatibility is a hard requirement for `1.0.0`. The alpha scope covers
149
204
  | --- | --- | --- | --- | --- |
150
205
  | 📋 | **Using Gina as a mobile backend** — REST API patterns, JSON-only bundles, token auth, CORS, HTTP/2, and the path to OpenAPI/MCP for SDK generation. Docs only — no code changes. | — | `0.3.0` | Q3 2026 |
151
206
  | 📋 | **Beginner** — Your first Gina app: install, scaffold, one route, one controller, browser response. Starts from `gina new` — no prior project needed. | 5 min | `0.3.0` | Q3 2026 |
207
+ | 📋 | **Tutorial locale detection** — Detect the reader's locale and timezone via `navigator.language` + `Intl` and pre-fill the `settings.json` scaffold example with their actual `region`, `preferedLanguages`, and `24HourTimeFormat` values. Falls back to `en_CM`. Implemented as a client-side Docusaurus component. | — | `0.3.0` | Q3 2026 |
152
208
  | 📋 | **Intermediate** — Multi-bundle setup, routing with URL params, entity + connector wiring, template rendering, form handling. Starts from scratch. | ~30 min | `0.3.0` | Q3 2026 |
153
209
  | 📋 | **Advanced** — Full production project: authentication, scoped data isolation, async/await, HTTP/2, structured logging, Docker/K8s deployment. Starts from the intermediate tutorial's finished state. | ~60 min | `0.4.0` | Q4 2026 |
154
210
 
@@ -159,7 +215,9 @@ Windows compatibility is a hard requirement for `1.0.0`. The alpha scope covers
159
215
  | Status | Feature | Version | Target |
160
216
  | --- | --- | --- | --- |
161
217
  | 📋 | **Official website redesign + docs integration** — Refactor gina.io as a proper project homepage (landing page, feature highlights, showcase) with the documentation fully integrated. Single coherent web presence. Prerequisite: tutorials complete. | `0.4.0` | Q4 2026 |
218
+ | 📋 | **Docs offline ZIP** — One-click download of the complete gina.io documentation as a static HTML ZIP archive. Generated at deploy time by the Docusaurus build pipeline — no server-side logic required. Targeted at users in regions with limited or expensive internet access (offline-first for the African market). | `0.4.0` | Q4 2026 |
219
+ | 📋 | **Security & CVE compliance page** — Dedicated docs page listing the HTTP/2 CVEs addressed by Gina and the Node.js version required for each mitigation. Covers CVE-2023-44487 (Rapid Reset), CVE-2024-27316 / CVE-2024-27983 (CONTINUATION flood), CVE-2019-9514 (RST flood), and the nghttp2-mitigated ping/settings floods. Docs only — no code changes. | `0.3.0` | Q3 2026 |
162
220
 
163
221
  ---
164
222
 
165
- *Last updated: 2026-03-27 · To suggest a feature, [open an issue](https://github.com/Rhinostone/gina/issues).*
223
+ *Last updated: 2026-03-28 · To suggest a feature, [open an issue](https://github.com/Rhinostone/gina/issues).*
@@ -0,0 +1 @@
1
+ 0.1.9-alpha.2
@@ -1,9 +1,7 @@
1
- //"use strict";
1
+ "use strict";
2
2
  // Imports.
3
3
  var fs = require('fs');
4
- const { version } = require('os');
5
- //var util = require('util');
6
- //var promisify = require('util').promisify;
4
+ // CB-LOW-3 fix: removed dead `const { version } = require('os')` — `version` was never referenced.
7
5
  // Use couchbase module from the user's project dependencies if not found
8
6
  var couchbasePath = _(getPath('project') +'/node_modules/couchbase');
9
7
  var couchbase = require(couchbasePath);
@@ -239,7 +237,22 @@ function Couchbase(conn, infos) {
239
237
 
240
238
  optionsArr = queryString.match(/\@options \{(.*)\}/gm);
241
239
  if (optionsArr) {
242
- eval('options='+optionsArr[0].replace(/\@options\ /, ''));
240
+ // CB-QUAL-2 fix: replaced eval() with JSON.parse() for @options parsing.
241
+ // @options uses JavaScript object literal syntax with unquoted keys
242
+ // (e.g. { consistency: "request_plus" }) — not strict JSON.
243
+ // We normalise unquoted property names to quoted form before parsing so
244
+ // JSON.parse() can handle them. Parse errors now surface explicitly
245
+ // instead of silently corrupting the `options` variable in scope.
246
+ // Original broken implementation:
247
+ // eval('options='+optionsArr[0].replace(/\@options\ /, ''));
248
+ try {
249
+ var _rawOpts = optionsArr[0].replace(/\@options\s+/, '');
250
+ // Quote any bare identifier keys: { foo: → { "foo":
251
+ var _jsonOpts = _rawOpts.replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)(\s*:)/g, '$1"$2"$3');
252
+ options = JSON.parse(_jsonOpts);
253
+ } catch (parseErr) {
254
+ console.warn('[CONNECTOR] @options parse error in .sql file: ' + parseErr.message);
255
+ }
243
256
  }
244
257
  optionsArr = null;
245
258
 
@@ -1015,7 +1028,9 @@ function Couchbase(conn, infos) {
1015
1028
  rec[id].values._collection = this._collection;
1016
1029
  rec[id].values._scope = this._scope;
1017
1030
 
1018
- queryString += '\t\nVALUES ("'+ id +'", '+ JSON.stringify(rec[id].values) +'),';
1031
+ // CB-QUAL-4 fix: id was interpolated bare — a key containing `"` broke the N1QL string.
1032
+ // JSON.stringify() escapes any special characters and wraps in double quotes.
1033
+ queryString += '\t\nVALUES ('+ JSON.stringify(String(id)) +', '+ JSON.stringify(rec[id].values) +'),';
1019
1034
  recCount++;
1020
1035
  }
1021
1036
 
@@ -1116,17 +1131,49 @@ function Couchbase(conn, infos) {
1116
1131
  }
1117
1132
 
1118
1133
 
1119
- return {
1120
- onComplete : function(cb) {
1121
- self.once(trigger, function(err, data, meta){
1122
- if (envIsDev) {
1123
- console.debug('[ bulkInsert triggerd ] '+ trigger + ' - Rec count: '+ recCount);
1124
- }
1134
+ // CB-QUAL-3 fix: bulkInsert previously returned a plain {onComplete} _proto object.
1135
+ // `await entity.bulkInsert(...)` resolved to the object, not the data — silently
1136
+ // wrong for any async controller using bulkInsert. Fixed with the same Option B
1137
+ // Promise + .onComplete() pattern used by all other N1QL entity methods.
1138
+ // Original broken implementation:
1139
+ // return {
1140
+ // onComplete : function(cb) {
1141
+ // self.once(trigger, function(err, data, meta){
1142
+ // if (envIsDev) {
1143
+ // console.debug('[ bulkInsert triggerd ] '+ trigger + ' - Rec count: '+ recCount);
1144
+ // }
1145
+ // cb(err, data, meta)
1146
+ // })
1147
+ // }
1148
+ // }
1149
+ var _resolve, _reject, _internalData, _internalMeta;
1150
+ var _promise = new Promise(function(resolve, reject) {
1151
+ _resolve = resolve;
1152
+ _reject = reject;
1153
+ });
1154
+
1155
+ _promise.onComplete = function(cb) {
1156
+ _promise.then(
1157
+ function() { cb(null, _internalData, _internalMeta); },
1158
+ function(err) { cb(err); }
1159
+ );
1160
+ return _promise;
1161
+ };
1125
1162
 
1126
- cb(err, data, meta)
1127
- })
1163
+ self.once(trigger, function(err, data, meta){
1164
+ if (envIsDev) {
1165
+ console.debug('[ bulkInsert triggered ] '+ trigger + ' - Rec count: '+ recCount);
1128
1166
  }
1129
- }
1167
+ if (err) {
1168
+ _reject(err);
1169
+ } else {
1170
+ _internalData = data;
1171
+ _internalMeta = meta;
1172
+ _resolve(data);
1173
+ }
1174
+ });
1175
+
1176
+ return _promise;
1130
1177
 
1131
1178
  } catch (err) {
1132
1179
  console.error(err.stack);
@@ -13,7 +13,8 @@ var merge = lib.merge;
13
13
  var modelUtil = new lib.Model();
14
14
 
15
15
  //globalized
16
- uuid = require('uuid');
16
+ // CB-LOW-1 fix: uuid was assigned without `var`, leaking into global.uuid.
17
+ var uuid = require('uuid');
17
18
  N1qlQuery = couchbase.N1qlQuery || null;
18
19
  N1qlStringQuery = couchbase.N1qlStringQuery || null;
19
20
  ViewQuery = couchbase.ViewQuery || null;
@@ -64,8 +65,15 @@ function Connector(dbString) {
64
65
  self.instance.reconnected = self.instance.connected = false;
65
66
  console.error('[ CONNECTOR ][ ' + local.bundle +' ] couchbase could not be reached !!\n'+ ( err.stack || err.message || err ) );
66
67
 
67
- // reconnecting
68
- console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] trying to reconnect in a few secs...');
68
+ // CB-LOW-5 fix: exponential backoff replaces hardcoded 5s retry.
69
+ // Delay sequence: 5s 10s 20s 40s 60s (cap). Counter reset in onConnect().
70
+ self._reconnectAttempts = (self._reconnectAttempts || 0) + 1;
71
+ var _backoffDelay = Math.min(5000 * Math.pow(2, self._reconnectAttempts - 1), 60000);
72
+ if (self._reconnectAttempts >= 10) {
73
+ console.error('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — max backoff reached (' + (_backoffDelay/1000) + 's). Couchbase may be unavailable.');
74
+ } else {
75
+ console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — retrying in ' + (_backoffDelay/1000) + 's...');
76
+ }
69
77
  self.instance.reconnecting = true;
70
78
 
71
79
  setTimeout( function onRetry(){
@@ -74,7 +82,7 @@ function Connector(dbString) {
74
82
  } else {
75
83
  self.connect(dbString);
76
84
  }
77
- }, 5000);
85
+ }, _backoffDelay);
78
86
 
79
87
  };
80
88
 
@@ -83,6 +91,20 @@ function Connector(dbString) {
83
91
  console.debug('[ CONNECTOR ][ ' + local.bundle +' ] couchbase is alive !!');
84
92
  console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.connector +' ] now connected...');
85
93
 
94
+ // #CB-V2-DEPRECATED — Couchbase SDK v2 reached end-of-life in 2021.
95
+ // Formal deprecation in gina 0.2.0 (Q2 2026). Removal planned for gina 0.4.0 (Q4 2026).
96
+ // To upgrade: set sdk.version to 3 or 4 in your bundle's connectors.json.
97
+ console.warn('[ CONNECTOR ][ couchbase ] SDK v2 is deprecated and will be removed in gina 0.4.0. '
98
+ + 'Couchbase Server SDK v2 reached end-of-life in 2021. '
99
+ + 'Update your bundle\'s connectors.json: set sdk.version to 3 or 4.');
100
+ if (/^true$/i.test(process.env.GINA_V8_POINTER_COMPRESSED)) {
101
+ console.error('[ CONNECTOR ][ couchbase ] FATAL: SDK v2 uses NAN bindings which are incompatible '
102
+ + 'with V8 pointer compression. The process may segfault. '
103
+ + 'Switch to sdk.version 3 or 4 in connectors.json immediately.');
104
+ }
105
+
106
+ // CB-LOW-5 fix: reset backoff counter on successful (re)connect.
107
+ self._reconnectAttempts = 0;
86
108
  self.instance.reconnected = self.instance.connected = true;
87
109
  var options = local.options;
88
110
 
@@ -105,8 +127,8 @@ function Connector(dbString) {
105
127
  console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ '+ env +' ] connected to couchbase !!');
106
128
 
107
129
 
108
- modelUtil.setConnection(bundle, name, self.instance);
109
-
130
+ // CB-PERF-3 fix: first setConnection call was redundant (identical args, outside the existsSync guard)
131
+ // modelUtil.setConnection(bundle, name, self.instance);
110
132
  if ( fs.existsSync(modelsPath) ) {
111
133
  modelUtil.setConnection(bundle, name, self.instance);
112
134
  modelUtil.reloadModels(
@@ -124,7 +146,12 @@ function Connector(dbString) {
124
146
  }
125
147
  });
126
148
  // intercepting conn event thru gina
127
- gina.onError(function(err, req, res, next){
149
+ // CB-BUG-1 fix: guard against handler accumulation on reconnect
150
+ // — onConnect() fires on every reconnection; without this guard each reconnect stacks a new gina.onError handler,
151
+ // and N handlers all race to call res.end() on the same error, causing "Cannot set headers after sent"
152
+ if (!self._errorHandlerRegistered) {
153
+ self._errorHandlerRegistered = true;
154
+ gina.onError(function(err, req, res, next){
128
155
  // (code) message
129
156
  // (16) Generic network failure. Enable detailed error codes (via LCB_CNTL_DETAILED_ERRCODES, or via `detailed_errcodes` in the connection string) and/or enable logging to get more information
130
157
  // (23) Client-Side timeout exceeded for operation. Inspect network conditions or increase the timeout
@@ -141,8 +168,14 @@ function Connector(dbString) {
141
168
  //|| err instanceof couchbase.Error && err.code == 23 && !self.reconnecting
142
169
  || /cannot perform operations on a shutdown bucket/.test(err.message ) && !self.reconnecting && !self.reconnected
143
170
  ) {
144
- // reconnecting
145
- console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] trying to reconnect in 5 secs...');
171
+ // CB-LOW-5 fix: exponential backoff (shared counter with connect onError).
172
+ self._reconnectAttempts = (self._reconnectAttempts || 0) + 1;
173
+ var _backoffDelay = Math.min(5000 * Math.pow(2, self._reconnectAttempts - 1), 60000);
174
+ if (self._reconnectAttempts >= 10) {
175
+ console.error('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — max backoff reached (' + (_backoffDelay/1000) + 's). Couchbase may be unavailable.');
176
+ } else {
177
+ console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — retrying in ' + (_backoffDelay/1000) + 's...');
178
+ }
146
179
  self.reconnecting = true;
147
180
 
148
181
  setTimeout( function onRetry(){
@@ -151,7 +184,7 @@ function Connector(dbString) {
151
184
  } else {
152
185
  self.connect(dbString)
153
186
  }
154
- }, 5000)
187
+ }, _backoffDelay)
155
188
 
156
189
  } else if (err instanceof couchbase.Error && err.code == 23 && !self.reconnecting) {
157
190
  self.instance.disconnect();
@@ -169,10 +202,10 @@ function Connector(dbString) {
169
202
  console.error('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] gina fatal error ('+ err.code +'): ' + (err.message||err) + '\nstack: '+ err.stack);
170
203
 
171
204
  if ( typeof(err) == 'object' ) {
205
+ // CB-QUAL-1 fix: stack trace removed — logged server-side only, never sent to client
172
206
  res.end(JSON.stringify({
173
207
  status: 500,
174
- error: err.message,
175
- stack: err.stack
208
+ error: err.message
176
209
  }))
177
210
  } else {
178
211
  res.end(err)
@@ -189,7 +222,8 @@ function Connector(dbString) {
189
222
  }
190
223
  }
191
224
  }
192
- });
225
+ });
226
+ }
193
227
 
194
228
 
195
229
  self.emit('ready', false, self.instance);
@@ -398,7 +432,11 @@ function Connector(dbString) {
398
432
 
399
433
  self.instance.reconnected = false;
400
434
  self.instance.reconnecting = true;
401
- if ( typeof(next) != 'undefined' ) {
435
+ // CB-PERF-2 fix: `next` was not in scope inside ping() — typeof(next)
436
+ // always evaluated to 'undefined', so reconnect from ping never passed
437
+ // the callback and errors were silently dropped. Fixed to use `ncb`
438
+ // (the no-connection callback param of ping(interval, cb, ncb)).
439
+ if ( typeof(ncb) != 'undefined' ) {
402
440
  self.connect(dbString, ncb);
403
441
  } else {
404
442
  self.connect(dbString);
@@ -411,8 +449,10 @@ function Connector(dbString) {
411
449
  }, interval);
412
450
  ncb(cb);
413
451
  } else {
414
- console.debug('[ CONNECTOR ][ ' + local.bundle +' ] sent ping to couchbase ...');
415
- self.ping(interval, cb, ncb);
452
+ // CB-BUG-4 fix: keepAlive is false ping is a no-op; do not recurse
453
+ // old: console.debug('[ CONNECTOR ][ ' + local.bundle +' ] sent ping to couchbase ...');
454
+ // old: self.ping(interval, cb, ncb); ← unconditional recursion → stack overflow
455
+ return;
416
456
  }
417
457
  };
418
458