gina 0.3.7-alpha.8 → 0.3.7

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 (382) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/ROADMAP.md +5 -4
  3. package/framework/v0.3.7/VERSION +1 -0
  4. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +20 -8
  5. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.js +157 -0
  6. package/framework/v0.3.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js +545 -0
  7. package/framework/v0.3.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  8. package/framework/v0.3.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  9. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.js +33 -0
  10. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/index.js +3 -1
  11. package/framework/v0.3.7/core/plugins/lib/csrf/README.md +113 -0
  12. package/framework/v0.3.7/core/plugins/lib/csrf/package.json +22 -0
  13. package/framework/v0.3.7/core/plugins/lib/csrf/src/main.js +584 -0
  14. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/session/src/main.js +14 -2
  15. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/src/form-validator.js +70 -0
  16. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/src/main.js +83 -0
  17. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/server.js +2 -0
  18. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/index.js +7 -0
  19. package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/settings.json +22 -0
  20. package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/src/main.js +4 -0
  21. package/framework/{v0.3.7-alpha.8 → v0.3.7}/package.json +1 -1
  22. package/gna.js +4 -4
  23. package/llms.txt +8 -0
  24. package/package.json +2 -2
  25. package/framework/v0.3.7-alpha.8/VERSION +0 -1
  26. package/framework/v0.3.7-alpha.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -544
  27. package/framework/v0.3.7-alpha.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  28. package/framework/v0.3.7-alpha.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  29. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/AUTHORS +0 -0
  30. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/LICENSE +0 -0
  31. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/html/nolayout.html +0 -0
  32. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/html/static.html +0 -0
  33. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/android-chrome-192x192.png +0 -0
  34. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/android-chrome-512x512.png +0 -0
  35. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/apple-touch-icon.png +0 -0
  36. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/favicon-16x16.png +0 -0
  37. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/favicon-32x32.png +0 -0
  38. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/img/favicon.ico +0 -0
  39. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/README.md +0 -0
  40. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  41. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  42. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  43. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  44. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  45. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  46. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  47. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  48. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  49. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  50. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  51. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  52. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  53. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  54. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  55. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  56. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/config.js +0 -0
  57. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/ai/index.js +0 -0
  58. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/ai/lib/connector.js +0 -0
  59. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/index.js +0 -0
  60. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.js +0 -0
  61. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  62. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  63. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  64. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/n1ql.js +0 -0
  65. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.js +0 -0
  66. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  67. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  68. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  69. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/mysql/index.js +0 -0
  70. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/mysql/lib/connector.js +0 -0
  71. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/postgresql/index.js +0 -0
  72. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/postgresql/lib/connector.js +0 -0
  73. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/redis/index.js +0 -0
  74. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/redis/lib/session-store.js +0 -0
  75. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sql-parser.js +0 -0
  76. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sqlite/index.js +0 -0
  77. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sqlite/lib/connector.js +0 -0
  78. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/connectors/sqlite/lib/session-store.js +0 -0
  79. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/content.encoding +0 -0
  80. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.framework.js +0 -0
  81. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-json.js +0 -0
  82. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-nunjucks.js +0 -0
  83. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-stream.js +0 -0
  84. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-swig.js +0 -0
  85. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/controller.render-v1.js +0 -0
  86. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/controller/index.js +0 -0
  87. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/LICENSE +0 -0
  88. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/README.md +0 -0
  89. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  90. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  91. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  92. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  93. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/busboy-1.6.0/package.json +0 -0
  94. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  95. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  96. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/deps/streamsearch-1.1.0/package.json +0 -0
  97. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/index.js +0 -0
  98. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/lib/class.js +0 -0
  99. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/lib/factory.js +0 -0
  100. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/dev/lib/tools.js +0 -0
  101. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/gna.js +0 -0
  102. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/README.md +0 -0
  103. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/currency.json +0 -0
  104. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/language/en.json +0 -0
  105. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/language/fr.json +0 -0
  106. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/region/en.json +0 -0
  107. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/dist/region/fr.json +0 -0
  108. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/locales/index.js +0 -0
  109. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/mime.types +0 -0
  110. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/entity.js +0 -0
  111. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/index.js +0 -0
  112. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/template/entityFactory.js +0 -0
  113. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/model/template/index.js +0 -0
  114. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/README.md +0 -0
  115. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/file/README.md +0 -0
  116. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/file/build.json +0 -0
  117. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/file/package.json +0 -0
  118. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/README.md +0 -0
  119. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/build.json +0 -0
  120. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/package.json +0 -0
  121. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/intl/src/main.js +0 -0
  122. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/session/README.md +0 -0
  123. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/session/package.json +0 -0
  124. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/README.md +0 -0
  125. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/build.json +0 -0
  126. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/package.json +0 -0
  127. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/storage/src/main.js +0 -0
  128. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/README.md +0 -0
  129. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/build.json +0 -0
  130. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/plugins/lib/validator/package.json +0 -0
  131. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/router.js +0 -0
  132. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/server.express.js +0 -0
  133. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/server.isaac.js +0 -0
  134. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/status.codes +0 -0
  135. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/_gitignore +0 -0
  136. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/app.json +0 -0
  137. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  138. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/routing.json +0 -0
  139. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/settings.json +0 -0
  140. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  141. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/templates.json +0 -0
  142. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  143. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  144. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  145. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  146. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  147. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  148. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  149. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  150. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  151. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  152. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_public/readme.md +0 -0
  153. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  154. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  155. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  156. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  157. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  158. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/command/gina.bat.tpl +0 -0
  159. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/command/gina.tpl +0 -0
  160. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/env.json +0 -0
  161. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/manifest.json +0 -0
  162. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/package.json +0 -0
  163. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/statics.json +0 -0
  164. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/conf/templates.json +0 -0
  165. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/client/json/401.json +0 -0
  166. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/client/json/403.json +0 -0
  167. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/client/json/404.json +0 -0
  168. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/server/html/50x.html +0 -0
  169. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/server/json/500.json +0 -0
  170. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/error/server/json/503.json +0 -0
  171. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/core/template/extensions/logger/config.json +0 -0
  172. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/console.js +0 -0
  173. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/context.js +0 -0
  174. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/LICENSE +0 -0
  175. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/README.md +0 -0
  176. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/package.json +0 -0
  177. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/data/src/main.js +0 -0
  178. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/dateFormat.js +0 -0
  179. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/index.js +0 -0
  180. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/LICENSE +0 -0
  181. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/README.md +0 -0
  182. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/package.json +0 -0
  183. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/json/src/main.js +0 -0
  184. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/path.js +0 -0
  185. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/README.md +0 -0
  186. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/package.json +0 -0
  187. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/src/api-error.js +0 -0
  188. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/plugins/src/main.js +0 -0
  189. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/prototypes.js +0 -0
  190. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/task.js +0 -0
  191. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/helpers/text.js +0 -0
  192. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/README.md +0 -0
  193. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/build.json +0 -0
  194. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/package.json +0 -0
  195. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/src/dep/jszip.min.js +0 -0
  196. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/archiver/src/main.js +0 -0
  197. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/async/package.json +0 -0
  198. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/async/src/main.js +0 -0
  199. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/README.md +0 -0
  200. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/build.json +0 -0
  201. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/package.json +0 -0
  202. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cache/src/main.js +0 -0
  203. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/aliases.json +0 -0
  204. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/add.js +0 -0
  205. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/arguments.json +0 -0
  206. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/build.js +0 -0
  207. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/copy.js +0 -0
  208. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/cp.js +0 -0
  209. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/help.js +0 -0
  210. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/help.txt +0 -0
  211. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/list.js +0 -0
  212. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/mcp-start.js +0 -0
  213. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/mcp.js +0 -0
  214. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/oas.js +0 -0
  215. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/openapi.js +0 -0
  216. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/remove.js +0 -0
  217. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/rename.js +0 -0
  218. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/restart.js +0 -0
  219. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/rm.js +0 -0
  220. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/start.js +0 -0
  221. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/status.js +0 -0
  222. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/bundle/stop.js +0 -0
  223. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/cache/stats.js +0 -0
  224. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/add.js +0 -0
  225. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/arguments.json +0 -0
  226. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/help.js +0 -0
  227. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/help.txt +0 -0
  228. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/list.js +0 -0
  229. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/migrate.js +0 -0
  230. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/remove.js +0 -0
  231. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/connector/rm.js +0 -0
  232. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/add.js +0 -0
  233. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/get.js +0 -0
  234. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/help.js +0 -0
  235. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/help.txt +0 -0
  236. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/link-dev.js +0 -0
  237. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/list.js +0 -0
  238. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/remove.js +0 -0
  239. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/rm.js +0 -0
  240. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/set.js +0 -0
  241. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/unset.js +0 -0
  242. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/env/use.js +0 -0
  243. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/arguments.json +0 -0
  244. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/build.js +0 -0
  245. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/dot.js +0 -0
  246. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/get.js +0 -0
  247. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/help.js +0 -0
  248. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/help.txt +0 -0
  249. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/init.js +0 -0
  250. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/link-node-modules.js +0 -0
  251. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/link.js +0 -0
  252. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/msg.json +0 -0
  253. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/open.js +0 -0
  254. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/restart.js +0 -0
  255. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/set.js +0 -0
  256. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/start.js +0 -0
  257. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/status.js +0 -0
  258. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/stop.js +0 -0
  259. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/tail.js +0 -0
  260. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/update.js +0 -0
  261. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/framework/version.js +0 -0
  262. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/gina-dev.1.md +0 -0
  263. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/gina-framework.1.md +0 -0
  264. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/gina.1.md +0 -0
  265. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/helper.js +0 -0
  266. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/index.js +0 -0
  267. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/inspector/help.js +0 -0
  268. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/inspector/help.txt +0 -0
  269. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/inspector/open.js +0 -0
  270. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/minion/help.js +0 -0
  271. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/minion/help.txt +0 -0
  272. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/msg.json +0 -0
  273. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/help.js +0 -0
  274. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/help.txt +0 -0
  275. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/inc/scan.js +0 -0
  276. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/list.js +0 -0
  277. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/reset.js +0 -0
  278. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/port/set.js +0 -0
  279. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/add.js +0 -0
  280. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/arguments.json +0 -0
  281. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/build.js +0 -0
  282. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/help.js +0 -0
  283. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/help.txt +0 -0
  284. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/import.js +0 -0
  285. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/list.js +0 -0
  286. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/move.js +0 -0
  287. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/remove.js +0 -0
  288. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/rename.js +0 -0
  289. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/restart.js +0 -0
  290. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/rm.js +0 -0
  291. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/start.js +0 -0
  292. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/status.js +0 -0
  293. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/project/stop.js +0 -0
  294. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/help.js +0 -0
  295. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/help.txt +0 -0
  296. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/list.js +0 -0
  297. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/protocol/set.js +0 -0
  298. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/add.js +0 -0
  299. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/help.js +0 -0
  300. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/help.txt +0 -0
  301. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/link-local.js +0 -0
  302. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/link-production.js +0 -0
  303. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/list.js +0 -0
  304. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/remove.js +0 -0
  305. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/rm.js +0 -0
  306. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/scope/use.js +0 -0
  307. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/service/help.js +0 -0
  308. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/service/help.txt +0 -0
  309. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/service/list.js +0 -0
  310. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cmd/view/add.js +0 -0
  311. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/README.md +0 -0
  312. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/build.json +0 -0
  313. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/package.json +0 -0
  314. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/collection/src/main.js +0 -0
  315. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/config.js +0 -0
  316. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/connector-registry/package.json +0 -0
  317. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/connector-registry/src/main.js +0 -0
  318. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cron/README.md +0 -0
  319. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cron/package.json +0 -0
  320. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/cron/src/main.js +0 -0
  321. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/LICENSE +0 -0
  322. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/README.md +0 -0
  323. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/package.json +0 -0
  324. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/domain/src/main.js +0 -0
  325. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/generator/index.js +0 -0
  326. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/index.js +0 -0
  327. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/LICENSE +0 -0
  328. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/README.md +0 -0
  329. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/package.json +0 -0
  330. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inherits/src/main.js +0 -0
  331. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inspector-redact/package.json +0 -0
  332. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/inspector-redact/src/main.js +0 -0
  333. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/README.md +0 -0
  334. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/package.json +0 -0
  335. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/default/index.js +0 -0
  336. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/file/index.js +0 -0
  337. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  338. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  339. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/mq/index.js +0 -0
  340. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/mq/listener.js +0 -0
  341. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/containers/mq/speaker.js +0 -0
  342. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/helper.js +0 -0
  343. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/logger/src/main.js +0 -0
  344. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/math/index.js +0 -0
  345. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-dispatch/package.json +0 -0
  346. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-dispatch/src/main.js +0 -0
  347. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-http/package.json +0 -0
  348. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-http/src/main.js +0 -0
  349. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-server/package.json +0 -0
  350. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/mcp-server/src/main.js +0 -0
  351. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/merge/README.md +0 -0
  352. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/merge/package.json +0 -0
  353. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/merge/src/main.js +0 -0
  354. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/model.js +0 -0
  355. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-filters/README.md +0 -0
  356. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-filters/package.json +0 -0
  357. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-filters/src/main.js +0 -0
  358. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-resolver/package.json +0 -0
  359. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/nunjucks-resolver/src/main.js +0 -0
  360. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/proc.js +0 -0
  361. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/README.md +0 -0
  362. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/build.json +0 -0
  363. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/package.json +0 -0
  364. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing/src/radix.js +0 -0
  365. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing-introspect/package.json +0 -0
  366. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/routing-introspect/src/main.js +0 -0
  367. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/session-store.js +0 -0
  368. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/shell.js +0 -0
  369. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/state.js +0 -0
  370. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-filters/README.md +0 -0
  371. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-filters/package.json +0 -0
  372. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-filters/src/main.js +0 -0
  373. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-resolver/package.json +0 -0
  374. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/swig-resolver/src/main.js +0 -0
  375. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/url/README.md +0 -0
  376. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/url/index.js +0 -0
  377. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/url/routing.json +0 -0
  378. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/uuid/package.json +0 -0
  379. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/uuid/src/main.js +0 -0
  380. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/validator.js +0 -0
  381. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/watcher/package.json +0 -0
  382. /package/framework/{v0.3.7-alpha.8 → v0.3.7}/lib/watcher/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,12 +6,29 @@ 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.7 - 2026-04-26
10
+ ### Added
11
+ * Released `0.3.7` — cumulative stable of the `0.3.7-alpha.1` through `0.3.7-alpha.10` cycle. Headline tracks: **Web Security CSRF trilogy** (`gina.plugins.Session()` cookie hardening + `gina.plugins.Csrf()` signed double-submit token middleware + Origin/Referer pre-filter; OWASP ASVS 4.0 V4.2.1 aligned; opt-in plugin shape; per-route `csrfExempt: true` for webhook receivers). **Nunjucks template engine opt-in** (`render.engine = "nunjucks"` per bundle; filter parity #NJ1, setResources/asset injection #NJ2, render cache #NJ3, Early Hints 103 auto-send #NJ4). **MCP server** (`bundle:mcp` static manifest emit + `bundle:mcp-start` stdio and HTTP transports; #AI8 Phases 1/2a/2b). **Connector CLI** (`connector:list/add/rm/migrate`; #CN10). **Eval-safety hardening** (#SCS1 family — collection safe-evaluator + validator-plugin grammar-locked walker replacements; vendored-dep CVE-visibility invariant locked in via OSV scan workflow). Supply-chain trim (`psl` swap for vendored MPL-2.0 PSL data, `optimist` removal). Release-pipeline hardening (`gna.js` stable-version sync at framework-dir rename, StateStore + gina.db sync across renames, asset-plugin build honours `--gzip-bin`/`--brotli-bin` overrides). Plus `Session.name` drop-in identity restoration in alpha.10. See per-alpha sections for per-feature detail and test counts; full suite 3822/3822 at the stable cut.
12
+
13
+ ## 0.3.7-alpha.10 - 2026-04-26 (npm only — no git tag)
14
+ ### Fixed
15
+ * `gina.plugins.Session()` no longer clobbers the wrapper's `Function.name` property. Bundles that introspect the wrapper (`require('gina').plugins.Session(require('express-session')).name`) now see `'session'` (matching upstream) instead of `'ginaSession'`. Achieved via a small refactor: the outer wrapper delegates to an inner `ginaSessionDispatch` named function, with `Object.defineProperty(wrapped, 'name', { value: expressSession.name, configurable: true })` overriding the outer `.name`. The inner `ginaSessionDispatch` frame stays visible in stack traces, so gina remains detectable for debugging while the public-facing identity is the upstream's. Static-surface preservation (`Store`, `MemoryStore`, `Session`, `Cookie`) and the SameSite=None invariant are unchanged. 2 new unit tests in `test/core/session-plugin.test.js` (drop-in identity assertion + stack-trace visibility lock). Full suite 3768/3768 (3766 baseline + 2 new). Surfaced from a freelancer/v3 session: "Gina's wrapper clobbering expressSession.name — is an upstream concern".
16
+ ### Security
17
+ * `gina.plugins.Csrf()` now layers an Origin/Referer pre-filter ON TOP of the signed double-submit token verify (`#CSRF3`). On every mutating request (POST/PUT/PATCH/DELETE) the middleware reads `Origin` first, falls back to parsing the host out of `Referer` when `Origin` is absent (or is the literal `"null"` sentinel browsers send for sandboxed iframes), and matches the result against `settings.json > csrf.allowedOrigins`. Both headers missing → 403 `[csrf] forbidden — missing origin/referer`. Mismatch → 403 `[csrf] forbidden — origin not allowed`. The token verify only runs after the Origin check passes, so a forged token + matching cookie still gets rejected when the request didn't come from an allowed origin (token layer ≠ Origin layer). Per-route `csrfExempt: true` bypasses BOTH layers consistently. New `settings.json` key `csrf.allowedOrigins`: empty/unset defaults to `[bundleHostname]` (auto-derived from `conf[bundle][env].hostname` or composed from `server.scheme + host + server.port`); non-empty replaces the default with an explicit allowlist for multi-domain bundles. Entries are matched literally case-insensitive after parsing down to `scheme://host[:port]` — different scheme on the same host doesn't match (`http://example.com` ≠ `https://example.com`); different port doesn't match. Factory throws at startup when `csrf.allowedOrigins` is empty AND no bundle hostname can be resolved — error message points at both fixes. 54 new unit tests (parser helpers, allowlist precedence, behavioural matrix Origin × Referer × allowlist, scheme/port discrimination, `Origin: "null"` sentinel handling, negative-invariant lock that matching token + mismatching Origin still 403s, exempt interaction, source-inspection guards pinning the pre-filter ordering); full suite 3822/3822 (prior 3768 + 54). Closes the three-phase CSRF trilogy started by `#CSRF1` (cookie hardening, alpha.8) and `#CSRF2` (signed double-submit token, alpha.9).
18
+
19
+ ## 0.3.7-alpha.9 - 2026-04-26 (npm only — no git tag)
20
+ ### Added
21
+ * Exposed gina.csrfToken and gina.csrfInput in swig template context (#CSRF2 follow-up). When a bundle has registered the Csrf plugin and req.csrfToken is set on the active request, controller.js > setOptions() now publishes two keys to the template data: gina.csrfToken (raw base64url string) and gina.csrfInput (pre-formatted <input type="hidden" name="<fieldName>" value="<token>"> HTML). Templates render the hidden input with either {{ gina.csrfInput | safe }} or the manual <input ... value="{{ gina.csrfToken }}"> form. The field name comes from settings.json > csrf.fieldName (default _csrf, matching the plugin) and is HTML-attribute-escaped defensively (& " < >) before interpolation. The token itself is base64url ([A-Za-z0-9_-]) by construction so it is interpolated verbatim — encoding it would break round-trip when the form is submitted. When req.csrfToken is absent (bundle has not adopted the plugin) neither key is set; templates can guard with {% if gina.csrfToken %}. 25 unit tests in test/core/controller-csrf-context.test.js cover the source-inspection guards, the missing/empty/non-string rejection, the configured-fieldName path, the four HTML-attribute escapes, and the negative invariant (no eval, no template-literal interpolation, no encoding of the token).
22
+ ### Security
23
+ * Added gina.plugins.Csrf() — signed double-submit token CSRF middleware (#CSRF2). New core/plugins/lib/csrf/ middleware sits in the Express drain after the Session plugin. Token shape: HMAC-SHA256(sessionId + ':' + nonce_b64url, GINA_CSRF_SECRET); nonce is 16 bytes from crypto.getRandomValues; both halves base64url-encoded; verify uses crypto.timingSafeEqual with a length guard. Mutating methods (POST/PUT/PATCH/DELETE) require a matching value in X-Gina-CSRF-Token header or _csrf form field; safe methods (GET/HEAD/OPTIONS) issue a token cookie and pass through. Per-route opt-out via routing.json > "csrfExempt": true for webhook receivers (Stripe, GitHub, etc.) — positive-assertion key chosen so a misread breaks the webhook (obvious) rather than CSRF-vulnerable (silent). Stateless so it scales with distributed Redis/K8s sessions without server-side storage; signed so sibling subdomains cannot inject cookies. Adoption is two lines in the bundle bootstrap, AFTER the session middleware: var csrf = require('gina').plugins.Csrf(); app.use(csrf). Server secret (GINA_CSRF_SECRET, generate with openssl rand -base64 64) is required at factory-call time — there is no dev fallback. Sessionless or session-after-csrf misorder produces a clear next(err) message that points at the fix ("Csrf plugin requires the Session plugin to be registered before it"). Settings template seeds csrf.{cookieName,headerName,fieldName,rotate,safeMethods}; the secret is never stored in settings. server.js + lib/routing/src/main.js propagate routing[name].csrfExempt to req.routing.csrfExempt next to cache and queryTimeout. 69 unit tests in test/core/csrf-plugin.test.js (source-inspection guards, generateToken/verifyToken primitives, negative-invariant lock against ==/===/Buffer.compare/.includes on the token path, issue + verify middlewares end-to-end through stub req/res, per-route exempt, plugin registration, settings template integrity). Full suite 3714/3714. Followups in commit 2 (validator AJAX header injection) + commit 3 (controller template context) close the user-facing surface; this commit ships the verify gate and the seam.
24
+ * Validator AJAX requests now inject the X-Gina-CSRF-Token header on mutating methods (#CSRF2 follow-up). The browser-side validator plugin reads the gina-csrf-token cookie (set by the Csrf plugin) and adds the matching X-Gina-CSRF-Token request header on POST/PUT/PATCH/DELETE XHR calls; safe methods (GET/HEAD/OPTIONS) bypass injection. Three injection sites covered: form-submit XHR (core/plugins/lib/validator/src/main.js header loop), file-removal DELETE/POST (same file, xhrOptions block), and live-validation queries (core/plugins/lib/validator/src/form-validator.js). Adds two pure helpers — readCsrfCookie() (parses document.cookie via indexOf+slice; no regex on user-controlled segments; URL-decodes the token; returns null when absent) and isMutatingMethod() (returns false for GET/HEAD/OPTIONS, true for everything else). Cookie name (gina-csrf-token) and header name (X-Gina-CSRF-Token) hardcoded to match the plugin defaults — settings.json overrides apply server-side only; if a bundle changes the names, the validator fall-back is to ship no header (safe — server rejects, dev sees 403). Browser bundle (dist/vendor/gina/js/gina.*) rebuilt because both validator src files are aliased into the client-side AMD tree via build.json. Negative invariant locked: no eval, no Function constructor in the new helper region. 27 unit tests in test/core/validator-csrf-injection.test.js (source-inspection guards pinning the three injection sites, readCsrfCookie pure-parser behaviour, isMutatingMethod safe-method bypass, end-to-end XHR stub coverage of cookie-present/cookie-absent x mutating/safe matrix, eval / new Function rejection). Full suite 3766/3766 (3739 baseline + 27 new).
25
+
9
26
  ## 0.3.7-alpha.8 - 2026-04-25 (npm only — no git tag)
10
27
  ### Fixed
11
28
  * StateStore + gina.db now stay in sync with main.json/settings.json across framework-directory renames during `bumpVersion`. Closes a silent drift that affected every alpha cut for several versions and required manual SQLite patches. Two failure modes addressed: relative `require('../state')` resolution after the rename invalidated the generator's `__dirname`, and `StateStore._homeDir` returning null in build-script context where `GINA_HOMEDIR` isn't injected. Future violators of either invariant now log a visible warning instead of silently falling through to a JSON-sidecar-only write.
12
29
  * `framework/v*/core/asset/plugin/build` now honours the `--gzip-bin` and `--brotli-bin` CLI overrides. Six `-exec gzip -9 -n -k` / `-exec brotli --best` calls were hardcoded and silently defeated the flags; they now use the `${gzip_bin}` / `${brotli_bin}` variables resolved via `which` or set by the user.
13
30
 
14
- ## 0.3.7-alpha.7 - 2026-04-25
31
+ ## 0.3.7-alpha.7 - 2026-04-25 (npm only — no git tag)
15
32
  ### Fixed
16
33
  * Schema `$schema` identifier updated from `http://json-schema.org/draft-07/schema#` to `https://json-schema.org/draft-07/schema#` across all seven `schema/*.json` files (app, app.crons, connectors, manifest, routing, settings, watchers). The plain-HTTP form redirects to HTTPS and is bot-blocked by json-schema.org; IDEs and JSON validators that dereference the identifier at validation time were hitting the 302/403 chain instead of fetching the canonical schema. Matches the URI shown in the JSON Schema draft-07 spec and aligns with the `$id` field, which already uses `https://`. First batch from the link-health audit (gina-io/gina#18).
17
34
  * Refreshed stale URL references in code comments and man pages across the framework (link-health audit gina-io/gina#18): `core/template/boilerplate/bundle/controllers/setup.js` — dropped reference to the deleted `github.com/jmcmanus/pagedown-extra` repo (the commented-out example code uses `marked`, not pagedown-extra; the link was misleading even before the repo died). `core/connectors/couchbase/lib/session-store.v{2,3,4}.js` — updated `github.com/visionmedia/connect-redis` to `github.com/tj/connect-redis` (the maintainer renamed; old URL still 302s but relying on a stale redirect chain is brittle). `core/locales/README.md` — replaced `currency-iso.org/en/home/tables/table-a1.html` (folded into a SIX Swiss Exchange commercial page) with the canonical `iso.org/iso-4217-currency-codes.html`. `lib/cmd/gina.1.md`, `gina-dev.1.md`, `gina-framework.1.md` — modernised the `groups.google.com/forum/#!forum/ginajs` mailing-list link to the supported `groups.google.com/g/ginajs` URL format. The Google Group itself is still active; only the hash-bang URL format is obsolete. `core/server.js` — dropped dead `strongloop.com/strongblog/...` blog-post reference (domain TLS-broken, StrongLoop dissolved into IBM in 2015, the blog post is not reachable via any successor) and dead `jsperf.com/arraybuffer-string-conversion/4` test reference (410 Gone; jsperf relaunched on Cloudflare but the historical test data was not restored). Comment-only changes; no runtime behaviour modified.
package/ROADMAP.md CHANGED
@@ -28,6 +28,7 @@ This roadmap covers planned features, architectural improvements, new connectors
28
28
  | --- | --- | --- | --- |
29
29
  | ✅ | **Automatic version migration** — Upgrading or downgrading gina (e.g. `0.1.x → 0.2.0`, `0.5.x → 1.0.0`) automatically migrates `~/.gina/` config to the new version on first startup. Downgrade is free — old version data is never removed. | `0.1.8` | 2026-03-26 |
30
30
  | ✅ | **`watchers.json`** — First-class bundle config for file watchers. Declare watchers on config files with event-based notification (no polling). Foundation for the dev-mode hot-reload system. | `0.2.0` | 2026-03-29 |
31
+ | 📋 | **i18n core** — Per-bundle message catalogs under `bundle/locales/<culture>.json` with a fallback chain (specific culture → base language → default). Server-side `t(key, [params], [culture])` global helper with parameter interpolation and CLDR pluralisation. Swig and Nunjucks filters with the same surface (`{{ "key"\|t }}`, `{{ "key"\|t({ name: x }) }}`). Per-request locale negotiation from URL prefix / cookie / `Accept-Language` / settings default. CLI: `gina i18n:scan` for missing-key coverage per culture, `i18n:add <culture>` to seed a new catalog, `i18n:export` / `i18n:import` for `.po` / `.csv` / `.json` round-trip with translators. Headless by design — the visual translation editor lands later as the first content feature in Beemaster (admin Phase 3). | `0.3.8` | Q2 2026 |
31
32
  | 📋 | **PWA scaffold** — `gina bundle:add` drops `manifest.json`, a service worker stub (`sw.js`), and the required `<meta>` / `<link>` tags into the bundle boilerplate. Zero runtime dependency. Enables Gina apps to be installed on mobile as PWAs without additional tooling. | `0.4.0` | Q4 2026 |
32
33
  | ✅ | **Per-bundle framework version** — Declare `"gina_version": "0.1.8"` on any bundle entry in `manifest.json` to pin that bundle to a specific installed framework version. The socket server continues running its own version; only the spawned bundle process uses the declared version. Validated against the tracked version list in `main.json` before start. `--gina-version=X.Y.Z` flag on `bundle:start` provides the same override without touching config files. | `0.3.0` | 2026-03-31 |
33
34
  | ✅ | **PATCH method** — `req.patch` populated with the parsed request body (JSON or form-encoded). `req.body` aliases `req.patch`. URI params merged. `"method": "PATCH"` valid in `routing.json`. Use PATCH for partial updates (only sent fields change) vs PUT which replaces the full resource. | `0.3.0` | 2026-03-31 |
@@ -137,13 +138,13 @@ Complete the removal of `eval` / `new Function` call sites from the published ta
137
138
 
138
139
  ## Web Security
139
140
 
140
- Cross-site request forgery protection. Three-phase defense-in-depth plan aligned with OWASP ASVS 4.0 V4.2.1; each phase shippable on its own. Cookie hardening shipped as an opt-in plugin in `0.3.7-alpha.8`; token middleware and Origin pre-filter still open.
141
+ Cross-site request forgery protection. Three-phase defense-in-depth plan aligned with OWASP ASVS 4.0 V4.2.1; each phase shippable on its own. All three phases shipped: cookie hardening in `0.3.7-alpha.8`, signed double-submit token middleware in `0.3.7-alpha.9`, Origin/Referer pre-filter in `0.3.7-alpha.10`.
141
142
 
142
143
  | Status | Feature | Version | Target |
143
144
  | --- | --- | --- | --- |
144
145
  | ✅ | **Cookie hardening (baseline)** — Opt-in plugin `gina.plugins.Session` wraps `express-session` and injects `SameSite=Lax` + `HttpOnly` + `Secure=auto` defaults from `settings.json > session.cookie.{sameSite,httpOnly,secure}` into the cookie options before the middleware sees them. Bundle-supplied cookie options always win, so intentional configuration is preserved. Adoption is a one-line swap in the bundle bootstrap: `var session = require('gina').plugins.Session(require('express-session'))`. Browser-parity invariant enforced at factory call time: `SameSite=None` without `Secure` throws at bundle startup. Migration guide flags cross-site cookie-send bundles (rare — third-party OAuth embeds, iframe flows) that must set `sameSite: "none"` + `secure: true` explicitly. 41 unit tests (source-inspection guards + mergeCookie + invariant negative-lock + resolveSettingsDefaults + end-to-end through stub express-session + registration + template integrity). | `0.3.7-alpha.8` | 2026-04-24 |
145
- | 📋 | **Signed double-submit token middleware** — Stateless signed-double-submit-cookie pattern (OWASP ASVS 4.0 V4.2.1). HMAC-SHA256 cookie bound to session ID + matching `X-Gina-CSRF-Token` header (or `_csrf` form field) required on POST/PUT/PATCH/DELETE; `timingSafeEqual` comparison; safe methods (GET/HEAD/OPTIONS) pass through. Per-route opt-out via `routing.json > "csrfExempt": true` for webhook receivers (Stripe, GitHub, etc.). Client integration: the validator plugin auto-reads the cookie and sets the header on AJAX submits zero user code change. Templates get `{{ gina.csrfToken }}` and `{{ gina.csrfInput \| safe }}` helpers for `<form>` hidden inputs. Stateless so it scales with distributed Redis/K8s sessions without server-side storage; signed so sibling subdomains cannot inject cookies. Performance: ~microseconds per mutating request. | `0.3.8` | Q3 2026 |
146
- | 📋 | **Origin/Referer pre-filter** — Secondary check on mutating methods, layered on top of the token middleware: `Origin` (or `Referer` fallback) must match the bundle's configured hostname or an explicit allowlist. Configured via `settings.json > csrf.allowedOrigins`. Belt-and-suspenders catching edge cases tokens might miss (referrer-header log leaks, legacy browser bugs, misconfigured reverse proxies). Performance: one string compare per mutating request. | `0.4.0` | Q4 2026 |
146
+ | | **Signed double-submit token middleware** — Stateless signed-double-submit-cookie pattern (OWASP ASVS 4.0 V4.2.1). Opt-in plugin `gina.plugins.Csrf()`: HMAC-SHA256 cookie bound to session ID + matching `X-Gina-CSRF-Token` header (or `_csrf` form field) required on POST/PUT/PATCH/DELETE; `timingSafeEqual` comparison; safe methods (GET/HEAD/OPTIONS) pass through. Per-route opt-out via `routing.json > "csrfExempt": true` for webhook receivers (Stripe, GitHub, etc.). Server secret read from `process.env.GINA_CSRF_SECRET` at factory-call timeno dev fallback. Sessionless or session-after-csrf misorder produces a clear `next(err)` message pointing at the fix. Stateless so it scales with distributed Redis/K8s sessions without server-side storage; signed so sibling subdomains cannot inject cookies. 69 unit tests (source-inspection guards, generateToken/verifyToken primitives, negative-invariant lock, issue + verify middlewares, per-route exempt, plugin registration, settings template integrity). Validator AJAX header injection + controller template context (`{{ gina.csrfToken }}` / `{{ gina.csrfInput \| safe }}`) ship in follow-up commits. | `0.3.7-alpha.9` | 2026-04-25 |
147
+ | | **Origin/Referer pre-filter** — Secondary check on mutating methods, layered on top of the token middleware INSIDE `gina.plugins.Csrf()`: parses `Origin` first, falls back to the host portion of `Referer`, and matches against `settings.json > csrf.allowedOrigins`. Both headers missing 403 `missing origin/referer`. Mismatch → 403 `origin not allowed`. Empty/unset `allowedOrigins` defaults to `[bundleHostname]` (auto-derived from `conf[bundle][env].hostname` or composed from `server.scheme + host + server.port`); non-empty = explicit allowlist for multi-domain bundles. Per-route `csrfExempt: true` bypasses BOTH Origin and token layers consistently. Negative-invariant lock: matching token + mismatching Origin still 403s — token layer ≠ Origin layer. Factory throws at startup when neither a settings allowlist nor a bundle hostname can be resolved. 54 unit tests added (parseRequestOrigin/parseOriginString helpers, resolveBundleHostname, resolveAllowedOrigins precedence, behavioural matrix Origin × Referer × allowlist, scheme/port discrimination, `Origin: "null"` sentinel handling, negative-invariant lock, exempt interaction, source-inspection guards pinning the pre-filter ordering). Full suite 3822/3822 (prior 3768 + 54). | `0.3.7-alpha.10` | 2026-04-26 |
147
148
 
148
149
  ---
149
150
 
@@ -286,7 +287,7 @@ Windows compatibility is a hard requirement for `1.0.0`. The alpha scope covers
286
287
 
287
288
  ## Inspector
288
289
 
289
- Gina's built-in per-bundle inspector. Phases 1–2 ship as an embedded SPA at `/_gina/inspector/` inside every bundle's own HTTP server (dev mode). Phase 3 evolves it into a standalone web app served by `services/src/inspector/` that can connect to any bundle in any environment — including production. Beemaster (global admin app) is a separate project.
290
+ Gina's built-in per-bundle inspector. Phases 1–2 ship as an embedded SPA at `/_gina/inspector/` inside every bundle's own HTTP server (dev mode). Phase 3 evolves it into a standalone web app served by `services/src/inspector/` that can connect to any bundle in any environment — including production. Beemaster (global admin app) is a separate project — also the planned home for content-management surfaces such as the **i18n translation editor** (the visual layer of i18n core).
290
291
 
291
292
  **Why a standalone web app:** Electron is heavy and adds distribution burden. A browser extension is browser-specific and can't inspect from a different machine. The standalone web app works locally and remotely, any browser, zero install. A browser extension companion can be layered on top later.
292
293
 
@@ -0,0 +1 @@
1
+ 0.3.7
@@ -70,8 +70,8 @@
70
70
  }
71
71
 
72
72
  :root {
73
- --font: "SF Mono", "Fira Code", "Cascadia Code", Menlo, "Lucida Grande", monospace;
74
- --sans: "Lucida Grande", Lucida, Arial, Helvetica, sans-serif;
73
+ --font: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, 'Lucida Grande', monospace;
74
+ --sans: 'Lucida Grande', Lucida, Arial, Helvetica, sans-serif;
75
75
  --radius: 4px;
76
76
  --hdr: 32px;
77
77
  }
@@ -830,8 +830,6 @@ body {
830
830
  cursor: pointer;
831
831
  padding: 4px;
832
832
  transition: border-color 0.15s, background 0.15s;
833
- /* Reveal toggle — red tint when active so the unredacted state is visually
834
- distinct from the regular amber `.active` state used by RAW / fold-all. */
835
833
  }
836
834
  .bm-icon-btn svg {
837
835
  width: 14px;
@@ -855,6 +853,10 @@ body {
855
853
  .bm-icon-btn.bm-hidden {
856
854
  display: none;
857
855
  }
856
+ .bm-icon-btn {
857
+ /* Reveal toggle — red tint when active so the unredacted state is visually
858
+ distinct from the regular amber `.active` state used by RAW / fold-all. */
859
+ }
858
860
  .bm-icon-btn#bm-reveal.active {
859
861
  border-color: var(--err);
860
862
  background: rgba(231, 76, 60, 0.12);
@@ -1724,9 +1726,6 @@ details[open] > summary.bm-summary::before {
1724
1726
  cursor: pointer;
1725
1727
  user-select: none;
1726
1728
  position: relative;
1727
- /* Extend accent line to bridge the gap between consecutive selected rows */
1728
- /* Rounded corners on first/last of contiguous selected group */
1729
- /* Single-click copy feedback — green flash + checkmark */
1730
1729
  }
1731
1730
  .bm-log:hover {
1732
1731
  background: var(--bg3);
@@ -1734,11 +1733,13 @@ details[open] > summary.bm-summary::before {
1734
1733
  .bm-log.bm-log-selected {
1735
1734
  background: rgba(242, 175, 13, 0.13);
1736
1735
  border-bottom-color: transparent;
1737
- /* Left accent line — straight, unaffected by border-radius */
1738
1736
  }
1739
1737
  .bm-log.bm-log-selected:hover {
1740
1738
  background: rgba(242, 175, 13, 0.19);
1741
1739
  }
1740
+ .bm-log.bm-log-selected {
1741
+ /* Left accent line — straight, unaffected by border-radius */
1742
+ }
1742
1743
  .bm-log.bm-log-selected::before {
1743
1744
  content: "";
1744
1745
  position: absolute;
@@ -1757,9 +1758,15 @@ details[open] > summary.bm-summary::before {
1757
1758
  [data-theme=light] .bm-log.bm-log-selected:hover {
1758
1759
  background: rgba(200, 133, 10, 0.16);
1759
1760
  }
1761
+ .bm-log {
1762
+ /* Extend accent line to bridge the gap between consecutive selected rows */
1763
+ }
1760
1764
  .bm-log.bm-log-selected + .bm-log-selected::before {
1761
1765
  top: -1px;
1762
1766
  }
1767
+ .bm-log {
1768
+ /* Rounded corners on first/last of contiguous selected group */
1769
+ }
1763
1770
  .bm-log.bm-log-selected:not(.bm-log-selected + .bm-log) {
1764
1771
  border-radius: 6px 6px 0 0;
1765
1772
  }
@@ -1778,6 +1785,9 @@ details[open] > summary.bm-summary::before {
1778
1785
  .bm-log.bm-log-selected:not(.bm-log-selected + .bm-log):not(:has(+ .bm-log-selected))::before {
1779
1786
  border-radius: 3px 0 0 3px;
1780
1787
  }
1788
+ .bm-log {
1789
+ /* Single-click copy feedback — green flash + checkmark */
1790
+ }
1781
1791
  .bm-log.bm-log-row-copied {
1782
1792
  background: rgba(76, 175, 80, 0.15) !important;
1783
1793
  }
@@ -3603,3 +3613,5 @@ details[open] > summary.bm-summary::before {
3603
3613
  text-align: left;
3604
3614
  }
3605
3615
  }
3616
+
3617
+ /*# sourceMappingURL=inspector.css.map */
@@ -2866,6 +2866,68 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
2866
2866
  var dateFormat = (isGFFCtx) ? require('helpers/dateFormat') : helpers.dateFormat;
2867
2867
  var routing = (isGFFCtx) ? require('lib/routing') : require('../../../../../lib/routing');
2868
2868
 
2869
+ /**
2870
+ * #CSRF2 follow-up — read the gina-csrf-token cookie set by the Csrf plugin.
2871
+ *
2872
+ * Pure, dependency-free parser for `document.cookie`. Returns the token
2873
+ * value (URL-decoded) or null when the cookie is absent. Browser-only
2874
+ * (isGFFCtx); when running outside a browser document, returns null.
2875
+ *
2876
+ * No eval / Function / regex on user-controlled segments — name and
2877
+ * value are compared as plain strings via indexOf + slice only.
2878
+ *
2879
+ * @returns {string|null}
2880
+ * */
2881
+ var readCsrfCookie = function () {
2882
+ var name = 'gina-csrf-token';
2883
+ if ( typeof(document) === 'undefined' || !document || typeof(document.cookie) !== 'string' ) {
2884
+ return null;
2885
+ }
2886
+ var raw = document.cookie || '';
2887
+ if (!raw) {
2888
+ return null;
2889
+ }
2890
+ var parts = raw.split(';');
2891
+ for (var i = 0, len = parts.length; i < len; ++i) {
2892
+ var part = parts[i];
2893
+ while (part.charAt(0) === ' ' || part.charAt(0) === '\t') {
2894
+ part = part.slice(1);
2895
+ }
2896
+ var eq = part.indexOf('=');
2897
+ if (eq < 0) {
2898
+ continue;
2899
+ }
2900
+ var key = part.slice(0, eq);
2901
+ if (key !== name) {
2902
+ continue;
2903
+ }
2904
+ var val = part.slice(eq + 1);
2905
+ try {
2906
+ return decodeURIComponent(val);
2907
+ } catch (e) {
2908
+ return val;
2909
+ }
2910
+ }
2911
+ return null;
2912
+ };
2913
+
2914
+ /**
2915
+ * #CSRF2 follow-up — true for HTTP methods that mutate state.
2916
+ *
2917
+ * GET, HEAD, OPTIONS are CSRF-safe by spec. All other methods require
2918
+ * the X-Gina-CSRF-Token header.
2919
+ *
2920
+ * @param {string} method
2921
+ * @returns {boolean}
2922
+ * */
2923
+ var isMutatingMethod = function (method) {
2924
+ if ( typeof(method) !== 'string' || !method ) {
2925
+ return false;
2926
+ }
2927
+ var m = method.toUpperCase();
2928
+ return (m !== 'GET' && m !== 'HEAD' && m !== 'OPTIONS');
2929
+ };
2930
+
2869
2931
  var hasUserValidators = function() {
2870
2932
 
2871
2933
  var _hasUserValidators = false, formsContext = null;
@@ -3232,6 +3294,14 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
3232
3294
  xhr.setRequestHeader('Content-Type', enctype);
3233
3295
  }
3234
3296
 
3297
+ // #CSRF2 follow-up — inject X-Gina-CSRF-Token on mutating methods (live-validation path)
3298
+ if ( isMutatingMethod(queryOptions.method) ) {
3299
+ var csrfToken = readCsrfCookie();
3300
+ if (csrfToken) {
3301
+ xhr.setRequestHeader('X-Gina-CSRF-Token', csrfToken);
3302
+ }
3303
+ }
3304
+
3235
3305
  var onResult = function(result) {
3236
3306
 
3237
3307
  _this.value = local['data'][_this.name] = (_this.value) ? _this.value.toLowerCase() : _this.value;
@@ -5031,6 +5101,10 @@ function Routing() {
5031
5101
  if ( typeof(routeObject.cache) != 'undefined' ) {
5032
5102
  params.cache = routeObject.cache;
5033
5103
  }
5104
+ // #CSRF2 — propagate per-route Csrf opt-out to req.routing.csrfExempt
5105
+ if ( typeof(routeObject.csrfExempt) != 'undefined' ) {
5106
+ params.csrfExempt = routeObject.csrfExempt;
5107
+ }
5034
5108
  if ( typeof(routeObject.queryTimeout) != 'undefined' ) {
5035
5109
  params.queryTimeout = parseTimeout(routeObject.queryTimeout);
5036
5110
  }
@@ -9582,6 +9656,74 @@ function ValidatorPlugin(rules, data, formId) {
9582
9656
  }
9583
9657
  };
9584
9658
 
9659
+ /**
9660
+ * #CSRF2 follow-up — read the gina-csrf-token cookie set by the Csrf plugin.
9661
+ *
9662
+ * Pure, dependency-free parser for `document.cookie`. Returns the token
9663
+ * value (URL-decoded) or null when the cookie is absent. Browser-only
9664
+ * (isGFFCtx); when running outside a browser document, returns null.
9665
+ *
9666
+ * Default cookie name is 'gina-csrf-token' matching the Csrf plugin
9667
+ * settings.json default. The matching X-Gina-CSRF-Token header is
9668
+ * injected on mutating methods (POST/PUT/PATCH/DELETE) before xhr.send().
9669
+ *
9670
+ * No eval / Function / regex on user-controlled segments — name and
9671
+ * value are compared as plain strings via indexOf + slice only.
9672
+ *
9673
+ * @returns {string|null}
9674
+ * */
9675
+ var readCsrfCookie = function () {
9676
+ var name = 'gina-csrf-token';
9677
+ if ( typeof(document) === 'undefined' || !document || typeof(document.cookie) !== 'string' ) {
9678
+ return null;
9679
+ }
9680
+ var raw = document.cookie || '';
9681
+ if (!raw) {
9682
+ return null;
9683
+ }
9684
+ var parts = raw.split(';');
9685
+ for (var i = 0, len = parts.length; i < len; ++i) {
9686
+ var part = parts[i];
9687
+ // strip leading whitespace without regex
9688
+ while (part.charAt(0) === ' ' || part.charAt(0) === '\t') {
9689
+ part = part.slice(1);
9690
+ }
9691
+ var eq = part.indexOf('=');
9692
+ if (eq < 0) {
9693
+ continue;
9694
+ }
9695
+ var key = part.slice(0, eq);
9696
+ if (key !== name) {
9697
+ continue;
9698
+ }
9699
+ var val = part.slice(eq + 1);
9700
+ try {
9701
+ return decodeURIComponent(val);
9702
+ } catch (e) {
9703
+ return val;
9704
+ }
9705
+ }
9706
+ return null;
9707
+ };
9708
+
9709
+ /**
9710
+ * #CSRF2 follow-up — true for HTTP methods that mutate state.
9711
+ *
9712
+ * GET, HEAD, OPTIONS are CSRF-safe by spec (they MUST NOT carry side
9713
+ * effects). All other methods (POST, PUT, PATCH, DELETE, ...) require
9714
+ * the X-Gina-CSRF-Token header.
9715
+ *
9716
+ * @param {string} method
9717
+ * @returns {boolean}
9718
+ * */
9719
+ var isMutatingMethod = function (method) {
9720
+ if ( typeof(method) !== 'string' || !method ) {
9721
+ return false;
9722
+ }
9723
+ var m = method.toUpperCase();
9724
+ return (m !== 'GET' && m !== 'HEAD' && m !== 'OPTIONS');
9725
+ };
9726
+
9585
9727
  /**
9586
9728
  * backend definitions
9587
9729
  * */
@@ -10471,6 +10613,14 @@ function ValidatorPlugin(rules, data, formId) {
10471
10613
  xhr.setRequestHeader(hearder, options.headers[hearder]);
10472
10614
  }
10473
10615
 
10616
+ // #CSRF2 follow-up — inject X-Gina-CSRF-Token on mutating methods
10617
+ if ( isMutatingMethod(options.method) ) {
10618
+ var csrfToken = readCsrfCookie();
10619
+ if (csrfToken) {
10620
+ xhr.setRequestHeader('X-Gina-CSRF-Token', csrfToken);
10621
+ }
10622
+ }
10623
+
10474
10624
  if (xhr) {
10475
10625
  // catching ready state cb
10476
10626
  // Data loading ...
@@ -11544,6 +11694,13 @@ function ValidatorPlugin(rules, data, formId) {
11544
11694
  'X-Requested-With': 'XMLHttpRequest' // in case of cross domain origin
11545
11695
  }
11546
11696
  };
11697
+ // #CSRF2 follow-up — inject X-Gina-CSRF-Token on mutating methods (file remove → DELETE/POST)
11698
+ if ( isMutatingMethod(method) ) {
11699
+ let csrfToken = readCsrfCookie();
11700
+ if (csrfToken) {
11701
+ xhrOptions.headers['X-Gina-CSRF-Token'] = csrfToken;
11702
+ }
11703
+ }
11547
11704
  let xhr = setupXhr(xhrOptions);
11548
11705
  //handleXhr(xhr);
11549
11706
  if ( /GET|DELETE/i.test(method) ) {