gina 0.3.9-alpha.1 → 0.3.9

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 (379) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/ROADMAP.md +11 -5
  3. package/framework/v0.3.9/VERSION +1 -0
  4. package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v4.js +10 -0
  5. package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-nunjucks.js +92 -5
  6. package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/gna.js +7 -0
  7. package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/server.js +25 -1
  8. package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-filters/src/main.js +7 -0
  9. package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-filters/src/main.js +7 -0
  10. package/framework/{v0.3.9-alpha.1 → v0.3.9}/package.json +1 -1
  11. package/gna.js +4 -4
  12. package/llms.txt +4 -0
  13. package/package.json +2 -2
  14. package/framework/v0.3.9-alpha.1/VERSION +0 -1
  15. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/AUTHORS +0 -0
  16. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/LICENSE +0 -0
  17. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/html/nolayout.html +0 -0
  18. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/html/static.html +0 -0
  19. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/android-chrome-192x192.png +0 -0
  20. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/android-chrome-512x512.png +0 -0
  21. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/apple-touch-icon.png +0 -0
  22. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/favicon-16x16.png +0 -0
  23. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/favicon-32x32.png +0 -0
  24. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/favicon.ico +0 -0
  25. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/README.md +0 -0
  26. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  27. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  28. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  29. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  30. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  31. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  32. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  33. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  34. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  35. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  36. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  37. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  38. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  39. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  40. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
  41. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  42. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  43. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  44. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  45. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  46. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  47. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/config.js +0 -0
  48. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/ai/index.js +0 -0
  49. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/ai/lib/connector.js +0 -0
  50. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/index.js +0 -0
  51. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.js +0 -0
  52. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  53. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  54. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  55. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/n1ql.js +0 -0
  56. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.js +0 -0
  57. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  58. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  59. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/mysql/index.js +0 -0
  60. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/mysql/lib/connector.js +0 -0
  61. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/postgresql/index.js +0 -0
  62. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/postgresql/lib/connector.js +0 -0
  63. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/redis/index.js +0 -0
  64. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/redis/lib/session-store.js +0 -0
  65. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sql-parser.js +0 -0
  66. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sqlite/index.js +0 -0
  67. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sqlite/lib/connector.js +0 -0
  68. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sqlite/lib/session-store.js +0 -0
  69. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/content.encoding +0 -0
  70. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.framework.js +0 -0
  71. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.js +0 -0
  72. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-json.js +0 -0
  73. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-stream.js +0 -0
  74. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-swig.js +0 -0
  75. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-v1.js +0 -0
  76. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/index.js +0 -0
  77. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/LICENSE +0 -0
  78. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/README.md +0 -0
  79. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  80. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  81. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  82. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  83. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/package.json +0 -0
  84. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  85. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  86. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/streamsearch-1.1.0/package.json +0 -0
  87. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/index.js +0 -0
  88. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/lib/class.js +0 -0
  89. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/lib/factory.js +0 -0
  90. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/lib/tools.js +0 -0
  91. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/README.md +0 -0
  92. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/currency.json +0 -0
  93. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/language/en.json +0 -0
  94. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/language/fr.json +0 -0
  95. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/region/en.json +0 -0
  96. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/region/fr.json +0 -0
  97. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/index.js +0 -0
  98. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/mime.types +0 -0
  99. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/entity.js +0 -0
  100. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/index.js +0 -0
  101. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/template/entityFactory.js +0 -0
  102. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/template/index.js +0 -0
  103. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/README.md +0 -0
  104. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/index.js +0 -0
  105. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/csrf/README.md +0 -0
  106. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/csrf/package.json +0 -0
  107. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/csrf/src/main.js +0 -0
  108. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/file/README.md +0 -0
  109. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/file/build.json +0 -0
  110. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/file/package.json +0 -0
  111. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/README.md +0 -0
  112. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/build.json +0 -0
  113. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/package.json +0 -0
  114. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/src/main.js +0 -0
  115. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/session/README.md +0 -0
  116. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/session/package.json +0 -0
  117. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/session/src/main.js +0 -0
  118. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/README.md +0 -0
  119. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/build.json +0 -0
  120. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/package.json +0 -0
  121. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/src/main.js +0 -0
  122. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/README.md +0 -0
  123. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/build.json +0 -0
  124. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/package.json +0 -0
  125. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/src/form-validator.js +0 -0
  126. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/src/main.js +0 -0
  127. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/router.js +0 -0
  128. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/server.express.js +0 -0
  129. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/server.isaac.js +0 -0
  130. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/status.codes +0 -0
  131. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/_gitignore +0 -0
  132. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/app.json +0 -0
  133. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  134. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/routing.json +0 -0
  135. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/settings.json +0 -0
  136. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  137. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/templates.json +0 -0
  138. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  139. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  140. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  141. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  142. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/index.js +0 -0
  143. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  144. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  145. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  146. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  147. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  148. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  149. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/readme.md +0 -0
  150. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  151. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  152. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  153. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  154. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  155. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/command/gina.bat.tpl +0 -0
  156. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/command/gina.tpl +0 -0
  157. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/env.json +0 -0
  158. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/manifest.json +0 -0
  159. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/package.json +0 -0
  160. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/settings.json +0 -0
  161. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/statics.json +0 -0
  162. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/templates.json +0 -0
  163. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/client/json/401.json +0 -0
  164. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/client/json/403.json +0 -0
  165. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/client/json/404.json +0 -0
  166. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/server/html/50x.html +0 -0
  167. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/server/json/500.json +0 -0
  168. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/server/json/503.json +0 -0
  169. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/extensions/logger/config.json +0 -0
  170. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/console.js +0 -0
  171. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/context.js +0 -0
  172. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/LICENSE +0 -0
  173. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/README.md +0 -0
  174. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/package.json +0 -0
  175. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/src/main.js +0 -0
  176. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/dateFormat.js +0 -0
  177. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/index.js +0 -0
  178. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/LICENSE +0 -0
  179. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/README.md +0 -0
  180. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/package.json +0 -0
  181. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/src/main.js +0 -0
  182. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/path.js +0 -0
  183. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/README.md +0 -0
  184. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/package.json +0 -0
  185. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/src/api-error.js +0 -0
  186. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/src/main.js +0 -0
  187. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/prototypes.js +0 -0
  188. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/task.js +0 -0
  189. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/text.js +0 -0
  190. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/README.md +0 -0
  191. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/build.json +0 -0
  192. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/package.json +0 -0
  193. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/src/dep/jszip.min.js +0 -0
  194. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/src/main.js +0 -0
  195. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/async/package.json +0 -0
  196. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/async/src/main.js +0 -0
  197. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/README.md +0 -0
  198. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/build.json +0 -0
  199. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/package.json +0 -0
  200. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/src/main.js +0 -0
  201. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/aliases.json +0 -0
  202. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/add.js +0 -0
  203. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/arguments.json +0 -0
  204. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/build.js +0 -0
  205. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/copy.js +0 -0
  206. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/cp.js +0 -0
  207. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/help.js +0 -0
  208. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/help.txt +0 -0
  209. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/list.js +0 -0
  210. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/mcp-start.js +0 -0
  211. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/mcp.js +0 -0
  212. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/oas.js +0 -0
  213. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/openapi.js +0 -0
  214. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/remove.js +0 -0
  215. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/rename.js +0 -0
  216. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/restart.js +0 -0
  217. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/rm.js +0 -0
  218. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/start.js +0 -0
  219. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/status.js +0 -0
  220. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/stop.js +0 -0
  221. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/cache/stats.js +0 -0
  222. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/add.js +0 -0
  223. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/arguments.json +0 -0
  224. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/help.js +0 -0
  225. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/help.txt +0 -0
  226. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/list.js +0 -0
  227. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/migrate.js +0 -0
  228. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/remove.js +0 -0
  229. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/rm.js +0 -0
  230. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/add.js +0 -0
  231. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/get.js +0 -0
  232. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/help.js +0 -0
  233. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/help.txt +0 -0
  234. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/link-dev.js +0 -0
  235. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/list.js +0 -0
  236. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/remove.js +0 -0
  237. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/rm.js +0 -0
  238. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/set.js +0 -0
  239. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/unset.js +0 -0
  240. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/use.js +0 -0
  241. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/arguments.json +0 -0
  242. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/build.js +0 -0
  243. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/dot.js +0 -0
  244. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/get.js +0 -0
  245. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/help.js +0 -0
  246. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/help.txt +0 -0
  247. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/init.js +0 -0
  248. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/link-node-modules.js +0 -0
  249. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/link.js +0 -0
  250. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/msg.json +0 -0
  251. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/open.js +0 -0
  252. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/restart.js +0 -0
  253. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/set.js +0 -0
  254. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/start.js +0 -0
  255. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/status.js +0 -0
  256. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/stop.js +0 -0
  257. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/tail.js +0 -0
  258. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/update.js +0 -0
  259. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/version.js +0 -0
  260. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/gina-dev.1.md +0 -0
  261. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/gina-framework.1.md +0 -0
  262. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/gina.1.md +0 -0
  263. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/helper.js +0 -0
  264. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/index.js +0 -0
  265. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/inspector/help.js +0 -0
  266. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/inspector/help.txt +0 -0
  267. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/inspector/open.js +0 -0
  268. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/minion/help.js +0 -0
  269. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/minion/help.txt +0 -0
  270. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/msg.json +0 -0
  271. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/help.js +0 -0
  272. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/help.txt +0 -0
  273. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/inc/scan.js +0 -0
  274. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/list.js +0 -0
  275. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/reset.js +0 -0
  276. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/set.js +0 -0
  277. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/add.js +0 -0
  278. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/arguments.json +0 -0
  279. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/build.js +0 -0
  280. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/help.js +0 -0
  281. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/help.txt +0 -0
  282. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/import.js +0 -0
  283. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/list.js +0 -0
  284. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/move.js +0 -0
  285. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/remove.js +0 -0
  286. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/rename.js +0 -0
  287. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/restart.js +0 -0
  288. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/rm.js +0 -0
  289. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/start.js +0 -0
  290. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/status.js +0 -0
  291. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/stop.js +0 -0
  292. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/help.js +0 -0
  293. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/help.txt +0 -0
  294. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/list.js +0 -0
  295. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/set.js +0 -0
  296. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/add.js +0 -0
  297. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/help.js +0 -0
  298. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/help.txt +0 -0
  299. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/link-local.js +0 -0
  300. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/link-production.js +0 -0
  301. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/list.js +0 -0
  302. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/remove.js +0 -0
  303. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/rm.js +0 -0
  304. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/use.js +0 -0
  305. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/service/help.js +0 -0
  306. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/service/help.txt +0 -0
  307. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/service/list.js +0 -0
  308. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/view/add.js +0 -0
  309. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/README.md +0 -0
  310. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/build.json +0 -0
  311. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/package.json +0 -0
  312. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/src/main.js +0 -0
  313. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/config.js +0 -0
  314. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/connector-registry/package.json +0 -0
  315. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/connector-registry/src/main.js +0 -0
  316. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cron/README.md +0 -0
  317. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cron/package.json +0 -0
  318. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cron/src/main.js +0 -0
  319. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/LICENSE +0 -0
  320. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/README.md +0 -0
  321. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/package.json +0 -0
  322. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/src/main.js +0 -0
  323. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/generator/index.js +0 -0
  324. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/index.js +0 -0
  325. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/LICENSE +0 -0
  326. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/README.md +0 -0
  327. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/package.json +0 -0
  328. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/src/main.js +0 -0
  329. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inspector-redact/package.json +0 -0
  330. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inspector-redact/src/main.js +0 -0
  331. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/README.md +0 -0
  332. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/package.json +0 -0
  333. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/default/index.js +0 -0
  334. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/file/index.js +0 -0
  335. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  336. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  337. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/mq/index.js +0 -0
  338. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/mq/listener.js +0 -0
  339. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/mq/speaker.js +0 -0
  340. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/helper.js +0 -0
  341. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/main.js +0 -0
  342. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/math/index.js +0 -0
  343. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-dispatch/package.json +0 -0
  344. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-dispatch/src/main.js +0 -0
  345. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-http/package.json +0 -0
  346. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-http/src/main.js +0 -0
  347. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-server/package.json +0 -0
  348. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-server/src/main.js +0 -0
  349. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/merge/README.md +0 -0
  350. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/merge/package.json +0 -0
  351. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/merge/src/main.js +0 -0
  352. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/model.js +0 -0
  353. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-filters/README.md +0 -0
  354. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-filters/package.json +0 -0
  355. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-resolver/package.json +0 -0
  356. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-resolver/src/main.js +0 -0
  357. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/proc.js +0 -0
  358. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/README.md +0 -0
  359. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/build.json +0 -0
  360. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/package.json +0 -0
  361. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/src/main.js +0 -0
  362. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/src/radix.js +0 -0
  363. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing-introspect/package.json +0 -0
  364. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing-introspect/src/main.js +0 -0
  365. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/session-store.js +0 -0
  366. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/shell.js +0 -0
  367. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/state.js +0 -0
  368. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-filters/README.md +0 -0
  369. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-filters/package.json +0 -0
  370. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-resolver/package.json +0 -0
  371. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-resolver/src/main.js +0 -0
  372. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/url/README.md +0 -0
  373. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/url/index.js +0 -0
  374. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/url/routing.json +0 -0
  375. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/uuid/package.json +0 -0
  376. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/uuid/src/main.js +0 -0
  377. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/validator.js +0 -0
  378. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/watcher/package.json +0 -0
  379. /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/watcher/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,22 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
6
6
  and is generated by [Changie](https://github.com/miniscruff/changie).
7
7
 
8
8
 
9
+ ## 0.3.9 - 2026-05-04
10
+ ### Added
11
+ * Add a `process.gina._bundleFilterWraps[bundleName]` hook so bundles can wrap nunjucks filters at render time. Bundle-level monkey-patches on `lib.nunjucksFilters` do not survive `refreshCore()` (which creates a fresh lib singleton ~per-request in dev mode); the framework now applies registered wraps inside `registerGinaFilters` after the per-request filter factory runs.
12
+ ### Changed
13
+ * Drop the redundant `<namespace>-` prefix from `resolveTemplatePath()` effective name in nunjucks rendering. Routes whose name already carries the namespace (e.g. `project-get`, `client-list`) previously resolved to `project/project-get.njk` and `client/client-list.njk`; they now resolve to the cleaner `<namespace>/<action>.njk` path (e.g. `project/get.njk`, `client/list.njk`).
14
+ ### Fixed
15
+ * Guard `length` filter against null/undefined input in nunjucks-filters and swig-filters. Templates piping a missing variable through `| length` (e.g. `{{ breadcrumb | length }}`) now return 0 instead of crashing with a `TypeError`, matching upstream nunjucks `runtime.length` and Jinja2.
16
+ * Handle Couchbase Node.js SDK 4.x `JsonTranscoder` pre-decoded session values in the v4 session-store. Previous code called `.toString()` on the already-parsed object (producing `"[object Object]"`) and then `JSON.parse`d it, surfacing as a 500 on every authenticated request that touched session retrieval.
17
+ * Mirror `ctxObj.envVars` into `process.env` during `gna.js` bootstrap so third-party plugins (CSRF middleware, future env-readers) see env vars that `bin/cli`'s `filterArgs()` stripped before spawn. `setEnvVar` populates Gina's own context but did not touch `process.env`, leaving plugins reading the raw `process.env` with `undefined` values.
18
+ * Preserve inner Swig string-literal quotes in mid-URL `{{ }}` expressions in `getAssets()`. The decorative-quote-strip guard was anchored (`/^\{\{/`), so an asset URL with `{{ }}` embedded mid-string had its inner Swig quotes stripped, the mangled URL landed in the cached layout `__ginaData.gina.view.assets`, and the runtime Swig pass then threw `Unexpected colon on line N` at parse time. The compile guard keeps its anchor — only fully-Swig URLs are pre-compiled at scan time; embedded `{{ }}` is left for the cached layout runtime Swig pass.
19
+ * Isolate per-request middleware dispatch state in `nextMiddleware` via a new `createNextMiddleware()` factory. The previous shape held dispatch state on the function own properties (`._index`, `._count`, `._request`, `._response`, `._next`, `._nextAction`); under concurrent requests, request B setup at the entry point overwrote request A state, so A awaited middleware callbacks resumed against B `req` object — visible as sporadic `[csrf] no req.session.id` 500s when express-session correctly populated `req.session` for A but CSRF then ran with B `req`. Each call to `createNextMiddleware()` now returns a fresh closure with isolated state.
20
+ * Add a `require.cache` fallback to the `lib` registry import in `controller.render-nunjucks.js`, mirroring `render-swig.js`. `server.isaac.js` `refreshCore()` overwrites the lib cache entry with the exports value (not a Module object); a plain `require("../../lib")` returns `undefined` after a refresh and crashes the module-level read of `Collection`, `Cache`, `nunjucksFilters`, and `nunjucksResolver`. Route every per-request lookup through a module-scope `libRef` variable that uses `|| require.cache[require.resolve("../../lib")]` as the fallback.
21
+ * Promote `userData` keys to the top-level template context in `controller.render-nunjucks.js` for ergonomic parity with swig. The previous code only wrote each key to `data.page.data[k]`, contradicting the existing comment that promised top-level promotion (`{{ foo }}`); each key is now also mirrored to `data[k]` when not already defined.
22
+ * Alias `data.data` to `data.page.data` before `env.render()` in nunjucks rendering. Page-shells under nunjucks layout inheritance (e.g. `{% set document = data.document %}`) evaluated to `undefined` because `data` was not a key in the env.render context object. Swig layouts already have this aliasing implicit via `{% set data = page.data %}` at `_layouts/layout.html:1`; nunjucks layouts now get the same lookup path framework-side.
23
+ * Substitute `{{ page.X }}`, `{{ page.environment.X }}`, and `{{ page.data.session.X }}` placeholders inside the `ginaLoader` HTML string after `injectAssets()`. `gina.onload.min.js` is inserted as a literal HTML string and so cannot rely on nunjucks to resolve its tokens; without substitution, `window.onGinaLoaded` threw a `JSON.parse` SyntaxError on every page, leaving `gina.popin`, `gina.session`, `gina.forms`, and `window.onGenericXhrResponse` undefined and breaking every legacy popin and form-submit. Mirrors `render-swig.js` flatten-then-`whisper()` approach.
24
+
9
25
  ## 0.3.8 - 2026-04-26
10
26
  ### Fixed
11
27
  * Fixed `npm install -g gina` failing with `Cannot find module 'psl'` on fresh and upgrade installs (regression from 0.3.7). The pre/post-install scripts no longer load the framework `lib` registry — `psl` and `@rhinostone/swig` are now declared as top-level npm dependencies so the runtime resolves them via the standard module resolution chain, and a helpers pre-load in the install scripts ensures `lib/logger`'s circular load completes correctly so internal helpers' module-local `console` references bind to the full Logger singleton.
package/ROADMAP.md CHANGED
@@ -15,7 +15,13 @@ This roadmap covers planned features, architectural improvements, new connectors
15
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 · Inspector Phase 1 + Phase 2 · CLI Tier 1 (project lifecycle, port:set, framework:get) |
16
16
  | **Q3 2026** | `0.3.1` ✅ | Release workflow fixes · SQL index reporting Phase A · HTTP/2 direct stream for HTML · Dependency reduction (`ssl-checker`, `colors`, `uuid` removed — engine.io sole runtime dep) |
17
17
  | **Q3 2026** | `0.3.2` ✅ | JSON Schema for config files · Entity short-name aliases · Model loading fix · getConfig() proxy fix · Inspector tab presets & QI propagation |
18
- | **Q3 2026** | `0.3.3` | OpenAPI spec generation · CLI port:set & framework:get · TypeScript declarations · Explicit exports |
18
+ | **Q3 2026** | `0.3.3` | OpenAPI spec generation · CLI port:set & framework:get · TypeScript declarations · Explicit exports · Swig npm migration · Live index introspection · Popin perf · Docker fixes |
19
+ | **Q3 2026** | `0.3.4` ✅ | Patch: `gna.js` stale framework path fix · Release lifecycle `gna.js` sync |
20
+ | **Q3 2026** | `0.3.5` ✅ | Security: `@rhinostone/swig` 1.5.0 (CVE-2023-25345 extended guards) · Browser-side swig parity |
21
+ | **Q4 2026** | `0.3.6` ✅ | Inspector payload redaction (#R7) · Pre-commit & CI local-tool path guards · Private-token leak gate · Whisper Error fix (#B12) · `framework:init` hardening (#B13) · CORS preflight fix · `syncDocs` lockfile regen |
22
+ | **Q4 2026** | `0.3.7` ✅ | Web Security CSRF trilogy (#CSRF1/2/3) · Nunjucks template engine opt-in (#NJ1–#NJ4) · Eval-safety hardening (#SCS1) · MCP server (#AI8 stdio + HTTP transports) · `connector:*` CLI (#CN10) · vendored-dep CVE-visibility lock · psl/optimist removal · Session.name drop-in identity |
23
+ | **Q4 2026** | `0.3.8` ✅ | Patch: `npm install -g gina@latest` regression fix — `psl` + `@rhinostone/swig` promoted to top-level deps · install scripts decoupled from framework `lib` registry · helpers preload guarding `lib/logger` ↔ `framework/v*/helpers` circular dep |
24
+ | **Q2 2026** | `0.3.9` ✅ | Consumer-feedback batch (11 framework patches): per-request middleware dispatch isolation · Couchbase 4.x JsonTranscoder · `length` filter null safety · `process.env` mirroring · 6 nunjucks render-pipeline patches (libRef fallback · namespace prefix drop · bundle filter wraps · top-level userData · `data.data` alias · ginaLoader placeholders) · `getAssets` mid-URL `{{ }}` strip-guard anchor |
19
25
  | **Q4 2026** | `0.4.0` | AI agents (MCP) · ScyllaDB connector · PWA scaffold · Prometheus metrics · Advanced tutorial · Website redesign · Docs offline ZIP · Bun investigation · Couchbase v2 removal · HTTP/2 hardening · Trailer support · CLI Tier 2 (bundle/project status, rename, copy, protocol:remove, minions) |
20
26
  | **Q1 2027** | `0.5.0` | ESM support · Template engine migration · Structured logging · Alt-Svc · HTTP/2 priorities · WebSocket over HTTP/2 · Inspector Production · CLI Tier 3 (project:move, framework:update, backup/restore, man pages) |
21
27
  | **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
@@ -119,10 +125,10 @@ Four focused follow-up sessions to close the deferred gap left by the `0.3.7-alp
119
125
 
120
126
  | Status | Feature | Version | Target |
121
127
  | --- | --- | --- | --- |
122
- | 🔨 | **Port `lib/swig-filters` → `lib/nunjucks-filters`** — Mechanically port the 7 filters (`getUrl`, `getWebroot`, `length`, `nl2br`, `addHours`, `addDays`, `addYears`) into a sister library registered via `env.addFilter()` in `controller.render-nunjucks.js`. Closes the most user-visible gap — template authors get `{{ '/home' \| getUrl() }}` and the date helpers immediately. | `0.3.7` | Q4 2026 |
123
- | 🔨 | **`setResources` / `<gina>` layout placeholders** — Port the asset-cataloguing pipeline so build-time `<link>` / `<script>` tags are auto-injected into nunjucks layouts the same way they are into swig layouts. `data.page.view.stylesheets` / `.scripts` now populated before render; post-render `injectAssets` helper auto-injects stylesheets before `</head>`, scripts before `</body>` (or before `</head>` when `javascriptsDeferEnabled`), plus `externalPlugins` and the `ginaLoader` before `</head>`. Templates may opt in explicitly with `{{ page.view.stylesheets \| safe }}` — exact-substring detection skips the auto-inject when they do. | `0.3.7` | Q4 2026 |
124
- | 📋 | **Static HTML cache parity** — Port the swig disk-write/serve cache path so `cache:` keys in `routing.json` actually produce cached HTML for nunjucks routes. | `0.3.7` | Q4 2026 |
125
- | 📋 | **Early Hints 103 auto-send for CSS/JS preloads** — Move the 103 path in `controller.js this.render()` to be engine-agnostic. Pure perf optimisation; manual `self.setEarlyHints(linkHeader)` already works. | `0.3.7` | Q4 2026 |
128
+ | | **Port `lib/swig-filters` → `lib/nunjucks-filters`** — Mechanically port the 7 filters (`getUrl`, `getWebroot`, `length`, `nl2br`, `addHours`, `addDays`, `addYears`) into a sister library registered via `env.addFilter()` in `controller.render-nunjucks.js`. Closes the most user-visible gap — template authors get `{{ '/home' \| getUrl() }}` and the date helpers immediately. | `0.3.7-alpha.3` | 2026-04-23 |
129
+ | | **`setResources` / `<gina>` layout placeholders** — Port the asset-cataloguing pipeline so build-time `<link>` / `<script>` tags are auto-injected into nunjucks layouts the same way they are into swig layouts. `data.page.view.stylesheets` / `.scripts` now populated before render; post-render `injectAssets` helper auto-injects stylesheets before `</head>`, scripts before `</body>` (or before `</head>` when `javascriptsDeferEnabled`), plus `externalPlugins` and the `ginaLoader` before `</head>`. Templates may opt in explicitly with `{{ page.view.stylesheets \| safe }}` — exact-substring detection skips the auto-inject when they do. | `0.3.7-alpha.3` | 2026-04-23 |
130
+ | | **Static HTML cache parity** — Port the swig disk-write/serve cache path so `cache:` keys in `routing.json` actually produce cached HTML for nunjucks routes. | `0.3.7-alpha.4` | 2026-04-23 |
131
+ | | **Early Hints 103 auto-send for CSS/JS preloads** — Move the 103 path in `controller.js this.render()` to be engine-agnostic. Pure perf optimisation; manual `self.setEarlyHints(linkHeader)` already works. | `0.3.7-alpha.4` | 2026-04-23 |
126
132
 
127
133
  ### Eval safety
128
134
 
@@ -0,0 +1 @@
1
+ 0.3.9
@@ -198,6 +198,16 @@ module.exports = function(session, bundle){
198
198
  }
199
199
  if (err) return fn(err);
200
200
  if (!data || !data.value) return fn();
201
+ // FRAMEWORK PATCH (freelancer/v3): handle the case where data.value is
202
+ // already a parsed object (Couchbase Node.js SDK 4.x JsonTranscoder
203
+ // returns the decoded value, not the raw bytes). Without this, calling
204
+ // .toString() on an object produces "[object Object]" which JSON.parse
205
+ // can't handle and every authenticated request 500s on session-retrieval.
206
+ // Push upstream to gina-io/gina.
207
+ if (typeof data.value === 'object' && !Buffer.isBuffer(data.value)) {
208
+ console.debug('[SessionStore v4] (1) GOT data (already-parsed object)');
209
+ return fn(null, data.value);
210
+ }
201
211
  data = data.value.toString();
202
212
  console.debug('[SessionStore v4] (1) GOT data');
203
213
  // console.debug('[SessionStore v4] (2) GOT ' + data);
@@ -127,7 +127,13 @@ var inspectorRedact = require('lib/inspector-redact');
127
127
  // rendering without a layout (mirrors render-swig.js:494-498). Fetched via
128
128
  // the lib registry so the dev-mode hot-reload evictions of `lib/index.js`
129
129
  // don't poison the reference across requests.
130
- var Collection = require('../../lib').Collection;
130
+ //
131
+ // FRAMEWORK PATCH (freelancer/v3): mirror render-swig.js's `|| require.cache[...]`
132
+ // fallback. server.isaac.js refreshCore() overwrites the lib cache entry with the
133
+ // exports value (not a Module object), so a plain `require()` here returns
134
+ // undefined and crashes the module-level read. Push upstream to gina-io/gina.
135
+ var libRef = require('../../lib') || require.cache[require.resolve('../../lib')];
136
+ var Collection = libRef.Collection;
131
137
  // #NJ3 — static HTML cache writes. Module-scoped `cache` instance mirrors
132
138
  // `render-swig.js:6` and `render-json.js:5`. Per-request, the main render
133
139
  // function re-points it at the server's shared in-memory store (key:
@@ -135,7 +141,7 @@ var Collection = require('../../lib').Collection;
135
141
  // (`server.isaac.js:1012-1067`) is engine-agnostic, so writes from this
136
142
  // delegate are served back on subsequent hits without going through the
137
143
  // controller at all.
138
- var cache = new (require('../../lib').Cache)();
144
+ var cache = new (libRef.Cache)();
139
145
 
140
146
  /**
141
147
  * Caches a `nunjucks.Environment` per bundle template root so we don't
@@ -210,6 +216,16 @@ function resolveTemplatePath(data, localOptions) {
210
216
  if (effective === localOptions.namespace) {
211
217
  effective = 'index';
212
218
  }
219
+ // FRAMEWORK PATCH (freelancer/v3): drop redundant `<namespace>-` prefix
220
+ // from the file segment when present, so `project/project-get.njk`
221
+ // resolves to `project/get.njk` (and `client/client-list.njk` to
222
+ // `client/list.njk`). Lets route names that already carry the
223
+ // namespace (e.g. `project-get`, `client-list`) live at the cleaner
224
+ // `<namespace>/<action>.njk` path. Push upstream to gina-io/gina.
225
+ var nsPrefix = localOptions.namespace + '-';
226
+ if (effective.length > nsPrefix.length && effective.indexOf(nsPrefix) === 0) {
227
+ effective = effective.substring(nsPrefix.length);
228
+ }
213
229
  var rel = localOptions.namespace + '/' + effective;
214
230
  if (ext && !rel.endsWith(ext)) { rel += ext; }
215
231
  return rel;
@@ -465,7 +481,9 @@ function sendHtmlResponse(local, html) {
465
481
  * @returns {void}
466
482
  */
467
483
  function registerGinaFilters(env, self, local, localOptions) {
468
- var nunjucksFilters = require('../../lib').nunjucksFilters
484
+ // FRAMEWORK PATCH (freelancer/v3): use module-scope libRef fallback so
485
+ // refreshCore's malformed cache entry doesn't return undefined here.
486
+ var nunjucksFilters = (libRef && libRef.nunjucksFilters)
469
487
  || require('../../lib/nunjucks-filters');
470
488
 
471
489
  // Same isProxyHost detection as render-swig.js:606-625. Duplicated here
@@ -502,6 +520,26 @@ function registerGinaFilters(env, self, local, localOptions) {
502
520
  res: local.res
503
521
  });
504
522
 
523
+ // FRAMEWORK PATCH (freelancer/v3): apply bundle-level filter wraps registered
524
+ // on process state. Bundle-level monkey-patches on `lib.nunjucksFilters`
525
+ // don't survive refreshCore() (which creates a fresh lib singleton ~per-
526
+ // request in dev mode), so bundles register their wrap on
527
+ // `process.gina._bundleFilterWraps[bundleName]` and the framework applies
528
+ // them here. Push upstream to gina-io/gina alongside Bugs A-D.
529
+ var bundleFilterWraps = (process.gina && process.gina._bundleFilterWraps) || {};
530
+ Object.keys(bundleFilterWraps).forEach(function (bundleName) {
531
+ var wrap = bundleFilterWraps[bundleName];
532
+ if (typeof wrap === 'function') {
533
+ try {
534
+ filters = wrap(filters) || filters;
535
+ } catch (wrapErr) {
536
+ try {
537
+ console.warn('[render-nunjucks] bundle filter wrap failed for ' + bundleName + ': ' + (wrapErr.message || wrapErr));
538
+ } catch (e) {}
539
+ }
540
+ }
541
+ });
542
+
505
543
  for (var name in filters) {
506
544
  if (typeof filters[name] === 'function' && name !== 'getConfig') {
507
545
  env.addFilter(name, filters[name]);
@@ -717,10 +755,11 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
717
755
  // Fetch the nunjucks module from the process-cache. `get()` throws if
718
756
  // the bundle-startup load did not succeed — we surface that cleanly
719
757
  // via throwError so the usual error page pipeline handles it.
758
+ // FRAMEWORK PATCH (freelancer/v3): use module-scope libRef fallback.
720
759
  var nunjucks;
721
760
  try {
722
- nunjucks = require('../../lib').nunjucksResolver
723
- ? require('../../lib').nunjucksResolver.get()
761
+ nunjucks = (libRef && libRef.nunjucksResolver)
762
+ ? libRef.nunjucksResolver.get()
724
763
  : require('../../lib/nunjucks-resolver').get();
725
764
  } catch (err) {
726
765
  return self.throwError(err);
@@ -781,13 +820,29 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
781
820
 
782
821
  // Merge user data into page.data so templates can access via {{ page.data.foo }}
783
822
  // or {{ foo }} at top level (promoted for ergonomic parity with swig).
823
+ // FRAMEWORK PATCH (freelancer/v3): the comment promised top-level promotion but
824
+ // the original code only wrote to data.page.data. Mirror to top-level too.
784
825
  if (userData && typeof(userData) === 'object') {
785
826
  if (!data.page.data) { data.page.data = {}; }
786
827
  Object.keys(userData).forEach(function (k) {
787
828
  data.page.data[k] = userData[k];
829
+ if (typeof(data[k]) === 'undefined') {
830
+ data[k] = userData[k];
831
+ }
788
832
  });
789
833
  }
790
834
 
835
+ // FRAMEWORK PATCH (freelancer/v3): Bug J — alias `data.data` to `data.page.data`
836
+ // so page-shell `{% set X = data.Y %}` resolves under nunjucks layout
837
+ // inheritance. Mirrors swig's `_layouts/layout.html:1` `{% set data = page.data %}`.
838
+ // Without this, page-shells like `estimate/get.njk:11 {% set document = data.document %}`
839
+ // evaluate to undefined (no `data` key in the env.render context object) and
840
+ // the .overview section renders empty even though page.data.document is fully
841
+ // populated. Push upstream to gina-io/gina alongside Bugs A-I.
842
+ if (data && data.page && data.page.data) {
843
+ data.data = data.page.data;
844
+ }
845
+
791
846
  var env;
792
847
  try {
793
848
  env = getEnvironment(nunjucks, templateRoot, {
@@ -924,6 +979,38 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
924
979
  try { console.warn('[render-nunjucks] asset injection skipped: ' + (assetErr.message || assetErr)); } catch (e) {}
925
980
  }
926
981
 
982
+ // FRAMEWORK PATCH (freelancer/v3): substitute {{ page.X }} / {{ page.environment.X }}
983
+ // placeholders inside ginaLoader (gina.onload.min.js), which is inserted as a literal
984
+ // HTML string by injectAssets() and therefore cannot rely on nunjucks to resolve its
985
+ // tokens. Mirrors render-swig.js:572-582 (flatten dict) + 1276 (whisper call). Without
986
+ // this, `window.onGinaLoaded` throws a JSON.parse SyntaxError on every page, leaving
987
+ // gina.popin / gina.session / gina.forms / window.onGenericXhrResponse undefined and
988
+ // breaking every legacy popin + form-submit. Push upstream to gina-io/gina alongside
989
+ // Bugs A-E.
990
+ try {
991
+ if (data && data.page && typeof data.page === 'object' && typeof whisper === 'function') {
992
+ var ginaLoaderDic = {};
993
+ for (var _d in data.page) {
994
+ ginaLoaderDic['page.' + _d] = data.page[_d];
995
+ }
996
+ if (typeof data.page.environment === 'object' && data.page.environment !== null) {
997
+ for (var _k in data.page.environment) {
998
+ ginaLoaderDic['page.environment.' + _k] = data.page.environment[_k];
999
+ }
1000
+ }
1001
+ // gina.onload.min.js also references `{{ page.data.session.X }}` (depth 3)
1002
+ // for session id/timeout/createdAt/lastModified — flatten that level too.
1003
+ if (data.page.data && typeof data.page.data === 'object' && data.page.data.session && typeof data.page.data.session === 'object') {
1004
+ for (var _s in data.page.data.session) {
1005
+ ginaLoaderDic['page.data.session.' + _s] = data.page.data.session[_s];
1006
+ }
1007
+ }
1008
+ html = whisper(ginaLoaderDic, html, /\{{ ([a-zA-Z.]+) \}}/g);
1009
+ }
1010
+ } catch (whisperErr) {
1011
+ try { console.warn('[render-nunjucks] ginaLoader whisper substitution skipped: ' + (whisperErr.message || whisperErr)); } catch (e) {}
1012
+ }
1013
+
927
1014
  // Inspector dev-payload injection (dev mode only; no-op otherwise).
928
1015
  try {
929
1016
  html = injectInspectorScripts(html, data, self, local, displayInspector);
@@ -221,6 +221,13 @@ if (process.argv.length >= 3 /**&& /gina$/.test(process.argv[1])*/ ) {
221
221
  evar = false
222
222
  }
223
223
 
224
+ // FRAMEWORK PATCH (freelancer/v3): mirror ctxObj.envVars into process.env so
225
+ // third-party plugins (Csrf, future env-readers) see what filterArgs() stripped
226
+ // in the supervisor before spawn. Push upstream to gina-io/gina.
227
+ if ( typeof(obj[a]) != 'undefined' && obj[a] !== null ) {
228
+ process.env[a] = String(obj[a]);
229
+ }
230
+
224
231
  setEnvVar(a, evar, true)
225
232
 
226
233
  }
@@ -1063,7 +1063,14 @@ function Server(options) {
1063
1063
  // .replace(/((src|href|srcset)\=\"|(src|href|srcset)\=\')/g, '')
1064
1064
  // .replace(/\"/g, '')
1065
1065
  // ;
1066
- if ( !/^\{\{/.test(url) ) {
1066
+ // FRAMEWORK PATCH (freelancer/v3): drop the `^` anchor so the
1067
+ // decorative-quote strip is also skipped when `{{ }}` is embedded
1068
+ // mid-string (e.g. `css/main.css?cache={{ ''|formatDate('HH:MM:ss') }}`).
1069
+ // Without this, inner Swig string-literal quotes get stripped, the
1070
+ // expression becomes `{{ |formatDate(HH:MM:ss) }}`, and the cached
1071
+ // layout's runtime Swig pass throws "Unexpected colon on line N".
1072
+ // Reproduces in v0.3.9-alpha.2 (last touched 2026-04-26).
1073
+ if ( !/\{\{/.test(url) ) {
1067
1074
  url = url.replace(/(\"|\')/g, '');
1068
1075
  }
1069
1076
  if (swig && /^\{\{/.test(url) ) {
@@ -2756,6 +2763,8 @@ function Server(options) {
2756
2763
  && self.instance._expressMiddlewares.length > 0
2757
2764
  ) {
2758
2765
 
2766
+ // FRAMEWORK PATCH (freelancer/v3): Bug I — per-request dispatcher
2767
+ var nextMiddleware = createNextMiddleware();
2759
2768
  nextMiddleware._index = 0;
2760
2769
  nextMiddleware._count = self.instance._expressMiddlewares.length-1;
2761
2770
  nextMiddleware._request = request;
@@ -3628,6 +3637,17 @@ function Server(options) {
3628
3637
  * @private
3629
3638
  * @param {Error|boolean} err - Error from the previous middleware, or false
3630
3639
  */
3640
+ // FRAMEWORK PATCH (freelancer/v3): Bug I — wrap nextMiddleware in a
3641
+ // per-request factory. The original function held dispatch state on its
3642
+ // own properties (._index, ._request, ._response, ._next, ._nextAction).
3643
+ // Under concurrent requests, request B's setup at the entry point
3644
+ // overwrote request A's state, so A's awaited middleware callbacks
3645
+ // resumed against B's req object — visible as "[csrf] no req.session.id"
3646
+ // sporadic 500s when express-session correctly populated req.session for
3647
+ // A but CSRF then ran with B's req that never went through session.
3648
+ // Each call to createNextMiddleware now returns a fresh function with
3649
+ // closure-isolated state. Push upstream to gina-io/gina.
3650
+ var createNextMiddleware = function() {
3631
3651
  var nextMiddleware = function(err) {
3632
3652
 
3633
3653
  var router = local.router;
@@ -3681,6 +3701,8 @@ function Server(options) {
3681
3701
  }
3682
3702
  });
3683
3703
  };
3704
+ return nextMiddleware;
3705
+ };
3684
3706
 
3685
3707
  /**
3686
3708
  * Detects CORS preflight (OPTIONS) requests by inspecting the method,
@@ -4092,6 +4114,8 @@ function Server(options) {
4092
4114
 
4093
4115
  if (matched) {
4094
4116
  if ( /^isaac/.test(self.engine) && self.instance._expressMiddlewares.length > 0) {
4117
+ // FRAMEWORK PATCH (freelancer/v3): Bug I — per-request dispatcher
4118
+ var nextMiddleware = createNextMiddleware();
4095
4119
  nextMiddleware._index = 0;
4096
4120
  nextMiddleware._count = self.instance._expressMiddlewares.length-1;
4097
4121
  nextMiddleware._request = req;
@@ -338,6 +338,13 @@ function NunjucksFilters(conf) {
338
338
  * {{ users | length }}
339
339
  */
340
340
  self.length = function (input, obj) {
341
+ // Match upstream nunjucks `runtime.length` / Jinja2: undefined or null → 0.
342
+ // Without this guard, `typeof(input.count)` dereferences `.count` first
343
+ // and throws on undefined — crashing any template that pipes a missing
344
+ // variable through `| length`.
345
+ if ( input == null ) {
346
+ return 0;
347
+ }
341
348
  if ( typeof(input.count) != 'undefined' ) {
342
349
  return input.count();
343
350
  } else {
@@ -318,6 +318,13 @@ function SwigFilters(conf) {
318
318
  // Extends default `length` filter
319
319
  self.length = function (input, obj) {
320
320
 
321
+ // Match upstream nunjucks `runtime.length` / Jinja2: undefined or null → 0.
322
+ // Without this guard, `typeof(input.count)` dereferences `.count` first
323
+ // and throws on undefined — crashing any template that pipes a missing
324
+ // variable through `| length`.
325
+ if ( input == null ) {
326
+ return 0
327
+ }
321
328
  if ( typeof(input.count) != 'undefined' ) {
322
329
  return input.count()
323
330
  } else {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina-framework",
3
- "version": "0.3.9-alpha.1",
3
+ "version": "0.3.9-alpha.2",
4
4
  "dependencies": {
5
5
  "@rhinostone/swig": "^1.6.0",
6
6
  "psl": "^1.15.0"
package/gna.js CHANGED
@@ -15,14 +15,14 @@
15
15
  'use strict';
16
16
 
17
17
  // Framework core — the main gna module (lifecycle hooks, lib, etc.)
18
- var _gna = require('./framework/v0.3.9-alpha.1/core/gna');
18
+ var _gna = require('./framework/v0.3.9/core/gna');
19
19
 
20
20
  // SuperController and EntitySuper — loaded from their source modules
21
- var SuperController = require('./framework/v0.3.9-alpha.1/core/controller');
22
- var EntitySuper = require('./framework/v0.3.9-alpha.1/core/model/entity');
21
+ var SuperController = require('./framework/v0.3.9/core/controller');
22
+ var EntitySuper = require('./framework/v0.3.9/core/model/entity');
23
23
 
24
24
  // uuid — from the lib registry
25
- var uuid = require('./framework/v0.3.9-alpha.1/lib/uuid');
25
+ var uuid = require('./framework/v0.3.9/lib/uuid');
26
26
 
27
27
  module.exports = {
28
28
 
package/llms.txt CHANGED
@@ -870,3 +870,7 @@ YAML indent trap: the heredoc body and the `EOF` terminator must land at column
870
870
  82. **Source-inspection tests that assert source order — `src.indexOf('<funcName>(<args>)')` matches the function DEFINITION before the call site, not the call site.** When a test asserts "A must be called before B" via `indexOf` on a function-name-with-args fragment, the match lands on the `function <funcName>(<args>)` definition near the top of the file, not the call site lower in the body. If both names are defined in the same source-order as their call sites, the assertion accidentally passes for the wrong reason; if they're defined in a different order than they're called (helper defined first, used last), it fails for the wrong reason. **Discrimination test**: `grep -c '<pattern>' <file>` — if the count is > 1, the indexOf is ambiguous and the assertion is unreliable. **Fix**: search for a unique call-site fragment that doesn't appear in the function definition — typically the assignment LHS (`requestOrigin = parseRequestOrigin(req)`, `presented = readPresentedToken(req`). Definitions never contain the assignment target. Same trap applies to any pattern where definition and call share the same identifier syntax — method names, event listener attachments, even `console.error('[<feature>]'` template strings. Precedent: 2026-04-26 #CSRF3 implementation — section 14 source-inspection test "Origin pre-filter runs AFTER the csrfExempt short-circuit" failed at first because `indexOf('parseRequestOrigin(req)')` matched the `function parseRequestOrigin(req)` definition (line 152) before the call site (line 531); switched to `indexOf('requestOrigin = parseRequestOrigin(req)')` (assignment-form, unique to the call site). The sibling "BEFORE token verify" test passed only by coincidence — the `parseRequestOrigin` definition was already before the `readPresentedToken` definition in the file.
871
871
 
872
872
  83. **`Origin: "null"` is a real value browsers send — sandboxed iframes (`<iframe sandbox>`), `file://` pages, and some redirected requests carry the literal string `"null"` in the Origin header (and in `Sec-Fetch-Site: cross-site` flows).** Origin-checking code that does `if (origin) { /* allowlist match */ }` treats `"null"` as truthy and tries to match it. Without an explicit guard the result is wrong-for-the-right-outcome at best: the allowlist almost never contains `"null"`, so the request 403s — but for the wrong reason (it should fall through to the Referer fallback or a known-no-origin handler, not be rejected for "origin not in allowlist"). The same trap applies to CORS allowlists, CSRF Origin pre-filters, audit logging, and any code branching on `Origin`. **Fix**: add an explicit `s === 'null'` guard at the start of the Origin parser, treating `"null"` exactly like an absent header — empty result, fall through to the next signal (Referer, Sec-Fetch metadata, etc.). Document the guard with a brief comment so it isn't "cleaned up" by a future contributor who reads it as a no-op string check. Precedent: 2026-04-26 #CSRF3 implementation — `parseOriginString` at `core/plugins/lib/csrf/src/main.js:108` returns `null` (the JS literal) when input is the string `"null"`, so `parseRequestOrigin` falls back to parsing the host out of `Referer`. Two unit tests pin this behaviour: `Origin: "null"` + missing `Referer` → 403 with reason "missing origin/referer"; `Origin: "null"` + valid `Referer` → next() called. Without the guard, the missing-Referer case would have 403'd with reason "origin not allowed", masking the real problem from any operator reading the log.
873
+
874
+ 84. **Local-tool doc files at gitignored paths drift independently across worktree splits — git merges don't carry gitignored content, so each worktree's local docs must be maintained separately.** A primary repo (`develop`) and a linked worktree (`dev/wip` via `git worktree add`) hold independent gitignored doc copies; a version bump on the primary updates its local docs via tooling, but the linked worktree's copies stay at the previous version because gitignored files don't FF across `git merge --ff-only`. **Auto-update on the primary worktree**: version-bump scripts read `script/.local-sync-targets.json` (gitignored — lists relative paths to local doc files), iterate entries, regex-replace `v<old>` → `v<new>` with `(?![\\d.])` lookahead to avoid clobbering longer prefix-sharing versions. Tracked source code names only the generic config file, never the targets — no public-surface leak of local-tool path names. Same indirection already in `script/post_publish.js → bumpVersion`; replicated in `script/prepare_version.js` for non-publish bumps (added 2026-04-29). **Manual update on linked worktrees**: the project's gitignored git-workflow doc gets a post-merge state-check step instructing the maintainer to grep version refs after every fast-forward and update mismatches. **Generalises**: any worktree-split repo with gitignored doc files has the same pattern. Each worktree's local-doc version refs match its OWN `package.json` — versions can legitimately differ between branches at different cuts. Precedent: 2026-04-29 — discovered drift in two local-doc files (primary on `0.3.9-alpha.2` had docs saying `alpha.11`; linked on `0.3.7-alpha.10` had docs saying `alpha.8`); fixed manually, then automated via the existing `.local-sync-targets.json` indirection.
875
+
876
+ 85. **Tracked source code that reads/writes local-tool files must use a gitignored config-file indirection — naming the local-tool paths directly in tracked source CONTENT is a public-surface leak even when the operation is functional.** Extends entry #68's "local-tool path leaks have three surfaces" by adding a fourth: tracked-script body content (path string literals, code comments, variable names, log/console message strings). **Counterfactual check before writing**: would removing every mention of the local-tool name BREAK the feature, or just make the path configurable? If the latter, the mention is not load-bearing — extract to a gitignored sidecar config the script reads at runtime. Compare to the existing leak-filter regex in `script/prepare_version.js` (already quoted by entry #68) — THAT pattern IS product functionality (the filter literally needs to identify the path to filter it out), allowed exception. **Existing pattern to mirror**: `script/post_publish.js → bumpVersion` reads `script/.local-sync-targets.json` (gitignored — lists relative paths to operate on), iterates entries, applies generic regex-replace. Tracked source names only the generic config file, never the targets. The same shape was replicated in `script/prepare_version.js` (entry #84) after a first-attempt mistake. **The "Don't strip what you haven't surveyed" mirror — "Don't ADD a public-surface mention without surveying the rule first"**. Recovery cost is asymmetric: removal requires `git filter-repo` + force-push (and force-push to a public default branch is itself a high-friction operation per entry #79), addition is one keystroke. Always run the leak-scan regex (per entry #68's documented patterns) against the diff BEFORE staging — `git diff <file> | grep '^+' | grep -v '^+++' | grep -iE '<leak-patterns>'` — not after pushing. Precedent: 2026-04-29 — first attempt at extending `prepare_version.js` for the worktree-drift fix (entry #84) named the local-doc path directly in 6+ places (path literal, two comments, variable names, two log strings); user surfaced the violation before commit during a "are you sure there won't be side effects?" review pass; reverted to the `post_publish.js` indirection pattern in the same session, then committed clean.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina",
3
- "version": "0.3.9-alpha.1",
3
+ "version": "0.3.9",
4
4
  "description": "Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency",
5
5
  "keywords": [
6
6
  "nodejs",
@@ -56,7 +56,7 @@
56
56
  "gina-container": "bin/gina-container",
57
57
  "gina-init": "bin/gina-init"
58
58
  },
59
- "main": "./framework/v0.3.9-alpha.1/core/gna",
59
+ "main": "./framework/v0.3.9/core/gna",
60
60
  "types": "./types/index.d.ts",
61
61
  "typesVersions": {
62
62
  "*": {
@@ -1 +0,0 @@
1
- 0.3.9-alpha.1
File without changes
File without changes