gina 0.6.22 → 0.6.23

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 (599) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +18 -16
  3. package/ROADMAP.md +13 -0
  4. package/framework/v0.6.23/VERSION +1 -0
  5. package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.js +22 -5
  6. package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +249 -249
  7. package/framework/v0.6.23/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  8. package/framework/v0.6.23/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  9. package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.js +38 -8
  10. package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-nunjucks.js +6 -5
  11. package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-swig.js +10 -6
  12. package/framework/v0.6.23/core/controller/inline-script.js +108 -0
  13. package/framework/{v0.6.22 → v0.6.23}/core/server.isaac.js +13 -0
  14. package/framework/{v0.6.22 → v0.6.23}/core/server.js +129 -1
  15. package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/templates.json +3 -0
  16. package/framework/{v0.6.22 → v0.6.23}/core/template/conf/settings.json +63 -2
  17. package/framework/{v0.6.22 → v0.6.23}/core/template/conf/templates.json +1 -0
  18. package/framework/{v0.6.22 → v0.6.23}/lib/index.js +17 -0
  19. package/framework/{v0.6.22 → v0.6.23}/lib/merge/src/main.js +22 -5
  20. package/framework/v0.6.23/lib/security-headers-emitter/package.json +18 -0
  21. package/framework/v0.6.23/lib/security-headers-emitter/src/main.js +225 -0
  22. package/framework/v0.6.23/lib/sri/package.json +18 -0
  23. package/framework/v0.6.23/lib/sri/src/main.js +237 -0
  24. package/framework/{v0.6.22 → v0.6.23}/package.json +1 -1
  25. package/gna.js +4 -4
  26. package/llms.txt +2 -1
  27. package/package.json +3 -3
  28. package/schema/settings.json +47 -0
  29. package/types/index.d.ts +16 -0
  30. package/framework/v0.6.22/VERSION +0 -1
  31. package/framework/v0.6.22/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  32. package/framework/v0.6.22/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  33. /package/framework/{v0.6.22 → v0.6.23}/AUTHORS +0 -0
  34. /package/framework/{v0.6.22 → v0.6.23}/LICENSE +0 -0
  35. /package/framework/{v0.6.22 → v0.6.23}/core/asset/html/nolayout.html +0 -0
  36. /package/framework/{v0.6.22 → v0.6.23}/core/asset/html/static.html +0 -0
  37. /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/android-chrome-192x192.png +0 -0
  38. /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/android-chrome-512x512.png +0 -0
  39. /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/apple-touch-icon.png +0 -0
  40. /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/favicon-16x16.png +0 -0
  41. /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/favicon-32x32.png +0 -0
  42. /package/framework/{v0.6.22 → v0.6.23}/core/asset/img/favicon.ico +0 -0
  43. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/README.md +0 -0
  44. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  45. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  46. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  47. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  48. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  49. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  50. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  51. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  52. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  53. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  54. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  55. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  56. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  57. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  58. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  59. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  60. /package/framework/{v0.6.22 → v0.6.23}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  61. /package/framework/{v0.6.22 → v0.6.23}/core/config.js +0 -0
  62. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/ai/index.js +0 -0
  63. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/ai/lib/connector.js +0 -0
  64. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/index.js +0 -0
  65. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/connector.js +0 -0
  66. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  67. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  68. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/n1ql.js +0 -0
  69. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/session-store.js +0 -0
  70. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  71. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  72. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/couchbase/lib/storage-store.js +0 -0
  73. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/duckdb/index.js +0 -0
  74. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/duckdb/lib/connector.js +0 -0
  75. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/index.js +0 -0
  76. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/connector.js +0 -0
  77. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/job-store.js +0 -0
  78. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  79. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mongodb/lib/session-store.js +0 -0
  80. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mysql/index.js +0 -0
  81. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/mysql/lib/connector.js +0 -0
  82. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/param-redact.js +0 -0
  83. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/postgresql/index.js +0 -0
  84. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/postgresql/lib/connector.js +0 -0
  85. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/index.js +0 -0
  86. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/connector.js +0 -0
  87. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/job-store.js +0 -0
  88. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/kv-store.js +0 -0
  89. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/render-cache-store.js +0 -0
  90. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/redis/lib/session-store.js +0 -0
  91. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/scylladb/index.js +0 -0
  92. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/scylladb/lib/connector.js +0 -0
  93. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/scylladb/lib/session-store.js +0 -0
  94. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/settle-once.js +0 -0
  95. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sql-parser.js +0 -0
  96. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/index.js +0 -0
  97. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/connector.js +0 -0
  98. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/job-store.js +0 -0
  99. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/kv-store.js +0 -0
  100. /package/framework/{v0.6.22 → v0.6.23}/core/connectors/sqlite/lib/session-store.js +0 -0
  101. /package/framework/{v0.6.22 → v0.6.23}/core/content.encoding +0 -0
  102. /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.framework.js +0 -0
  103. /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-json.js +0 -0
  104. /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-nunjucks-async.js +0 -0
  105. /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-stream.js +0 -0
  106. /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-swig-async.js +0 -0
  107. /package/framework/{v0.6.22 → v0.6.23}/core/controller/controller.render-v1.js +0 -0
  108. /package/framework/{v0.6.22 → v0.6.23}/core/controller/index.js +0 -0
  109. /package/framework/{v0.6.22 → v0.6.23}/core/controller/inspector-window-emit.js +0 -0
  110. /package/framework/{v0.6.22 → v0.6.23}/core/controller/release-banner.js +0 -0
  111. /package/framework/{v0.6.22 → v0.6.23}/core/dev/index.js +0 -0
  112. /package/framework/{v0.6.22 → v0.6.23}/core/dev/lib/class.js +0 -0
  113. /package/framework/{v0.6.22 → v0.6.23}/core/dev/lib/factory.js +0 -0
  114. /package/framework/{v0.6.22 → v0.6.23}/core/dev/lib/tools.js +0 -0
  115. /package/framework/{v0.6.22 → v0.6.23}/core/gna.js +0 -0
  116. /package/framework/{v0.6.22 → v0.6.23}/core/locales/README.md +0 -0
  117. /package/framework/{v0.6.22 → v0.6.23}/core/locales/currency.json +0 -0
  118. /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/language/en.json +0 -0
  119. /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/language/fr.json +0 -0
  120. /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/region/en.json +0 -0
  121. /package/framework/{v0.6.22 → v0.6.23}/core/locales/dist/region/fr.json +0 -0
  122. /package/framework/{v0.6.22 → v0.6.23}/core/locales/index.js +0 -0
  123. /package/framework/{v0.6.22 → v0.6.23}/core/mime.types +0 -0
  124. /package/framework/{v0.6.22 → v0.6.23}/core/model/entity.js +0 -0
  125. /package/framework/{v0.6.22 → v0.6.23}/core/model/index.js +0 -0
  126. /package/framework/{v0.6.22 → v0.6.23}/core/model/template/entityFactory.js +0 -0
  127. /package/framework/{v0.6.22 → v0.6.23}/core/model/template/index.js +0 -0
  128. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/README.md +0 -0
  129. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/index.js +0 -0
  130. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/csrf/README.md +0 -0
  131. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/csrf/package.json +0 -0
  132. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/csrf/src/main.js +0 -0
  133. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/README.md +0 -0
  134. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coep/README.md +0 -0
  135. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coep/package.json +0 -0
  136. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  137. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coop/README.md +0 -0
  138. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coop/package.json +0 -0
  139. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  140. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/corp/README.md +0 -0
  141. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/corp/package.json +0 -0
  142. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  143. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/csp/README.md +0 -0
  144. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/csp/package.json +0 -0
  145. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  146. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  147. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  148. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  149. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  150. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  151. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  152. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  153. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  154. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  155. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/package.json +0 -0
  156. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  157. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  158. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  159. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/src/main.js +0 -0
  160. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  161. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  162. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  163. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  164. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  165. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  166. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  167. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  168. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  169. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  170. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  171. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  172. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  173. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  174. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  175. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  176. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  177. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  178. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/session/README.md +0 -0
  179. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/session/package.json +0 -0
  180. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/session/src/main.js +0 -0
  181. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/README.md +0 -0
  182. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/build.json +0 -0
  183. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/package.json +0 -0
  184. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/storage/src/main.js +0 -0
  185. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/README.md +0 -0
  186. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/build.json +0 -0
  187. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/package.json +0 -0
  188. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/src/form-validator.js +0 -0
  189. /package/framework/{v0.6.22 → v0.6.23}/core/plugins/lib/validator/src/main.js +0 -0
  190. /package/framework/{v0.6.22 → v0.6.23}/core/router.js +0 -0
  191. /package/framework/{v0.6.22 → v0.6.23}/core/server.express.js +0 -0
  192. /package/framework/{v0.6.22 → v0.6.23}/core/status.codes +0 -0
  193. /package/framework/{v0.6.22 → v0.6.23}/core/template/_gitignore +0 -0
  194. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/app.json +0 -0
  195. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  196. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/routing.json +0 -0
  197. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/settings.json +0 -0
  198. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  199. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  200. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  201. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  202. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  203. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/index.js +0 -0
  204. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle/locales/en.json +0 -0
  205. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  206. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  207. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  208. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  209. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  210. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  211. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  212. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  213. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/readme.md +0 -0
  214. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_public/sw.js +0 -0
  215. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  216. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  217. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  218. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  219. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  220. /package/framework/{v0.6.22 → v0.6.23}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  221. /package/framework/{v0.6.22 → v0.6.23}/core/template/command/gina.bat.tpl +0 -0
  222. /package/framework/{v0.6.22 → v0.6.23}/core/template/command/gina.tpl +0 -0
  223. /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/env.json +0 -0
  224. /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/manifest.json +0 -0
  225. /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/package.json +0 -0
  226. /package/framework/{v0.6.22 → v0.6.23}/core/template/conf/statics.json +0 -0
  227. /package/framework/{v0.6.22 → v0.6.23}/core/template/error/client/json/401.json +0 -0
  228. /package/framework/{v0.6.22 → v0.6.23}/core/template/error/client/json/403.json +0 -0
  229. /package/framework/{v0.6.22 → v0.6.23}/core/template/error/client/json/404.json +0 -0
  230. /package/framework/{v0.6.22 → v0.6.23}/core/template/error/server/html/50x.html +0 -0
  231. /package/framework/{v0.6.22 → v0.6.23}/core/template/error/server/json/500.json +0 -0
  232. /package/framework/{v0.6.22 → v0.6.23}/core/template/error/server/json/503.json +0 -0
  233. /package/framework/{v0.6.22 → v0.6.23}/core/template/extensions/logger/config.json +0 -0
  234. /package/framework/{v0.6.22 → v0.6.23}/helpers/console.js +0 -0
  235. /package/framework/{v0.6.22 → v0.6.23}/helpers/context.js +0 -0
  236. /package/framework/{v0.6.22 → v0.6.23}/helpers/data/LICENSE +0 -0
  237. /package/framework/{v0.6.22 → v0.6.23}/helpers/data/README.md +0 -0
  238. /package/framework/{v0.6.22 → v0.6.23}/helpers/data/package.json +0 -0
  239. /package/framework/{v0.6.22 → v0.6.23}/helpers/data/src/main.js +0 -0
  240. /package/framework/{v0.6.22 → v0.6.23}/helpers/dateFormat.js +0 -0
  241. /package/framework/{v0.6.22 → v0.6.23}/helpers/index.js +0 -0
  242. /package/framework/{v0.6.22 → v0.6.23}/helpers/json/LICENSE +0 -0
  243. /package/framework/{v0.6.22 → v0.6.23}/helpers/json/README.md +0 -0
  244. /package/framework/{v0.6.22 → v0.6.23}/helpers/json/package.json +0 -0
  245. /package/framework/{v0.6.22 → v0.6.23}/helpers/json/src/main.js +0 -0
  246. /package/framework/{v0.6.22 → v0.6.23}/helpers/path.js +0 -0
  247. /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/README.md +0 -0
  248. /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/package.json +0 -0
  249. /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/src/api-error.js +0 -0
  250. /package/framework/{v0.6.22 → v0.6.23}/helpers/plugins/src/main.js +0 -0
  251. /package/framework/{v0.6.22 → v0.6.23}/helpers/prototypes.js +0 -0
  252. /package/framework/{v0.6.22 → v0.6.23}/helpers/task.js +0 -0
  253. /package/framework/{v0.6.22 → v0.6.23}/helpers/text.js +0 -0
  254. /package/framework/{v0.6.22 → v0.6.23}/lib/admin/package.json +0 -0
  255. /package/framework/{v0.6.22 → v0.6.23}/lib/admin/src/main.js +0 -0
  256. /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/README.md +0 -0
  257. /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/build.json +0 -0
  258. /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/package.json +0 -0
  259. /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/src/dep/jszip.min.js +0 -0
  260. /package/framework/{v0.6.22 → v0.6.23}/lib/archiver/src/main.js +0 -0
  261. /package/framework/{v0.6.22 → v0.6.23}/lib/async/package.json +0 -0
  262. /package/framework/{v0.6.22 → v0.6.23}/lib/async/src/main.js +0 -0
  263. /package/framework/{v0.6.22 → v0.6.23}/lib/audit/package.json +0 -0
  264. /package/framework/{v0.6.22 → v0.6.23}/lib/audit/src/main.js +0 -0
  265. /package/framework/{v0.6.22 → v0.6.23}/lib/audit-store.js +0 -0
  266. /package/framework/{v0.6.22 → v0.6.23}/lib/authn/package.json +0 -0
  267. /package/framework/{v0.6.22 → v0.6.23}/lib/authn/src/lockout.js +0 -0
  268. /package/framework/{v0.6.22 → v0.6.23}/lib/authn/src/main.js +0 -0
  269. /package/framework/{v0.6.22 → v0.6.23}/lib/authn/src/totp.js +0 -0
  270. /package/framework/{v0.6.22 → v0.6.23}/lib/authz-gate/package.json +0 -0
  271. /package/framework/{v0.6.22 → v0.6.23}/lib/authz-gate/src/main.js +0 -0
  272. /package/framework/{v0.6.22 → v0.6.23}/lib/cache/README.md +0 -0
  273. /package/framework/{v0.6.22 → v0.6.23}/lib/cache/build.json +0 -0
  274. /package/framework/{v0.6.22 → v0.6.23}/lib/cache/package.json +0 -0
  275. /package/framework/{v0.6.22 → v0.6.23}/lib/cache/src/main.js +0 -0
  276. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/aliases.json +0 -0
  277. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/audit/arguments.json +0 -0
  278. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/audit/help.txt +0 -0
  279. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/audit/verify.js +0 -0
  280. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/add.js +0 -0
  281. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/arguments.json +0 -0
  282. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/build.js +0 -0
  283. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/copy.js +0 -0
  284. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/cp.js +0 -0
  285. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/help.js +0 -0
  286. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/help.txt +0 -0
  287. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  288. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/list.js +0 -0
  289. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/man.js +0 -0
  290. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/mcp-start.js +0 -0
  291. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/mcp.js +0 -0
  292. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/oas.js +0 -0
  293. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/openapi.js +0 -0
  294. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/remove.js +0 -0
  295. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/rename.js +0 -0
  296. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/restart.js +0 -0
  297. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/rm.js +0 -0
  298. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/start.js +0 -0
  299. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/status.js +0 -0
  300. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/stop.js +0 -0
  301. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/bundle/types.js +0 -0
  302. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/arguments.json +0 -0
  303. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/clear.js +0 -0
  304. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/help.txt +0 -0
  305. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/cache/stats.js +0 -0
  306. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/add.js +0 -0
  307. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/arguments.json +0 -0
  308. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/help.js +0 -0
  309. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/help.txt +0 -0
  310. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/infer.js +0 -0
  311. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/list.js +0 -0
  312. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/migrate.js +0 -0
  313. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/models.js +0 -0
  314. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/remove.js +0 -0
  315. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/rm.js +0 -0
  316. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/connector/test.js +0 -0
  317. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/arguments.json +0 -0
  318. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/help.js +0 -0
  319. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/help.txt +0 -0
  320. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/man.js +0 -0
  321. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/ps.js +0 -0
  322. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/container/stop.js +0 -0
  323. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/add.js +0 -0
  324. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/arguments.json +0 -0
  325. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/help.txt +0 -0
  326. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/args.js +0 -0
  327. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/namespace.js +0 -0
  328. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  329. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/reference-scan.js +0 -0
  330. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/inc/scaffold.js +0 -0
  331. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/remove.js +0 -0
  332. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/rename.js +0 -0
  333. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/controller/rm.js +0 -0
  334. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/add.js +0 -0
  335. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/get.js +0 -0
  336. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/help.js +0 -0
  337. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/help.txt +0 -0
  338. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/link-dev.js +0 -0
  339. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/list.js +0 -0
  340. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/remove.js +0 -0
  341. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/rm.js +0 -0
  342. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/set.js +0 -0
  343. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/unset.js +0 -0
  344. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/env/use.js +0 -0
  345. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/add.js +0 -0
  346. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/arguments.json +0 -0
  347. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/build.js +0 -0
  348. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/dot.js +0 -0
  349. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/get.js +0 -0
  350. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/help.js +0 -0
  351. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/help.txt +0 -0
  352. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/init.js +0 -0
  353. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/link-node-modules.js +0 -0
  354. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/link.js +0 -0
  355. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/list.js +0 -0
  356. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/man.js +0 -0
  357. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/msg.json +0 -0
  358. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/open.js +0 -0
  359. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/remove.js +0 -0
  360. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/reset.js +0 -0
  361. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/restart.js +0 -0
  362. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/set.js +0 -0
  363. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/start.js +0 -0
  364. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/status.js +0 -0
  365. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/stop.js +0 -0
  366. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/tail.js +0 -0
  367. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/update.js +0 -0
  368. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/framework/version.js +0 -0
  369. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/gina-dev.1.md +0 -0
  370. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/gina-framework.1.md +0 -0
  371. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/gina.1.md +0 -0
  372. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/helper.js +0 -0
  373. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/add.js +0 -0
  374. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/arguments.json +0 -0
  375. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/export.js +0 -0
  376. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/help.js +0 -0
  377. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/help.txt +0 -0
  378. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/import.js +0 -0
  379. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/i18n/scan.js +0 -0
  380. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/_host.js +0 -0
  381. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/arguments.json +0 -0
  382. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/build.js +0 -0
  383. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/help.js +0 -0
  384. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/help.txt +0 -0
  385. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/list.js +0 -0
  386. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/man.js +0 -0
  387. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/rm.js +0 -0
  388. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/image/run.js +0 -0
  389. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/index.js +0 -0
  390. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/inspector/help.js +0 -0
  391. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/inspector/help.txt +0 -0
  392. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/inspector/open.js +0 -0
  393. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/man-render.js +0 -0
  394. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/arguments.json +0 -0
  395. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/help.js +0 -0
  396. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/help.txt +0 -0
  397. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/kill.js +0 -0
  398. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/minion/list.js +0 -0
  399. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/msg.json +0 -0
  400. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/help.js +0 -0
  401. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/help.txt +0 -0
  402. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/inc/scan.js +0 -0
  403. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/list.js +0 -0
  404. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/reset.js +0 -0
  405. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/port/set.js +0 -0
  406. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/add.js +0 -0
  407. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/arguments.json +0 -0
  408. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/backup.js +0 -0
  409. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/build.js +0 -0
  410. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/help.js +0 -0
  411. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/help.txt +0 -0
  412. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/import.js +0 -0
  413. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/list.js +0 -0
  414. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/man.js +0 -0
  415. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/move.js +0 -0
  416. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/remove.js +0 -0
  417. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/rename.js +0 -0
  418. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/restart.js +0 -0
  419. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/restore.js +0 -0
  420. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/rm.js +0 -0
  421. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/start.js +0 -0
  422. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/status.js +0 -0
  423. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/project/stop.js +0 -0
  424. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/arguments.json +0 -0
  425. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/help.js +0 -0
  426. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/help.txt +0 -0
  427. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/list.js +0 -0
  428. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/remove.js +0 -0
  429. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/protocol/set.js +0 -0
  430. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/add.js +0 -0
  431. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/help.js +0 -0
  432. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/help.txt +0 -0
  433. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/link-local.js +0 -0
  434. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/link-production.js +0 -0
  435. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/list.js +0 -0
  436. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/remove.js +0 -0
  437. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/rm.js +0 -0
  438. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/scope/use.js +0 -0
  439. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/arguments.json +0 -0
  440. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/check.js +0 -0
  441. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/help.js +0 -0
  442. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/help.txt +0 -0
  443. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/secrets/scan.js +0 -0
  444. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/help.js +0 -0
  445. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/help.txt +0 -0
  446. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/list.js +0 -0
  447. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/man.js +0 -0
  448. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/service/start.js +0 -0
  449. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/arguments.json +0 -0
  450. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/gc.js +0 -0
  451. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/help.txt +0 -0
  452. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/stats.js +0 -0
  453. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/storage/verify.js +0 -0
  454. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd/view/add.js +0 -0
  455. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd-status-format/package.json +0 -0
  456. /package/framework/{v0.6.22 → v0.6.23}/lib/cmd-status-format/src/main.js +0 -0
  457. /package/framework/{v0.6.22 → v0.6.23}/lib/collection/README.md +0 -0
  458. /package/framework/{v0.6.22 → v0.6.23}/lib/collection/build.json +0 -0
  459. /package/framework/{v0.6.22 → v0.6.23}/lib/collection/package.json +0 -0
  460. /package/framework/{v0.6.22 → v0.6.23}/lib/collection/src/main.js +0 -0
  461. /package/framework/{v0.6.22 → v0.6.23}/lib/config.js +0 -0
  462. /package/framework/{v0.6.22 → v0.6.23}/lib/connector-config/package.json +0 -0
  463. /package/framework/{v0.6.22 → v0.6.23}/lib/connector-config/src/main.js +0 -0
  464. /package/framework/{v0.6.22 → v0.6.23}/lib/connector-error/package.json +0 -0
  465. /package/framework/{v0.6.22 → v0.6.23}/lib/connector-error/src/main.js +0 -0
  466. /package/framework/{v0.6.22 → v0.6.23}/lib/connector-registry/package.json +0 -0
  467. /package/framework/{v0.6.22 → v0.6.23}/lib/connector-registry/src/main.js +0 -0
  468. /package/framework/{v0.6.22 → v0.6.23}/lib/cron/README.md +0 -0
  469. /package/framework/{v0.6.22 → v0.6.23}/lib/cron/package.json +0 -0
  470. /package/framework/{v0.6.22 → v0.6.23}/lib/cron/src/main.js +0 -0
  471. /package/framework/{v0.6.22 → v0.6.23}/lib/domain/LICENSE +0 -0
  472. /package/framework/{v0.6.22 → v0.6.23}/lib/domain/README.md +0 -0
  473. /package/framework/{v0.6.22 → v0.6.23}/lib/domain/package.json +0 -0
  474. /package/framework/{v0.6.22 → v0.6.23}/lib/domain/src/main.js +0 -0
  475. /package/framework/{v0.6.22 → v0.6.23}/lib/dto/package.json +0 -0
  476. /package/framework/{v0.6.22 → v0.6.23}/lib/dto/src/main.js +0 -0
  477. /package/framework/{v0.6.22 → v0.6.23}/lib/dto-pipe/package.json +0 -0
  478. /package/framework/{v0.6.22 → v0.6.23}/lib/dto-pipe/src/main.js +0 -0
  479. /package/framework/{v0.6.22 → v0.6.23}/lib/dto-types/package.json +0 -0
  480. /package/framework/{v0.6.22 → v0.6.23}/lib/dto-types/src/main.js +0 -0
  481. /package/framework/{v0.6.22 → v0.6.23}/lib/generator/index.js +0 -0
  482. /package/framework/{v0.6.22 → v0.6.23}/lib/i18n/package.json +0 -0
  483. /package/framework/{v0.6.22 → v0.6.23}/lib/i18n/src/main.js +0 -0
  484. /package/framework/{v0.6.22 → v0.6.23}/lib/image-build/package.json +0 -0
  485. /package/framework/{v0.6.22 → v0.6.23}/lib/image-build/src/main.js +0 -0
  486. /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/LICENSE +0 -0
  487. /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/README.md +0 -0
  488. /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/package.json +0 -0
  489. /package/framework/{v0.6.22 → v0.6.23}/lib/inherits/src/main.js +0 -0
  490. /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-events/package.json +0 -0
  491. /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-events/src/main.js +0 -0
  492. /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-redact/package.json +0 -0
  493. /package/framework/{v0.6.22 → v0.6.23}/lib/inspector-redact/src/main.js +0 -0
  494. /package/framework/{v0.6.22 → v0.6.23}/lib/instrument/package.json +0 -0
  495. /package/framework/{v0.6.22 → v0.6.23}/lib/instrument/src/main.js +0 -0
  496. /package/framework/{v0.6.22 → v0.6.23}/lib/job/package.json +0 -0
  497. /package/framework/{v0.6.22 → v0.6.23}/lib/job/src/main.js +0 -0
  498. /package/framework/{v0.6.22 → v0.6.23}/lib/job-store.js +0 -0
  499. /package/framework/{v0.6.22 → v0.6.23}/lib/json-config-header/package.json +0 -0
  500. /package/framework/{v0.6.22 → v0.6.23}/lib/json-config-header/src/main.js +0 -0
  501. /package/framework/{v0.6.22 → v0.6.23}/lib/kv/package.json +0 -0
  502. /package/framework/{v0.6.22 → v0.6.23}/lib/kv/src/main.js +0 -0
  503. /package/framework/{v0.6.22 → v0.6.23}/lib/kv-store.js +0 -0
  504. /package/framework/{v0.6.22 → v0.6.23}/lib/loading-state/package.json +0 -0
  505. /package/framework/{v0.6.22 → v0.6.23}/lib/loading-state/src/main.js +0 -0
  506. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/README.md +0 -0
  507. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/package.json +0 -0
  508. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/default/index.js +0 -0
  509. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/file/index.js +0 -0
  510. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  511. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  512. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/mq/index.js +0 -0
  513. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/mq/listener.js +0 -0
  514. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/containers/mq/speaker.js +0 -0
  515. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/helper.js +0 -0
  516. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/main.js +0 -0
  517. /package/framework/{v0.6.22 → v0.6.23}/lib/logger/src/redact.js +0 -0
  518. /package/framework/{v0.6.22 → v0.6.23}/lib/maintenance/package.json +0 -0
  519. /package/framework/{v0.6.22 → v0.6.23}/lib/maintenance/src/main.js +0 -0
  520. /package/framework/{v0.6.22 → v0.6.23}/lib/math/index.js +0 -0
  521. /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-dispatch/package.json +0 -0
  522. /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-dispatch/src/main.js +0 -0
  523. /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-http/package.json +0 -0
  524. /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-http/src/main.js +0 -0
  525. /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-server/package.json +0 -0
  526. /package/framework/{v0.6.22 → v0.6.23}/lib/mcp-server/src/main.js +0 -0
  527. /package/framework/{v0.6.22 → v0.6.23}/lib/merge/README.md +0 -0
  528. /package/framework/{v0.6.22 → v0.6.23}/lib/merge/package.json +0 -0
  529. /package/framework/{v0.6.22 → v0.6.23}/lib/metrics/package.json +0 -0
  530. /package/framework/{v0.6.22 → v0.6.23}/lib/metrics/src/main.js +0 -0
  531. /package/framework/{v0.6.22 → v0.6.23}/lib/model.js +0 -0
  532. /package/framework/{v0.6.22 → v0.6.23}/lib/net-locality/package.json +0 -0
  533. /package/framework/{v0.6.22 → v0.6.23}/lib/net-locality/src/main.js +0 -0
  534. /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-filters/README.md +0 -0
  535. /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-filters/package.json +0 -0
  536. /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-filters/src/main.js +0 -0
  537. /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-resolver/package.json +0 -0
  538. /package/framework/{v0.6.22 → v0.6.23}/lib/nunjucks-resolver/src/main.js +0 -0
  539. /package/framework/{v0.6.22 → v0.6.23}/lib/proc.js +0 -0
  540. /package/framework/{v0.6.22 → v0.6.23}/lib/push/package.json +0 -0
  541. /package/framework/{v0.6.22 → v0.6.23}/lib/push/src/main.js +0 -0
  542. /package/framework/{v0.6.22 → v0.6.23}/lib/rate-limit/package.json +0 -0
  543. /package/framework/{v0.6.22 → v0.6.23}/lib/rate-limit/src/main.js +0 -0
  544. /package/framework/{v0.6.22 → v0.6.23}/lib/release-watch/package.json +0 -0
  545. /package/framework/{v0.6.22 → v0.6.23}/lib/release-watch/src/main.js +0 -0
  546. /package/framework/{v0.6.22 → v0.6.23}/lib/render-cache/package.json +0 -0
  547. /package/framework/{v0.6.22 → v0.6.23}/lib/render-cache/src/main.js +0 -0
  548. /package/framework/{v0.6.22 → v0.6.23}/lib/render-cache-store.js +0 -0
  549. /package/framework/{v0.6.22 → v0.6.23}/lib/routing/README.md +0 -0
  550. /package/framework/{v0.6.22 → v0.6.23}/lib/routing/build.json +0 -0
  551. /package/framework/{v0.6.22 → v0.6.23}/lib/routing/package.json +0 -0
  552. /package/framework/{v0.6.22 → v0.6.23}/lib/routing/src/main.js +0 -0
  553. /package/framework/{v0.6.22 → v0.6.23}/lib/routing/src/radix.js +0 -0
  554. /package/framework/{v0.6.22 → v0.6.23}/lib/routing-introspect/package.json +0 -0
  555. /package/framework/{v0.6.22 → v0.6.23}/lib/routing-introspect/src/main.js +0 -0
  556. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/package.json +0 -0
  557. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/backends/env.js +0 -0
  558. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/backends/exec.js +0 -0
  559. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/backends/file.js +0 -0
  560. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/declaration.js +0 -0
  561. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/env-file.js +0 -0
  562. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/main.js +0 -0
  563. /package/framework/{v0.6.22 → v0.6.23}/lib/secrets/src/sources.js +0 -0
  564. /package/framework/{v0.6.22 → v0.6.23}/lib/session-store.js +0 -0
  565. /package/framework/{v0.6.22 → v0.6.23}/lib/shell.js +0 -0
  566. /package/framework/{v0.6.22 → v0.6.23}/lib/sqlite-driver.js +0 -0
  567. /package/framework/{v0.6.22 → v0.6.23}/lib/state.js +0 -0
  568. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/package.json +0 -0
  569. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/local-cas.js +0 -0
  570. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/local-stream.js +0 -0
  571. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/local.js +0 -0
  572. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/main.js +0 -0
  573. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/meta-store.js +0 -0
  574. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/s3.js +0 -0
  575. /package/framework/{v0.6.22 → v0.6.23}/lib/storage/src/util.js +0 -0
  576. /package/framework/{v0.6.22 → v0.6.23}/lib/storage-store.js +0 -0
  577. /package/framework/{v0.6.22 → v0.6.23}/lib/swig-filters/README.md +0 -0
  578. /package/framework/{v0.6.22 → v0.6.23}/lib/swig-filters/package.json +0 -0
  579. /package/framework/{v0.6.22 → v0.6.23}/lib/swig-filters/src/main.js +0 -0
  580. /package/framework/{v0.6.22 → v0.6.23}/lib/swig-resolver/package.json +0 -0
  581. /package/framework/{v0.6.22 → v0.6.23}/lib/swig-resolver/src/main.js +0 -0
  582. /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/package.json +0 -0
  583. /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/src/loaders/http.js +0 -0
  584. /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/src/loaders/memory.js +0 -0
  585. /package/framework/{v0.6.22 → v0.6.23}/lib/template-loaders/src/main.js +0 -0
  586. /package/framework/{v0.6.22 → v0.6.23}/lib/url/README.md +0 -0
  587. /package/framework/{v0.6.22 → v0.6.23}/lib/url/index.js +0 -0
  588. /package/framework/{v0.6.22 → v0.6.23}/lib/url/routing.json +0 -0
  589. /package/framework/{v0.6.22 → v0.6.23}/lib/uuid/package.json +0 -0
  590. /package/framework/{v0.6.22 → v0.6.23}/lib/uuid/src/main.js +0 -0
  591. /package/framework/{v0.6.22 → v0.6.23}/lib/validator.js +0 -0
  592. /package/framework/{v0.6.22 → v0.6.23}/lib/watcher/package.json +0 -0
  593. /package/framework/{v0.6.22 → v0.6.23}/lib/watcher/src/main.js +0 -0
  594. /package/framework/{v0.6.22 → v0.6.23}/lib/ws-framing/package.json +0 -0
  595. /package/framework/{v0.6.22 → v0.6.23}/lib/ws-framing/src/main.js +0 -0
  596. /package/framework/{v0.6.22 → v0.6.23}/lib/ws-query/package.json +0 -0
  597. /package/framework/{v0.6.22 → v0.6.23}/lib/ws-query/src/main.js +0 -0
  598. /package/framework/{v0.6.22 → v0.6.23}/lib/ws-session/package.json +0 -0
  599. /package/framework/{v0.6.22 → v0.6.23}/lib/ws-session/src/main.js +0 -0
@@ -41,9 +41,12 @@ function Merge() {
41
41
  *
42
42
  * Key rejection is the WHOLE guard, deliberately. The first cut of #B446 also
43
43
  * skipped inherited enumerable source properties, which broke every entity in
44
- * the model registry: lib/model.js setModel round-trips entity instances
45
- * through merge, and all six SQL connectors attach their .sql-derived query
46
- * methods to the PROTOTYPE, so an own-only copy silently dropped them
44
+ * the model registry: the model layer round-trips entity instances through
45
+ * merge — the in-tree path is the relations assembly (core/model/entity.js),
46
+ * and the registry's setModel (lib/model.js), while it has no in-tree caller,
47
+ * is published through the modelUtil context and stays consumer-reachable —
48
+ * and all six SQL connectors attach their .sql-derived query methods to the
49
+ * PROTOTYPE, so an own-only copy silently dropped them
47
50
  * (`db.xEntity.getOneById is not a function`). merge therefore copies the
48
51
  * chain, as it always has; only these three key names are refused.
49
52
  *
@@ -684,8 +687,22 @@ function Merge() {
684
687
 
685
688
  var hasOwn = {}.hasOwnProperty;
686
689
  var hasOwnConstructor = hasOwn.call(obj, 'constructor');
687
- // added test for node > v6
688
- var hasMethodPrototyped = ( typeof(obj.constructor) != 'undefined' ) ? hasOwn.call(obj.constructor.prototype, 'isPrototypeOf') : false;
690
+ // #B450 — compute lazily, restoring the original short-circuit. An OWN
691
+ // `constructor` key (the shape JSON.parse yields for
692
+ // `{"constructor": <primitive|null|{}|[]>}`) shadows
693
+ // Object.prototype.constructor, so the eager read
694
+ // `obj.constructor.prototype` was undefined (or threw outright for null)
695
+ // and `hasOwn.call(undefined, ...)` crashed the whole merge —
696
+ // request-reachable, since PUT bodies reach merge as the source. When the
697
+ // object HAS an own constructor the rejection branch below cannot fire,
698
+ // so the value is never needed; when it lacks one, guard the `.prototype`
699
+ // read. A 24-shape differential sweep pins identical answers on every
700
+ // input the old form did not crash on (test/lib/merge-b450.test.js).
701
+ // was: var hasMethodPrototyped = ( typeof(obj.constructor) != 'undefined' ) ? hasOwn.call(obj.constructor.prototype, 'isPrototypeOf') : false;
702
+ var hasMethodPrototyped = false;
703
+ if ( !hasOwnConstructor && typeof(obj.constructor) != 'undefined' ) {
704
+ hasMethodPrototyped = ( obj.constructor.prototype ) ? hasOwn.call(obj.constructor.prototype, 'isPrototypeOf') : false;
705
+ }
689
706
 
690
707
 
691
708
  if (
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "gina-lib-security-headers-emitter",
3
+ "version": "1.0.0",
4
+ "description": "Engine-agnostic security-header emission (#OW1)",
5
+ "authors": [
6
+ {
7
+ "name": "Martin Luther ETOUMAN NDAMBWE",
8
+ "email": "contact@gina.io"
9
+ }
10
+ ],
11
+ "copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
12
+ "engines": {
13
+ "node": ">=0.10.22"
14
+ },
15
+ "main": "src/main",
16
+ "license": "MIT",
17
+ "readmeFilename": "README.md"
18
+ }
@@ -0,0 +1,225 @@
1
+ 'use strict';
2
+ /**
3
+ * @module lib/security-headers-emitter
4
+ * @description #OW1 — engine-agnostic security-header emission (OWASP A02).
5
+ *
6
+ * WHY THIS EXISTS AT THE FRAMEWORK LAYER, not as a mounted middleware.
7
+ * The `#HDR1-14` plugins are express middleware, and gina's DEFAULT engine is
8
+ * `isaac`, which never runs the express middleware chain for HTTP responses:
9
+ * `server.use()` stores functions in `server._expressMiddlewares`, and the ONLY
10
+ * consumer is the WebSocket session binder, which name-filters the chain down to
11
+ * `session` / `ginaSessionAbsoluteTimeout` and runs it against an inert response
12
+ * whose header methods are all no-ops (measured 2026-09-02). So scaffolding
13
+ * `app.use(gina.plugins.SecurityHeaders())` would emit ZERO headers on the
14
+ * default engine — security theatre. This module is the same shape as the
15
+ * `#HDR8` hidePoweredBy gate, which was built framework-side for exactly this
16
+ * reason and is the established precedent.
17
+ *
18
+ * THE DEFAULT SET IS NARROWER THAN THE ORCHESTRATOR'S "SAFE SET", DELIBERATELY.
19
+ * The orchestrator's 12-plugin safe set is safe to MOUNT deliberately; it is not
20
+ * all safe to DEFAULT ON for every existing bundle. Four are opt-in here, each
21
+ * with a named breakage rather than a guess:
22
+ * - `corp` — MEASURED conflict: gina's own `/_gina/*` endpoints emit
23
+ * `access-control-allow-origin: *` (metrics, health, SSE; the
24
+ * Inspector's cross-origin GET/SSE channels are a documented
25
+ * design), and CORP blocks cross-origin LOADING regardless of
26
+ * CORS. See the `/_gina/*` exemption below.
27
+ * - `hsts` — emits regardless of transport (documented spec deviation), so
28
+ * enabling it commits every https consumer's browsers to 180 days
29
+ * without them asking.
30
+ * - `coop` — severs `window.opener`; breaks OAuth/payment popup flows.
31
+ * - `xFrameOptions` — breaks a consumer who deliberately embeds their app
32
+ * cross-origin. (gina itself uses no iframes — measured — so the
33
+ * risk is consumer-facing only; this is the weakest of the four
34
+ * and the cheapest to enable.)
35
+ *
36
+ * PRECEDENCE: first-writer-wins. Any header already present on the response is
37
+ * left alone, so an explicitly mounted plugin, an `env.json`
38
+ * `server.response.header` entry, or an upstream proxy always beats the
39
+ * framework default. This mirrors the plugins' own idempotent contract.
40
+ *
41
+ * @example
42
+ * // core/server.js (engine-agnostic, setHeader-based)
43
+ * var secHeaders = require('lib/security-headers-emitter');
44
+ * secHeaders.applyToResponse(conf.server.securityHeaders, request, response);
45
+ *
46
+ * // core/server.isaac.js (writeHead-based, header OBJECT)
47
+ * headers = secHeaders.applyToHeaders(options.securityHeaders, request, headers);
48
+ */
49
+
50
+ /**
51
+ * The framework-emittable header set, with the values read from each `#HDR`
52
+ * plugin's own `HEADER_VALUE` / `DEFAULT_VALUE` (measured, never invented) so
53
+ * the framework default and the mounted plugin agree byte-for-byte.
54
+ *
55
+ * `onByDefault: false` entries are Tier B — available, opt-in per the rationale
56
+ * in the module docblock.
57
+ *
58
+ * @constant
59
+ * @type {Array<{key: string, header: string, value: string, onByDefault: boolean, ginaExempt: boolean}>}
60
+ * @private
61
+ */
62
+ var HEADERS = [
63
+ // ── Tier A — on by default: cannot break a working application ──────────
64
+ { key: 'xContentTypeOptions', header: 'x-content-type-options', value: 'nosniff', onByDefault: true, ginaExempt: false },
65
+ { key: 'xDownloadOptions', header: 'x-download-options', value: 'noopen', onByDefault: true, ginaExempt: false },
66
+ { key: 'xPermittedCrossDomainPolicies',header: 'x-permitted-cross-domain-policies', value: 'none', onByDefault: true, ginaExempt: false },
67
+ { key: 'xXssProtection', header: 'x-xss-protection', value: '0', onByDefault: true, ginaExempt: false },
68
+ { key: 'referrerPolicy', header: 'referrer-policy', value: 'strict-origin-when-cross-origin', onByDefault: true, ginaExempt: false },
69
+ { key: 'xDnsPrefetchControl', header: 'x-dns-prefetch-control', value: 'off', onByDefault: true, ginaExempt: false },
70
+ { key: 'originAgentCluster', header: 'origin-agent-cluster', value: '?1', onByDefault: true, ginaExempt: false },
71
+
72
+ // ── Tier B — opt-in: each can break a legitimate deployment ─────────────
73
+ { key: 'xFrameOptions', header: 'x-frame-options', value: 'SAMEORIGIN', onByDefault: false, ginaExempt: false },
74
+ // hsts value = the Hsts plugin's own default composition (max-age only —
75
+ // DEFAULT_MAX_AGE, no includeSubDomains/preload, which stay plugin/proxy
76
+ // territory; first-writer-wins defers to either). Parity is asserted in
77
+ // the tests against the plugin's exported builder, never retyped.
78
+ { key: 'hsts', header: 'strict-transport-security', value: 'max-age=15552000', onByDefault: false, ginaExempt: false },
79
+ { key: 'coop', header: 'cross-origin-opener-policy', value: 'same-origin', onByDefault: false, ginaExempt: true },
80
+ // ginaExempt — see applyTo*: never applied to /_gina/*, which is
81
+ // deliberately cross-origin.
82
+ { key: 'corp', header: 'cross-origin-resource-policy', value: 'same-origin', onByDefault: false, ginaExempt: true }
83
+ ];
84
+
85
+ /**
86
+ * `/_gina/*` is the framework's own control/observability surface and is
87
+ * DELIBERATELY cross-origin (`access-control-allow-origin: *` at the metrics,
88
+ * health and SSE endpoints; the Inspector's cross-origin GET/SSE channels are a
89
+ * documented design). A cross-origin-isolating header applied there would break
90
+ * gina's own endpoints even for a consumer who opted in knowingly — so the
91
+ * `ginaExempt` entries are skipped on that prefix regardless of configuration.
92
+ *
93
+ * @constant
94
+ * @type {RegExp}
95
+ * @private
96
+ */
97
+ var GINA_PREFIX = /^\/_gina\//;
98
+
99
+ /**
100
+ * Decide whether a given entry should be emitted for this request.
101
+ *
102
+ * @param {object} entry - a HEADERS row
103
+ * @param {object} cfg - the resolved `server.securityHeaders` config
104
+ * @param {string} url - `request.url` (may be undefined)
105
+ * @returns {boolean} true when the header should be written
106
+ * @private
107
+ */
108
+ var shouldEmit = function(entry, cfg, url) {
109
+ var setting = cfg[entry.key];
110
+ var on = ( typeof(setting) == 'undefined' ) ? entry.onByDefault : (setting === true);
111
+ if ( !on ) { return false }
112
+ if ( entry.ginaExempt && typeof(url) == 'string' && GINA_PREFIX.test(url) ) { return false }
113
+ return true
114
+ };
115
+
116
+ /**
117
+ * Normalise the config block. Absent / non-object ⇒ defaults; `enabled: false`
118
+ * ⇒ the whole emitter is off (one key to restore pre-0.6.23 behaviour).
119
+ *
120
+ * @param {object|undefined} raw - `settings.json > server.securityHeaders`
121
+ * @returns {object|null} the config, or null when disabled entirely
122
+ * @private
123
+ */
124
+ var resolveConfig = function(raw) {
125
+ var cfg = ( raw && typeof(raw) == 'object' ) ? raw : {};
126
+ if ( cfg.enabled === false ) { return null }
127
+ return cfg
128
+ };
129
+
130
+ /**
131
+ * Apply to a `setHeader`-based response (the engine-agnostic `core/server.js`
132
+ * path — routed responses, static serves, framework error pages, both engines).
133
+ *
134
+ * First-writer-wins: an already-present header is never overwritten.
135
+ *
136
+ * @param {object|undefined} raw - `server.securityHeaders` config
137
+ * @param {object} request - the incoming request (read for `.url`)
138
+ * @param {object} response - the outgoing response
139
+ * @returns {void}
140
+ * @example
141
+ * applyToResponse(conf.server.securityHeaders, request, response);
142
+ */
143
+ var applyToResponse = function(raw, request, response) {
144
+ var cfg = resolveConfig(raw);
145
+ if ( !cfg || !response || typeof(response.setHeader) != 'function' ) { return }
146
+ if ( response.headersSent ) { return }
147
+
148
+ var url = ( request && typeof(request.url) == 'string' ) ? request.url : undefined;
149
+
150
+ for (var i = 0, len = HEADERS.length; i < len; ++i) {
151
+ var entry = HEADERS[i];
152
+ if ( !shouldEmit(entry, cfg, url) ) { continue }
153
+ // first-writer-wins — a mounted plugin, an env.json
154
+ // `server.response.header` entry or an upstream proxy always wins.
155
+ if ( typeof(response.getHeader) == 'function' && response.getHeader(entry.header) ) { continue }
156
+ response.setHeader(entry.header, entry.value);
157
+ }
158
+ };
159
+
160
+ /**
161
+ * Apply to a plain header OBJECT (the isaac `writeHead` path — 31 emit sites
162
+ * funnel through `_setPoweredByHeader`, which `writeHead` commits directly,
163
+ * bypassing `setHeader` entirely).
164
+ *
165
+ * @param {object|undefined} raw - `server.securityHeaders` config
166
+ * @param {object} request - the incoming request (read for `.url`)
167
+ * @param {object} headers - the header map about to be written
168
+ * @returns {object} the same map, mutated and returned for chaining
169
+ * @example
170
+ * headers = applyToHeaders(options.securityHeaders, request, headers);
171
+ */
172
+ var applyToHeaders = function(raw, request, headers) {
173
+ var cfg = resolveConfig(raw);
174
+ if ( !cfg || !headers || typeof(headers) != 'object' ) { return headers }
175
+
176
+ var url = ( request && typeof(request.url) == 'string' ) ? request.url : undefined;
177
+
178
+ // Header maps here are written by hand at each writeHead site with mixed
179
+ // casing, so the present-check is case-insensitive — a same-header-different-
180
+ // case entry must still win, or the response carries it twice.
181
+ var present = {};
182
+ for (var k in headers) {
183
+ if ( Object.prototype.hasOwnProperty.call(headers, k) ) { present[String(k).toLowerCase()] = true }
184
+ }
185
+
186
+ for (var i = 0, len = HEADERS.length; i < len; ++i) {
187
+ var entry = HEADERS[i];
188
+ if ( !shouldEmit(entry, cfg, url) ) { continue }
189
+ if ( present[entry.header] ) { continue }
190
+ headers[entry.header] = entry.value;
191
+ }
192
+ return headers
193
+ };
194
+
195
+ /**
196
+ * Apply to a header OBJECT that is known to belong to a `/_gina/*` endpoint.
197
+ *
198
+ * Every one of isaac's `_setPoweredByHeader()` call sites is a `/_gina/*`
199
+ * endpoint (measured 29/29, 2026-09-02), and those are deliberately
200
+ * cross-origin: the metrics/health/SSE handlers emit
201
+ * `access-control-allow-origin: *`, and the Inspector's cross-origin GET/SSE
202
+ * channels are a documented design. So the cross-origin-isolating headers are
203
+ * exempted unconditionally here rather than threading `request` through 29
204
+ * writeHead sites — an explicit function beats a synthetic request object.
205
+ *
206
+ * @param {object|undefined} raw - `server.securityHeaders` config
207
+ * @param {object} headers - the header map about to be written
208
+ * @returns {object} the same map, mutated and returned for chaining
209
+ * @example
210
+ * headers = applyToGinaEndpointHeaders(options.securityHeaders, headers);
211
+ */
212
+ var applyToGinaEndpointHeaders = function(raw, headers) {
213
+ return applyToHeaders(raw, { url: '/_gina/' }, headers);
214
+ };
215
+
216
+ module.exports = {
217
+ applyToResponse : applyToResponse,
218
+ applyToHeaders : applyToHeaders,
219
+ applyToGinaEndpointHeaders : applyToGinaEndpointHeaders,
220
+ // Exposed for unit testing. Do not rely on these in application code.
221
+ _HEADERS : HEADERS,
222
+ _GINA_PREFIX : GINA_PREFIX,
223
+ _shouldEmit : shouldEmit,
224
+ _resolveConfig : resolveConfig
225
+ };
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "gina-lib-sri",
3
+ "version": "1.0.0",
4
+ "description": "Subresource Integrity attribute computation for emitted asset tags (#OW3)",
5
+ "authors": [
6
+ {
7
+ "name": "Martin Luther ETOUMAN NDAMBWE",
8
+ "email": "contact@gina.io"
9
+ }
10
+ ],
11
+ "copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
12
+ "engines": {
13
+ "node": ">=0.10.22"
14
+ },
15
+ "main": "src/main",
16
+ "license": "MIT",
17
+ "readmeFilename": "README.md"
18
+ }
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Gina — Subresource Integrity (SRI) attribute computation (#OW3, OWASP A08).
3
+ *
4
+ * Computes `integrity="sha384-<base64>" crossorigin="anonymous"` attribute
5
+ * strings for same-origin `<script>` and `<link rel="stylesheet">` tags whose
6
+ * files resolve on disk, so a tampered or truncated asset is refused by the
7
+ * browser instead of executed. Opt-in per bundle via `templates.json >
8
+ * "_common" > "sriEnabled": true` — the controller's resource builder calls
9
+ * this module for every declared asset when that flag is set.
10
+ *
11
+ * DESIGN INVARIANTS — each is deliberate, none is incidental:
12
+ *
13
+ * - FAIL-OPEN, always. Any condition that prevents an honest hash — external
14
+ * URL, unresolvable path, unreadable file, missing configuration — yields
15
+ * an EMPTY attribute string, never a guessed or partial hash. An asset
16
+ * without `integrity` loads exactly as before; an asset with a wrong
17
+ * `integrity` is hard-blocked by the browser. Emitting nothing is the safe
18
+ * degradation by construction.
19
+ * - STAT-VALIDATED CACHE. Hashes are cached per absolute file path, keyed by
20
+ * `mtimeMs` + `size`, and re-validated with one `fs.statSync` per lookup.
21
+ * A rebuilt or re-baked asset therefore gets a fresh hash on the next
22
+ * render with no process restart — the emission side can never serve a
23
+ * stale hash for the bytes on disk. (Pages already stored by the
24
+ * render/output cache keep the hash they were rendered with; flushing that
25
+ * cache after an asset rebuild remains the operator's step.)
26
+ * - sha384, HARDCODED. 48-byte digests base64-encode to exactly 64 characters
27
+ * with ZERO `=` padding — a measured safety property: the server-side asset
28
+ * catalog extracts URLs with an unanchored `(src|href|srcset)=` scan, and a
29
+ * padding-free alphabet makes a false `src="` match inside a hash value
30
+ * structurally impossible. A configurable algorithm (e.g. sha512, whose
31
+ * base64 IS padded) would reopen that hazard, so no knob ships.
32
+ *
33
+ * The cache is module-scope state and this module is registered with a PLAIN
34
+ * `require` in the lib registry — it must not be hot-swapped per request in
35
+ * dev mode (the securityHeadersEmitter / authn precedent for security-bearing
36
+ * leaves), and the cache is only ever a recomputation saver, so staleness
37
+ * across reload boundaries cannot occur by construction.
38
+ *
39
+ * @module sri
40
+ */
41
+ 'use strict';
42
+
43
+ var fs = require('fs');
44
+ var crypto = require('crypto');
45
+
46
+ /**
47
+ * Digest algorithm. Fixed on purpose — see the module header for the
48
+ * padding-free safety property that pins it to sha384.
49
+ *
50
+ * @constant
51
+ * @type {string}
52
+ * @private
53
+ */
54
+ var ALGORITHM = 'sha384';
55
+
56
+ /**
57
+ * Stat-validated integrity cache.
58
+ * Key: absolute file path. Value: `{ mtimeMs, size, integrity }`.
59
+ * Bounded in practice by the number of distinct assets declared across the
60
+ * bundle's `templates.json` collections (typically a few dozen), so no
61
+ * eviction is needed.
62
+ *
63
+ * @type {object}
64
+ * @private
65
+ */
66
+ var _cache = {};
67
+
68
+ /**
69
+ * @typedef {object} SriBundleConf
70
+ * @property {string} publicPath - Absolute path of the bundle's public dir;
71
+ * the fallback root for URL→disk resolution.
72
+ * @property {object} [content] - Bundle content configuration slice.
73
+ * @property {object} [content.statics] - Exact-match URL→absolute-path
74
+ * overrides (from `statics.json`);
75
+ * consulted before `publicPath`.
76
+ */
77
+
78
+ /**
79
+ * Computes the SRI integrity value for a file on disk.
80
+ *
81
+ * Reads the file synchronously and returns `sha384-<base64>` on success.
82
+ * Returns `null` — never throws — when the file cannot be read: the caller
83
+ * treats `null` as "emit no attribute" (fail-open).
84
+ *
85
+ * A stat-validated cache makes repeat calls cheap: one `fs.statSync` per
86
+ * call, and the file is only re-read when its `mtimeMs` or `size` moved.
87
+ *
88
+ * @function computeIntegrity
89
+ * @memberof module:sri
90
+ * @param {string} filePath - Absolute path of the asset file.
91
+ * @returns {string|null} `sha384-<base64>` (64 base64 chars, no padding), or
92
+ * `null` when the file is missing or unreadable.
93
+ *
94
+ * @example
95
+ * var sri = require('lib/sri');
96
+ * sri.computeIntegrity('/var/app/public/js/app.js');
97
+ * // => 'sha384-agv0K0aWLDzvDxoOWEsm2s7uAUYBgObriGygDyUIi7eQ/fZ00JWCG74nfkKG5qtv'
98
+ *
99
+ * @example
100
+ * // Missing file — fail-open, no throw
101
+ * sri.computeIntegrity('/var/app/public/js/deleted.js'); // => null
102
+ */
103
+ var computeIntegrity = function(filePath) {
104
+ var stats = null;
105
+ try {
106
+ stats = fs.statSync(filePath);
107
+ } catch (statErr) {
108
+ return null;
109
+ }
110
+ if ( !stats.isFile() ) {
111
+ return null;
112
+ }
113
+
114
+ var cached = _cache[filePath];
115
+ if (
116
+ cached
117
+ && cached.mtimeMs === stats.mtimeMs
118
+ && cached.size === stats.size
119
+ ) {
120
+ return cached.integrity;
121
+ }
122
+
123
+ var content = null;
124
+ try {
125
+ content = fs.readFileSync(filePath);
126
+ } catch (readErr) {
127
+ return null;
128
+ }
129
+
130
+ var integrity = ALGORITHM + '-' + crypto.createHash(ALGORITHM).update(content).digest('base64');
131
+ _cache[filePath] = {
132
+ mtimeMs : stats.mtimeMs,
133
+ size : stats.size,
134
+ integrity : integrity
135
+ };
136
+
137
+ return integrity;
138
+ };
139
+
140
+ /**
141
+ * Builds the attribute string to splice into an emitted asset tag.
142
+ *
143
+ * Returns ` integrity="sha384-..." crossorigin="anonymous"` — note the
144
+ * LEADING SPACE, so the caller concatenates it directly before the tag's
145
+ * closing bracket — or the EMPTY STRING whenever no honest hash can be
146
+ * produced (fail-open). Never throws.
147
+ *
148
+ * Skipped (empty string returned) for:
149
+ * - external URLs (`scheme://` or protocol-relative `//host/...`) — their
150
+ * bytes are not on this disk;
151
+ * - URLs that resolve to no readable file under the exact-match statics map
152
+ * or the bundle `publicPath` (directory-mapped statics resolve nowhere
153
+ * here and are deliberately left uncovered rather than guessed at);
154
+ * - missing or incomplete bundle configuration.
155
+ *
156
+ * URL handling before resolution: any `?query` / `#fragment` suffix is
157
+ * stripped, and when the emitted URL was prefixed with the bundle webroot
158
+ * (the resource builder mutates URLs that way when a webroot is configured),
159
+ * the prefix is stripped back off so resolution happens against the
160
+ * webroot-free public URL.
161
+ *
162
+ * @function getIntegrityAttributes
163
+ * @memberof module:sri
164
+ * @param {string} url - The asset URL exactly as it will be emitted in the
165
+ * tag (possibly webroot-prefixed).
166
+ * @param {SriBundleConf} conf - Bundle/env configuration slice (needs
167
+ * `publicPath`; `content.statics` optional).
168
+ * @param {string} [webroot='/'] - The bundle webroot; a value other than
169
+ * `'/'` is stripped off `url` when `url`
170
+ * starts with it.
171
+ * @returns {string} ` integrity="..." crossorigin="anonymous"`, or `''`.
172
+ *
173
+ * @example
174
+ * var sri = require('lib/sri');
175
+ * sri.getIntegrityAttributes('/js/vendor/gina/gina.min.js', conf, '/');
176
+ * // => ' integrity="sha384-..." crossorigin="anonymous"'
177
+ *
178
+ * @example
179
+ * // External URL — never hashed from disk
180
+ * sri.getIntegrityAttributes('https://cdn.example.com/lib.js', conf, '/');
181
+ * // => ''
182
+ *
183
+ * @example
184
+ * // Webroot-prefixed URL: '/myapp/js/app.js' resolves as '/js/app.js'
185
+ * sri.getIntegrityAttributes('/myapp/js/app.js', conf, '/myapp/');
186
+ */
187
+ var getIntegrityAttributes = function(url, conf, webroot) {
188
+ if ( typeof(url) != 'string' || !url ) {
189
+ return '';
190
+ }
191
+ // External assets: scheme-qualified or protocol-relative — not ours to hash.
192
+ if ( /:\/\//.test(url) || url.substring(0, 2) === '//' ) {
193
+ return '';
194
+ }
195
+ if ( !conf || typeof(conf.publicPath) != 'string' || !conf.publicPath ) {
196
+ return '';
197
+ }
198
+
199
+ // The on-disk identity ignores query/fragment suffixes.
200
+ var urlPath = url.split(/[?#]/)[0];
201
+
202
+ // Undo the resource builder's webroot prefixing so resolution happens
203
+ // against the webroot-free public URL.
204
+ if (
205
+ typeof(webroot) == 'string'
206
+ && webroot.length > 1
207
+ && webroot !== '/'
208
+ && urlPath.substring(0, webroot.length) === webroot
209
+ ) {
210
+ urlPath = '/' + urlPath.substring(webroot.length);
211
+ }
212
+
213
+ // Exact-match statics mapping wins over the publicPath fallback — same
214
+ // precedence as the server's static resolver.
215
+ var filePath = null;
216
+ if (
217
+ conf.content
218
+ && conf.content.statics
219
+ && typeof(conf.content.statics[urlPath]) == 'string'
220
+ ) {
221
+ filePath = conf.content.statics[urlPath];
222
+ } else {
223
+ filePath = conf.publicPath + urlPath;
224
+ }
225
+
226
+ var integrity = computeIntegrity(filePath);
227
+ if (!integrity) {
228
+ return '';
229
+ }
230
+
231
+ return ' integrity="'+ integrity +'" crossorigin="anonymous"';
232
+ };
233
+
234
+ module.exports = {
235
+ computeIntegrity : computeIntegrity,
236
+ getIntegrityAttributes : getIntegrityAttributes
237
+ };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina-framework",
3
- "version": "0.6.22",
3
+ "version": "0.6.23",
4
4
  "dependencies": {
5
5
  "@rhinostone/busboy": "^1.6.1",
6
6
  "@rhinostone/swig": "^2.7.2",
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.6.22/core/gna');
18
+ var _gna = require('./framework/v0.6.23/core/gna');
19
19
 
20
20
  // SuperController and EntitySuper — loaded from their source modules
21
- var SuperController = require('./framework/v0.6.22/core/controller');
22
- var EntitySuper = require('./framework/v0.6.22/core/model/entity');
21
+ var SuperController = require('./framework/v0.6.23/core/controller');
22
+ var EntitySuper = require('./framework/v0.6.23/core/model/entity');
23
23
 
24
24
  // uuid — from the lib registry
25
- var uuid = require('./framework/v0.6.22/lib/uuid');
25
+ var uuid = require('./framework/v0.6.23/lib/uuid');
26
26
 
27
27
  module.exports = {
28
28
 
package/llms.txt CHANGED
@@ -1039,4 +1039,5 @@ Dev-mode query instrumentation captures every database query tied to the current
1039
1039
  318. **Validator AJAX bodies are JSON — the Content-Type must say so, on every sender (#FORMCT; query path fixed in #B425).** The browser validator serializes its request bodies with `JSON.stringify`, but its shared `xhrOptions` defaults hardcode `Content-Type: application/x-www-form-urlencoded; charset=UTF-8` (that literal appears exactly once in the whole shipped bundle). When a JSON body goes out under that label the gina server correctly honours it and runs `body.replace(/\+/g, ' ')` plus `decodeURIComponent` BEFORE `JSON.parse` — so a value such as an email `+alias` arrives with the `+` turned into a space. **The failure is silent by construction:** the mangled body is still well-formed JSON, so it parses, no error is raised, and the endpoint answers `200` with a wrong answer. The server half is NOT the bug — for a genuine urlencoded body `+` really does mean space and `%2B` survives the decode — so every fix belongs on the client, at the labelling. **Rule for any new sender: if the body is JSON, resolve the Content-Type as `explicit author declaration, else application/json` — never let the urlencoded default ride a JSON body.** The senders and their state: the form-submit non-binary path and the file-removal POST resolve it correctly (they read an explicit form `enctype` first, else `application/json`); the multipart/binary path sets its own boundary header; a bodiless branch sets a header but sends nothing, so nothing can be corrupted; and the `query` (live-check) request in `core/plugins/lib/validator/src/form-validator.js` was the last one still inheriting the default — fixed by mirroring the same resolution. **Implementation gotcha specific to the query path:** the rule author can override the header per rule (`"headers": { "Content-Type": "application/json" }` inside a rule's `query` block, a supported seam), and that override must keep winning — but the options merge folds the rule block and the defaults into one object, after which a rule-declared `urlencoded` and the inherited default are the same string in the same slot. Provenance is unrecoverable post-merge, so the rule-declared value must be captured BEFORE the merge and consulted afterwards. **Behaviour note at pickup:** live-check bodies now route to the server's parse-verbatim JSON branch, so `+` survives — and `%XX` sequences are no longer URL-decoded either. The client stringifies raw field values without percent-encoding, so no correct consumer depends on that decode, but a bundle that leaned on it will see the literal. **Merge semantics this relies on (measured, and undocumented in the merge JSDoc):** `lib/merge` is variadic — it reads `override` off the LAST argument only when that argument is a boolean, and treats every other argument as an additional source, with EARLIER sources winning and later ones filling gaps. That is why a per-rule header beats the default, and why passing a third object is a merge rather than an override flag.
1040
1040
  319. **Controller render data — the dotted-path `set()` contract, and why a first write must never be walked (#P39 slice 2).** Inside `core/controller/controller.js`, every render is preceded by ~60 calls to a local `set('a.b.c', value)` that builds `local.userData` (`page.view.*`, `page.environment.*`, `page.forms`, `gina.csrfToken`, …). Its contract: missing intermediates are created as plain objects and an intermediate that is not a plain object (`null`, an array, a primitive) is REPLACED; at the leaf, **first write wins** (a later `set()` to an existing leaf is ignored — the `override` argument is accepted but inert), an object written onto an existing object leaf **deep-fills** it (missing keys added, existing kept) through `lib/merge`, and **a first-write value is stored by reference and is never walked, copied or mutated**. That last clause is the load-bearing one: `set('page.forms', conf.content.forms)` stores the shared per-process forms catalog, and the previous implementation — a JSON-string path builder + `JSON.parse` + a whole-subtree `merge` — recursed into every grafted object, re-merged each array inside it with itself, and wrote the copies back into the caller's object: 0.4–1.5 ms of CPU per request for a real catalog, and the catalog's arrays silently swapped for equal copies on every render. (That lib-level rewrite of a grafted source — array identity churn at every depth plus SILENT PRIMITIVE DEDUPE — was #B428, fixed in 0.6.19: `lib/merge` now skips a subtree that is the SAME object on both sides — merging a value into itself is identity — so a grafted source keeps its arrays and duplicates and the result references it; object/array references only, equal primitives keep their path; the root-absent `createMode` shallow-copy path is deliberately unchanged. Measured on a 2000-case seeded corpus: identical results and untouched sources for every non-shared merge. Two by-catches were staked out of it: #B436 — FIXED in 0.6.20: staked as 'nested arrays at depth ≥ 2 merge TWICE' (`[1,2,3,4,3,4]`), the MEASURED root was `mergeArray`'s number top-up deciding 'push again' by INDEX rather than by COUNT — any number the target already held at a shifted index was pushed again at EVERY depth (`merge([9,1],[1])` → `[9,1,1]`; `{ports:[8080,8124]}`+`{ports:[8124]}` → `[8080,8124,8124]`), and the depth-≥2 double pass (`browse()` merged arrays in its prop loop and again in the recursion) merely manufactured the shift; the top-up now compares counts (`[25]`+`[25,25]` still `[25,25]`, a present value is never pushed again, merging the same source twice is a no-op) and the prop-loop array merge runs only on the createMode path, so a nested array is merged once and an array SHARED by both sides at depth ≥ 2 keeps its identity (a #B428 residual); #B437 — FIXED in 0.6.20: a target array repeating a primitive (`['v2','v2']`) merged with an array of objects threw `TypeError: Cannot create property 'id' on string`, because `mergeArray`'s object-fill branch tested for a free index on the DEDUPED rebuild of the target and then wrote into the real target, whose index still held the string (or `null`); an occupied index is now left alone, as it already was for an object landing on one.) The rewrite assigns a first write directly and routes only genuine collisions through `merge` at the leaf, so the observable structure is identical (11,550 states differential-tested against the frozen old implementation) while the catalog is left alone; measured ×4.5 on the primitive writes and ×800+ on the catalog write. **Two generalisable traps from that work.** (1) Until 0.6.19 `lib/merge` MUTATED A SOURCE IT GRAFTED: a source subtree grafted by reference at an existing level was walked by the recursion with `src === copy`, every array inside it re-merged with itself and the copies written back into the caller's object — contents preserved, identity churned, cost proportional to the value. #B428's identity guard closed it, and the lesson stands for any merge-like helper that walks a caller's object by reference: measure identity through it before handing it an object you must keep intact. (2) `lib/merge` is VARIADIC and its copy behaviour depends on depth and shape: a value at depth 1 of a call is shallow-copied, deeper values are referenced (and until 0.6.20 a nested array was merged twice on the same level — once in the graft loop, once in the recursion). The array contract is now in its JSDoc (#B436); still read `browse()` before reasoning about identity through merge, and prefer a measured differential test over a model of it.
1041
1041
  320. **`route.request()` settles its caller exactly once - an outbound-request failure is an error argument, never a hang and never a bundle kill (#B442, 0.6.21).** The routing helper's outbound call (`getRoute(...).request([ignoreWebRoot,] options[, cb])`) DISCARDED the `ClientRequest` returned by `http(s).get`, so nothing could ever attach an `'error'` listener to it. Three consequences, all removed: (a) a dial failure whose code is carved out of the process-level uncaughtException handler (`ECONNREFUSED`/`ECONNRESET`/`EPIPE`/...) left the caller waiting FOREVER with nothing logged - a permanent wedge in any serialized consumer (a worker at concurrency 1, a queue processor), and the SILENCE is the defect, not the carve-out; (b) a code that is NOT carved out (`ETIMEDOUT`, `EHOSTUNREACH`, `ENETUNREACH` - i.e. a peer that stops answering or a route that goes away) escalated to `uncaughtException` and took the bundle down through the process-level `dismiss(pid, 'SIGTERM')`; (c) a response stream dying mid-body assigned its error to a local and waited for an `'end'` event that never arrives, so the assigned error was never delivered either. All four exit paths now run through ONE single-settle latch (`settled` flag + `settle()`), so the callback receives an ordinary error argument - the shape consuming code already handles - and can never be invoked twice. **`options.timeout` was INERT and looked like a consumer workaround:** it does reach `http(s).get`, but Node only EMITS `'timeout'` and never destroys the socket, and the request object was unreachable, so nobody could listen or act. It is now honoured - on expiry the request is destroyed and the callback settles with an `Error` carrying `code === 'ETIMEDOUT'`; absent/falsy `options.timeout` attaches no timeout listener, so the behaviour is opt-in. The no-callback (fire-and-forget) branch attaches its own `'error'` listener and `console.warn`s, so a call nobody awaited can no longer kill the process. Same defect class as the `store()` / `copyFile` movers (#B223/#B227): capture every request or stream you create, listen on BOTH ends, and latch the settle. **`lib/routing` IS browser-bundled** (aliased in the plugin `build.json`), so this ships in `gina.min.js` as well as server-side - pickup is a bundle restart AND a re-bake. Regression test: `test/lib/routing-request-settle.test.js` - source pins plus extract-and-execute behavioural arms driving the real shipped bytes against a fake agent; note the function region is brace-UNBALANCED (a `/^\{/` regex literal in the end handler), so the extraction is terminator-anchored on `} // EO route.request()` and a brace walker must NOT be substituted for it.
1042
- 321. **`merge()` array-element hardening - a null (or hole) element in an id-keyed array is an element with no key, never a crash (#B436/#B437/#B443 arc).** `typeof null == 'object'`, so `mergeArray`'s collection paths historically dereferenced null elements and threw `TypeError: Cannot read properties of null` - and because every configuration overlay and collection merge travels through `lib/merge`, any such shape was a whole-merge (often whole-boot) kill. The hardened contract, in layers: the WRITE side (0.6.20) - the index-merge branch tests for a free slot on the real target, and an occupied slot (a primitive or null left where the deduped rebuild had a hole) is skipped, never written into; number top-up is by COUNT, not index, so merges are idempotent (`[25]+[25,25]` gives `[25,25]`, `[9,1]+[1]` stays `[9,1]`). The READ side (0.6.21) - both collection ENTRY guards null-check the TARGET operand (they already checked the source), both id-ROSTER loops and both WALKS skip a null element, and the per-element collection tests null-check the SOURCE operand; a null element matches nothing, blocks nothing and contributes nothing. Semantics otherwise unchanged and pinned: a target whose slots are primitives/null keeps them (`[null,null]+[{id:1},{id:2}]` returns `[null,null]`, same as `['v2','v2']+...`), and an object BEHIND a primitive/null head is dropped by the per-element branch (pre-existing, `['x',{id:9}]+[{id:1}]` returns `['x']`). `lib/merge` is browser-bundled (aliased in the plugin `build.json`), so array-merge fixes ship in `gina.min.js` too - pickup is a bundle restart AND a re-bake. Regression suites: `test/lib/merge-b436.test.js`, `merge-b437.test.js`, `merge-b443.test.js` (behavioural arms driving the real lib + comment-stripped source pins + artifact-derived dist pins, all red-first validated). **#B446 — the same `for...in` loops are also a prototype-pollution sink.** `merge()` enumerated SOURCE keys with bare `for...in` at five sites (`:136`, `:197`, `:208`, `:237`, `:547` pre-fix; the lone `hasOwnProperty` at `:548` guards the TARGET, not the source), so an OWN `__proto__` key — exactly what `JSON.parse` yields, and what `core/server.js:6657` feeds it on the PUT path — walked through to `Object.prototype`. ⚠️ Subtler still: merge reads `src = target[name]` THROUGH the prototype chain, so with its documented target-wins-on-conflict rule a polluted value BEAT a default the source literal owned (measured: `rejectUnauthorized` flipping true→false on the query-options defaults). All five loops now reject `__proto__`/`constructor`/`prototype` BY NAME — that name check is the whole guard, and it is REQUIRED because own-property checking alone cannot see a JSON-parsed `__proto__` (an own key satisfies an own check by construction). ⚠️ The first cut ALSO skipped non-own keys as extra hardening and that was REVERTED before release: `lib/model.js` setModel round-trips entity instances through `merge()`, and all six SQL connectors attach their `.sql`-derived query methods to the PROTOTYPE, so own-only copying silently dropped every query method (`db.<x>Entity.getOneById is not a function`) while constructor-assigned methods survived — a partial, hard-to-attribute breakage caught by a consumer on the unpublished tree, never shipped. `merge()` walks the prototype chain, as it always has; only the three key names are refused. Regression suite: `test/lib/merge-entity-prototype.test.js` (red-first validated against the own-guard build). The `src`-read is deliberately left prototype-reachable — closing it would change documented conflict semantics for objects that legitimately inherit, and is tracked separately.
1042
+ 321. **`merge()` array-element hardening - a null (or hole) element in an id-keyed array is an element with no key, never a crash (#B436/#B437/#B443 arc).** `typeof null == 'object'`, so `mergeArray`'s collection paths historically dereferenced null elements and threw `TypeError: Cannot read properties of null` - and because every configuration overlay and collection merge travels through `lib/merge`, any such shape was a whole-merge (often whole-boot) kill. The hardened contract, in layers: the WRITE side (0.6.20) - the index-merge branch tests for a free slot on the real target, and an occupied slot (a primitive or null left where the deduped rebuild had a hole) is skipped, never written into; number top-up is by COUNT, not index, so merges are idempotent (`[25]+[25,25]` gives `[25,25]`, `[9,1]+[1]` stays `[9,1]`). The READ side (0.6.21) - both collection ENTRY guards null-check the TARGET operand (they already checked the source), both id-ROSTER loops and both WALKS skip a null element, and the per-element collection tests null-check the SOURCE operand; a null element matches nothing, blocks nothing and contributes nothing. Semantics otherwise unchanged and pinned: a target whose slots are primitives/null keeps them (`[null,null]+[{id:1},{id:2}]` returns `[null,null]`, same as `['v2','v2']+...`), and an object BEHIND a primitive/null head is dropped by the per-element branch (pre-existing, `['x',{id:9}]+[{id:1}]` returns `['x']`). `lib/merge` is browser-bundled (aliased in the plugin `build.json`), so array-merge fixes ship in `gina.min.js` too - pickup is a bundle restart AND a re-bake. Regression suites: `test/lib/merge-b436.test.js`, `merge-b437.test.js`, `merge-b443.test.js` (behavioural arms driving the real lib + comment-stripped source pins + artifact-derived dist pins, all red-first validated). **#B446 — the same `for...in` loops are also a prototype-pollution sink.** `merge()` enumerated SOURCE keys with bare `for...in` at five sites (`:136`, `:197`, `:208`, `:237`, `:547` pre-fix; the lone `hasOwnProperty` at `:548` guards the TARGET, not the source), so an OWN `__proto__` key — exactly what `JSON.parse` yields, and what `core/server.js:6657` feeds it on the PUT path — walked through to `Object.prototype`. ⚠️ Subtler still: merge reads `src = target[name]` THROUGH the prototype chain, so with its documented target-wins-on-conflict rule a polluted value BEAT a default the source literal owned (measured: `rejectUnauthorized` flipping true→false on the query-options defaults). All five loops now reject `__proto__`/`constructor`/`prototype` BY NAME — that name check is the whole guard, and it is REQUIRED because own-property checking alone cannot see a JSON-parsed `__proto__` (an own key satisfies an own check by construction). ⚠️ The first cut ALSO skipped non-own keys as extra hardening and that was REVERTED before release: the model layer round-trips entity instances through `merge()` — the in-tree path is the relations assembly (`core/model/entity.js`); the registry's `setModel` (`lib/model.js`) has no in-tree caller but is published through the `modelUtil` context and stays consumer-reachable — and all six SQL connectors attach their `.sql`-derived query methods to the PROTOTYPE, so own-only copying silently dropped every query method (`db.<x>Entity.getOneById is not a function`) while constructor-assigned methods survived — a partial, hard-to-attribute breakage caught by a consumer on the unpublished tree, never shipped. `merge()` walks the prototype chain, as it always has; only the three key names are refused. Regression suite: `test/lib/merge-entity-prototype.test.js` (red-first validated against the own-guard build). The `src`-read is deliberately left prototype-reachable — closing it would change documented conflict semantics for objects that legitimately inherit, and is tracked separately. **#B450 — the plain-object check itself CRASHED on shadowed `constructor` keys (pre-existing, measured identical on shipped 0.6.21).** `isObject()`'s eager `hasMethodPrototyped` compute (a "node > v6" edit that broke jQuery isPlainObject's short-circuit) read `.prototype` off an OWN `constructor` value, so `{"job":{"constructor":<primitive|null|{}|[]>}}` — FIVE measured shapes — threw `Cannot convert undefined or null to object` from any PUT body BEFORE the key filter could drop the name (the guard rejects keys at COPY time; this crash fired in the type predicate deciding recursion, one level up). Fixed by restoring the lazy short-circuit and guarding the `.prototype` read; a 24-shape differential sweep pins IDENTICAL answers on every input the old form did not crash on — so the recurse-vs-graft routing (plain objects recurse into fresh clones; class instances and functions graft by REFERENCE, which config singletons and instance registries rely on) is unchanged, and every crash shape now yields the disclosed drop-the-key behaviour with sibling fields surviving. Regression suite: `test/lib/merge-b450.test.js` (red-first: the five crash arms + boolean sibling fail on the pre-fix predicate; pollution/entity/graft controls green on both revisions).
1043
+ 322. **OWASP Top 10 response — framework-side security headers, request-body bounds, opt-in SRI (#OW1/#OW2/#OW3, 0.6.23).** Three framework-layer hardenings shipped together. **#OW1 headers:** `settings.json > server.securityHeaders` — the framework itself emits security headers on BOTH engines, because the #HDR plugins are express middleware and the default isaac engine never runs the express chain for HTTP responses (`server.use` middlewares are only ever drained by the WebSocket session binder against an inert response), so a mounted `SecurityHeaders()` orchestrator emitted NOTHING there; the emitter (`lib/security-headers-emitter`) is the framework-side twin of the #HDR8 hidePoweredBy gate. Tier A on by default (cannot break a working app): x-content-type-options / x-download-options / x-permitted-cross-domain-policies / x-xss-protection / referrer-policy / x-dns-prefetch-control / origin-agent-cluster. Tier B opt-in, one key each, each with a NAMED breakage: xFrameOptions (cross-origin embedding) / coop (severs window.opener — OAuth/payment popups) / corp (conflicts with gina's own `access-control-allow-origin: *` on `/_gina/*`) / hsts (180-day commitment, emitted over http too). First-writer-wins (a mounted plugin / `env.json` header / upstream proxy beats the framework default); coop/corp never applied to `/_gina/*`; header VALUES are asserted in tests against each plugin's own exported constant so framework and mounted plugin cannot diverge; `server.hidePoweredBy` default flipped to `true` (note the render-cache interaction: with the cache enabled and `server.cache.name` unset, the boot warning about `Cache-Status` still naming the framework fires — set a token there). `server.securityHeaders.enabled: false` restores the previous behaviour. **#OW2 body bounds:** `server.maxBodySize` (`"64MB"`, ENFORCED: 413 + `request.destroy()`, plus a `_bodyRejected` guard on the `end` handler because destroy racing buffered chunks would otherwise double-respond) and `server.maxBodySizeWarn` (`"2MB"`, warn-only) bound non-multipart bodies counting RAW wire bytes (a multi-byte UTF-8 body is larger on the wire than its decoded string length); `0` disables either; B/KB/MB/GB accepted (bare number = MB); multipart stays under the `upload.*` caps; `server.timeout` is exposed and defaults to `0` DELIBERATELY — a finite whole-request clock kills SSE/WebSocket, and the slow-body case is closed by the cap. **#OW3 SRI:** `templates.json > "_common" > "sriEnabled": true` (default false, bare boolean per that file's `*Enabled` convention) makes the controller's resource builder add ` integrity="sha384-..." crossorigin="anonymous"` to same-origin `<script>` AND `<link rel=stylesheet>` tags whose files resolve on disk — including `gina.min.js`/`gina.min.css`, which ride the framework conf's `_common` collections through the same emission path. `lib/sri` is FAIL-OPEN always (external `://` and protocol-relative `//` URLs, unresolvable paths, unreadable files, missing conf → NO attribute, never a guess — an absent attribute loads as before, a wrong one hard-blocks); resolution = query/fragment strip → webroot un-prefix → `content.statics[url]` exact match → `publicPath + url` (directory-mapped statics resolve nowhere → fail-open, deliberate); the hash cache is STAT-VALIDATED (mtimeMs + size, one statSync per lookup) so a rebuilt/re-baked asset re-hashes on the next render with NO restart — but pages already stored by the render/output cache keep the hash they were rendered with, so flush that cache after an asset rebuild; the HTTP/2 preload hint is SUPPRESSED for SRI'd assets (a hint carries no integrity metadata — a mismatched preload is a wasted double-fetch); sha384 is HARDCODED as a measured safety property (48-byte digest → 64 base64 chars, ZERO `=` padding, keeping integrity values structurally inert to the asset catalog's unanchored `(src|href|srcset)=` scan — sha512's padded base64 would reopen that hazard, so no algorithm knob ships); coverage caveats, both fail-safe: popin re-creates injected scripts copying only `src` (SRI not enforced on popin-injected loads) and the client loader's dynamic gina.min.css injection is likewise uncovered. Pickup: all three are server-side — bundle restart, no dist rebuild (`lib/sri` is not browser-bundled).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina",
3
- "version": "0.6.22",
3
+ "version": "0.6.23",
4
4
  "description": "MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency",
5
5
  "keywords": [
6
6
  "nodejs",
@@ -76,12 +76,12 @@
76
76
  "gina-container": "bin/gina-container",
77
77
  "gina-init": "bin/gina-init"
78
78
  },
79
- "main": "./framework/v0.6.22/core/gna",
79
+ "main": "./framework/v0.6.23/core/gna",
80
80
  "exports": {
81
81
  ".": {
82
82
  "types": "./types/index.d.ts",
83
83
  "import": "./index.mjs",
84
- "require": "./framework/v0.6.22/core/gna.js"
84
+ "require": "./framework/v0.6.23/core/gna.js"
85
85
  },
86
86
  "./gna": {
87
87
  "types": "./types/gna.d.ts",