gina 0.5.20 → 0.5.21

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 (532) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +9 -6
  3. package/ROADMAP.md +2 -0
  4. package/framework/v0.5.21/VERSION +1 -0
  5. package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.js +251 -76
  6. package/framework/v0.5.21/core/asset/plugin/dist/vendor/gina/js/gina.min.js +589 -0
  7. package/framework/v0.5.21/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  8. package/framework/v0.5.21/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  9. package/framework/{v0.5.20 → v0.5.21}/core/config.js +49 -2
  10. package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-json.js +6 -1
  11. package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-swig.js +46 -8
  12. package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/src/main.js +115 -47
  13. package/framework/{v0.5.20 → v0.5.21}/core/server.isaac.js +39 -4
  14. package/framework/{v0.5.20 → v0.5.21}/core/server.js +47 -3
  15. package/framework/{v0.5.20 → v0.5.21}/core/template/conf/env.json +7 -1
  16. package/framework/{v0.5.20 → v0.5.21}/lib/render-cache/src/main.js +113 -2
  17. package/framework/{v0.5.20 → v0.5.21}/lib/routing/src/main.js +4 -1
  18. package/framework/{v0.5.20 → v0.5.21}/package.json +1 -1
  19. package/gna.js +4 -4
  20. package/llms.txt +12 -2
  21. package/package.json +3 -3
  22. package/framework/v0.5.20/VERSION +0 -1
  23. package/framework/v0.5.20/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -588
  24. package/framework/v0.5.20/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  25. package/framework/v0.5.20/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  26. /package/framework/{v0.5.20 → v0.5.21}/AUTHORS +0 -0
  27. /package/framework/{v0.5.20 → v0.5.21}/LICENSE +0 -0
  28. /package/framework/{v0.5.20 → v0.5.21}/core/asset/html/nolayout.html +0 -0
  29. /package/framework/{v0.5.20 → v0.5.21}/core/asset/html/static.html +0 -0
  30. /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/android-chrome-192x192.png +0 -0
  31. /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/android-chrome-512x512.png +0 -0
  32. /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/apple-touch-icon.png +0 -0
  33. /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/favicon-16x16.png +0 -0
  34. /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/favicon-32x32.png +0 -0
  35. /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/favicon.ico +0 -0
  36. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/README.md +0 -0
  37. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  38. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  39. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  40. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  41. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  42. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  43. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  44. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  45. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  46. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  47. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  48. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  49. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  50. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  51. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  52. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  53. /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  54. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/ai/index.js +0 -0
  55. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/ai/lib/connector.js +0 -0
  56. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/index.js +0 -0
  57. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/connector.js +0 -0
  58. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  59. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  60. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/n1ql.js +0 -0
  61. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/session-store.js +0 -0
  62. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  63. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  64. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/index.js +0 -0
  65. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/connector.js +0 -0
  66. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/job-store.js +0 -0
  67. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  68. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/session-store.js +0 -0
  69. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mysql/index.js +0 -0
  70. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mysql/lib/connector.js +0 -0
  71. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/postgresql/index.js +0 -0
  72. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/postgresql/lib/connector.js +0 -0
  73. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/index.js +0 -0
  74. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/connector.js +0 -0
  75. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/job-store.js +0 -0
  76. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/render-cache-store.js +0 -0
  77. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/session-store.js +0 -0
  78. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/scylladb/index.js +0 -0
  79. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/scylladb/lib/connector.js +0 -0
  80. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/scylladb/lib/session-store.js +0 -0
  81. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sql-parser.js +0 -0
  82. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/index.js +0 -0
  83. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/lib/connector.js +0 -0
  84. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/lib/job-store.js +0 -0
  85. /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/lib/session-store.js +0 -0
  86. /package/framework/{v0.5.20 → v0.5.21}/core/content.encoding +0 -0
  87. /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.framework.js +0 -0
  88. /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.js +0 -0
  89. /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-nunjucks-async.js +0 -0
  90. /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-nunjucks.js +0 -0
  91. /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-stream.js +0 -0
  92. /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-swig-async.js +0 -0
  93. /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-v1.js +0 -0
  94. /package/framework/{v0.5.20 → v0.5.21}/core/controller/index.js +0 -0
  95. /package/framework/{v0.5.20 → v0.5.21}/core/controller/inspector-window-emit.js +0 -0
  96. /package/framework/{v0.5.20 → v0.5.21}/core/controller/release-banner.js +0 -0
  97. /package/framework/{v0.5.20 → v0.5.21}/core/dev/index.js +0 -0
  98. /package/framework/{v0.5.20 → v0.5.21}/core/dev/lib/class.js +0 -0
  99. /package/framework/{v0.5.20 → v0.5.21}/core/dev/lib/factory.js +0 -0
  100. /package/framework/{v0.5.20 → v0.5.21}/core/dev/lib/tools.js +0 -0
  101. /package/framework/{v0.5.20 → v0.5.21}/core/gna.js +0 -0
  102. /package/framework/{v0.5.20 → v0.5.21}/core/locales/README.md +0 -0
  103. /package/framework/{v0.5.20 → v0.5.21}/core/locales/currency.json +0 -0
  104. /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/language/en.json +0 -0
  105. /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/language/fr.json +0 -0
  106. /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/region/en.json +0 -0
  107. /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/region/fr.json +0 -0
  108. /package/framework/{v0.5.20 → v0.5.21}/core/locales/index.js +0 -0
  109. /package/framework/{v0.5.20 → v0.5.21}/core/mime.types +0 -0
  110. /package/framework/{v0.5.20 → v0.5.21}/core/model/entity.js +0 -0
  111. /package/framework/{v0.5.20 → v0.5.21}/core/model/index.js +0 -0
  112. /package/framework/{v0.5.20 → v0.5.21}/core/model/template/entityFactory.js +0 -0
  113. /package/framework/{v0.5.20 → v0.5.21}/core/model/template/index.js +0 -0
  114. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/README.md +0 -0
  115. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/index.js +0 -0
  116. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/csrf/README.md +0 -0
  117. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/csrf/package.json +0 -0
  118. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/csrf/src/main.js +0 -0
  119. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/README.md +0 -0
  120. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coep/README.md +0 -0
  121. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coep/package.json +0 -0
  122. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  123. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coop/README.md +0 -0
  124. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coop/package.json +0 -0
  125. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  126. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/corp/README.md +0 -0
  127. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/corp/package.json +0 -0
  128. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  129. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/csp/README.md +0 -0
  130. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/csp/package.json +0 -0
  131. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  132. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  133. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  134. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  135. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  136. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  137. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  138. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  139. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  140. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  141. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/package.json +0 -0
  142. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  143. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  144. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  145. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/src/main.js +0 -0
  146. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  147. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  148. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  149. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  150. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  151. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  152. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  153. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  154. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  155. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  156. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  157. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  158. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  159. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  160. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  161. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  162. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  163. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  164. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/session/README.md +0 -0
  165. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/session/package.json +0 -0
  166. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/session/src/main.js +0 -0
  167. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/README.md +0 -0
  168. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/build.json +0 -0
  169. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/package.json +0 -0
  170. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/src/main.js +0 -0
  171. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/README.md +0 -0
  172. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/build.json +0 -0
  173. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/package.json +0 -0
  174. /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/src/form-validator.js +0 -0
  175. /package/framework/{v0.5.20 → v0.5.21}/core/router.js +0 -0
  176. /package/framework/{v0.5.20 → v0.5.21}/core/server.express.js +0 -0
  177. /package/framework/{v0.5.20 → v0.5.21}/core/status.codes +0 -0
  178. /package/framework/{v0.5.20 → v0.5.21}/core/template/_gitignore +0 -0
  179. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/app.json +0 -0
  180. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  181. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/routing.json +0 -0
  182. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/settings.json +0 -0
  183. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  184. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/templates.json +0 -0
  185. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  186. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  187. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  188. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  189. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/index.js +0 -0
  190. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/locales/en.json +0 -0
  191. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  192. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  193. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  194. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  195. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  196. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  197. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  198. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  199. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/readme.md +0 -0
  200. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/sw.js +0 -0
  201. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  202. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  203. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  204. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  205. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  206. /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  207. /package/framework/{v0.5.20 → v0.5.21}/core/template/command/gina.bat.tpl +0 -0
  208. /package/framework/{v0.5.20 → v0.5.21}/core/template/command/gina.tpl +0 -0
  209. /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/manifest.json +0 -0
  210. /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/package.json +0 -0
  211. /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/settings.json +0 -0
  212. /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/statics.json +0 -0
  213. /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/templates.json +0 -0
  214. /package/framework/{v0.5.20 → v0.5.21}/core/template/error/client/json/401.json +0 -0
  215. /package/framework/{v0.5.20 → v0.5.21}/core/template/error/client/json/403.json +0 -0
  216. /package/framework/{v0.5.20 → v0.5.21}/core/template/error/client/json/404.json +0 -0
  217. /package/framework/{v0.5.20 → v0.5.21}/core/template/error/server/html/50x.html +0 -0
  218. /package/framework/{v0.5.20 → v0.5.21}/core/template/error/server/json/500.json +0 -0
  219. /package/framework/{v0.5.20 → v0.5.21}/core/template/error/server/json/503.json +0 -0
  220. /package/framework/{v0.5.20 → v0.5.21}/core/template/extensions/logger/config.json +0 -0
  221. /package/framework/{v0.5.20 → v0.5.21}/helpers/console.js +0 -0
  222. /package/framework/{v0.5.20 → v0.5.21}/helpers/context.js +0 -0
  223. /package/framework/{v0.5.20 → v0.5.21}/helpers/data/LICENSE +0 -0
  224. /package/framework/{v0.5.20 → v0.5.21}/helpers/data/README.md +0 -0
  225. /package/framework/{v0.5.20 → v0.5.21}/helpers/data/package.json +0 -0
  226. /package/framework/{v0.5.20 → v0.5.21}/helpers/data/src/main.js +0 -0
  227. /package/framework/{v0.5.20 → v0.5.21}/helpers/dateFormat.js +0 -0
  228. /package/framework/{v0.5.20 → v0.5.21}/helpers/index.js +0 -0
  229. /package/framework/{v0.5.20 → v0.5.21}/helpers/json/LICENSE +0 -0
  230. /package/framework/{v0.5.20 → v0.5.21}/helpers/json/README.md +0 -0
  231. /package/framework/{v0.5.20 → v0.5.21}/helpers/json/package.json +0 -0
  232. /package/framework/{v0.5.20 → v0.5.21}/helpers/json/src/main.js +0 -0
  233. /package/framework/{v0.5.20 → v0.5.21}/helpers/path.js +0 -0
  234. /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/README.md +0 -0
  235. /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/package.json +0 -0
  236. /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/src/api-error.js +0 -0
  237. /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/src/main.js +0 -0
  238. /package/framework/{v0.5.20 → v0.5.21}/helpers/prototypes.js +0 -0
  239. /package/framework/{v0.5.20 → v0.5.21}/helpers/task.js +0 -0
  240. /package/framework/{v0.5.20 → v0.5.21}/helpers/text.js +0 -0
  241. /package/framework/{v0.5.20 → v0.5.21}/lib/admin/package.json +0 -0
  242. /package/framework/{v0.5.20 → v0.5.21}/lib/admin/src/main.js +0 -0
  243. /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/README.md +0 -0
  244. /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/build.json +0 -0
  245. /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/package.json +0 -0
  246. /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/src/dep/jszip.min.js +0 -0
  247. /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/src/main.js +0 -0
  248. /package/framework/{v0.5.20 → v0.5.21}/lib/async/package.json +0 -0
  249. /package/framework/{v0.5.20 → v0.5.21}/lib/async/src/main.js +0 -0
  250. /package/framework/{v0.5.20 → v0.5.21}/lib/audit/package.json +0 -0
  251. /package/framework/{v0.5.20 → v0.5.21}/lib/audit/src/main.js +0 -0
  252. /package/framework/{v0.5.20 → v0.5.21}/lib/audit-store.js +0 -0
  253. /package/framework/{v0.5.20 → v0.5.21}/lib/authz-gate/package.json +0 -0
  254. /package/framework/{v0.5.20 → v0.5.21}/lib/authz-gate/src/main.js +0 -0
  255. /package/framework/{v0.5.20 → v0.5.21}/lib/cache/README.md +0 -0
  256. /package/framework/{v0.5.20 → v0.5.21}/lib/cache/build.json +0 -0
  257. /package/framework/{v0.5.20 → v0.5.21}/lib/cache/package.json +0 -0
  258. /package/framework/{v0.5.20 → v0.5.21}/lib/cache/src/main.js +0 -0
  259. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/aliases.json +0 -0
  260. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/add.js +0 -0
  261. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/arguments.json +0 -0
  262. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/build.js +0 -0
  263. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/copy.js +0 -0
  264. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/cp.js +0 -0
  265. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/help.js +0 -0
  266. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/help.txt +0 -0
  267. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  268. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/list.js +0 -0
  269. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/man.js +0 -0
  270. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/mcp-start.js +0 -0
  271. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/mcp.js +0 -0
  272. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/oas.js +0 -0
  273. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/openapi.js +0 -0
  274. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/remove.js +0 -0
  275. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/rename.js +0 -0
  276. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/restart.js +0 -0
  277. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/rm.js +0 -0
  278. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/start.js +0 -0
  279. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/status.js +0 -0
  280. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/stop.js +0 -0
  281. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/types.js +0 -0
  282. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/arguments.json +0 -0
  283. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/clear.js +0 -0
  284. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/help.txt +0 -0
  285. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/stats.js +0 -0
  286. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/add.js +0 -0
  287. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/arguments.json +0 -0
  288. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/help.js +0 -0
  289. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/help.txt +0 -0
  290. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/infer.js +0 -0
  291. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/list.js +0 -0
  292. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/migrate.js +0 -0
  293. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/models.js +0 -0
  294. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/remove.js +0 -0
  295. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/rm.js +0 -0
  296. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/test.js +0 -0
  297. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/arguments.json +0 -0
  298. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/help.js +0 -0
  299. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/help.txt +0 -0
  300. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/man.js +0 -0
  301. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/ps.js +0 -0
  302. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/stop.js +0 -0
  303. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/add.js +0 -0
  304. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/get.js +0 -0
  305. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/help.js +0 -0
  306. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/help.txt +0 -0
  307. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/link-dev.js +0 -0
  308. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/list.js +0 -0
  309. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/remove.js +0 -0
  310. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/rm.js +0 -0
  311. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/set.js +0 -0
  312. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/unset.js +0 -0
  313. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/use.js +0 -0
  314. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/add.js +0 -0
  315. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/arguments.json +0 -0
  316. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/build.js +0 -0
  317. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/dot.js +0 -0
  318. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/get.js +0 -0
  319. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/help.js +0 -0
  320. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/help.txt +0 -0
  321. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/init.js +0 -0
  322. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/link-node-modules.js +0 -0
  323. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/link.js +0 -0
  324. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/list.js +0 -0
  325. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/man.js +0 -0
  326. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/msg.json +0 -0
  327. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/open.js +0 -0
  328. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/remove.js +0 -0
  329. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/reset.js +0 -0
  330. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/restart.js +0 -0
  331. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/set.js +0 -0
  332. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/start.js +0 -0
  333. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/status.js +0 -0
  334. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/stop.js +0 -0
  335. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/tail.js +0 -0
  336. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/update.js +0 -0
  337. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/version.js +0 -0
  338. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/gina-dev.1.md +0 -0
  339. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/gina-framework.1.md +0 -0
  340. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/gina.1.md +0 -0
  341. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/helper.js +0 -0
  342. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/add.js +0 -0
  343. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/arguments.json +0 -0
  344. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/export.js +0 -0
  345. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/help.js +0 -0
  346. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/help.txt +0 -0
  347. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/import.js +0 -0
  348. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/scan.js +0 -0
  349. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/_host.js +0 -0
  350. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/arguments.json +0 -0
  351. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/build.js +0 -0
  352. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/help.js +0 -0
  353. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/help.txt +0 -0
  354. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/list.js +0 -0
  355. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/man.js +0 -0
  356. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/rm.js +0 -0
  357. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/run.js +0 -0
  358. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/index.js +0 -0
  359. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/inspector/help.js +0 -0
  360. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/inspector/help.txt +0 -0
  361. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/inspector/open.js +0 -0
  362. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/man-render.js +0 -0
  363. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/arguments.json +0 -0
  364. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/help.js +0 -0
  365. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/help.txt +0 -0
  366. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/kill.js +0 -0
  367. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/list.js +0 -0
  368. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/msg.json +0 -0
  369. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/help.js +0 -0
  370. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/help.txt +0 -0
  371. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/inc/scan.js +0 -0
  372. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/list.js +0 -0
  373. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/reset.js +0 -0
  374. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/set.js +0 -0
  375. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/add.js +0 -0
  376. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/arguments.json +0 -0
  377. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/backup.js +0 -0
  378. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/build.js +0 -0
  379. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/help.js +0 -0
  380. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/help.txt +0 -0
  381. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/import.js +0 -0
  382. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/list.js +0 -0
  383. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/man.js +0 -0
  384. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/move.js +0 -0
  385. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/remove.js +0 -0
  386. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/rename.js +0 -0
  387. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/restart.js +0 -0
  388. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/restore.js +0 -0
  389. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/rm.js +0 -0
  390. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/start.js +0 -0
  391. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/status.js +0 -0
  392. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/stop.js +0 -0
  393. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/arguments.json +0 -0
  394. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/help.js +0 -0
  395. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/help.txt +0 -0
  396. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/list.js +0 -0
  397. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/remove.js +0 -0
  398. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/set.js +0 -0
  399. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/add.js +0 -0
  400. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/help.js +0 -0
  401. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/help.txt +0 -0
  402. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/link-local.js +0 -0
  403. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/link-production.js +0 -0
  404. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/list.js +0 -0
  405. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/remove.js +0 -0
  406. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/rm.js +0 -0
  407. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/use.js +0 -0
  408. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/arguments.json +0 -0
  409. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/check.js +0 -0
  410. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/help.js +0 -0
  411. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/help.txt +0 -0
  412. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/scan.js +0 -0
  413. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/help.js +0 -0
  414. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/help.txt +0 -0
  415. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/list.js +0 -0
  416. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/man.js +0 -0
  417. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/start.js +0 -0
  418. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/view/add.js +0 -0
  419. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd-status-format/package.json +0 -0
  420. /package/framework/{v0.5.20 → v0.5.21}/lib/cmd-status-format/src/main.js +0 -0
  421. /package/framework/{v0.5.20 → v0.5.21}/lib/collection/README.md +0 -0
  422. /package/framework/{v0.5.20 → v0.5.21}/lib/collection/build.json +0 -0
  423. /package/framework/{v0.5.20 → v0.5.21}/lib/collection/package.json +0 -0
  424. /package/framework/{v0.5.20 → v0.5.21}/lib/collection/src/main.js +0 -0
  425. /package/framework/{v0.5.20 → v0.5.21}/lib/config.js +0 -0
  426. /package/framework/{v0.5.20 → v0.5.21}/lib/connector-config/package.json +0 -0
  427. /package/framework/{v0.5.20 → v0.5.21}/lib/connector-config/src/main.js +0 -0
  428. /package/framework/{v0.5.20 → v0.5.21}/lib/connector-registry/package.json +0 -0
  429. /package/framework/{v0.5.20 → v0.5.21}/lib/connector-registry/src/main.js +0 -0
  430. /package/framework/{v0.5.20 → v0.5.21}/lib/cron/README.md +0 -0
  431. /package/framework/{v0.5.20 → v0.5.21}/lib/cron/package.json +0 -0
  432. /package/framework/{v0.5.20 → v0.5.21}/lib/cron/src/main.js +0 -0
  433. /package/framework/{v0.5.20 → v0.5.21}/lib/domain/LICENSE +0 -0
  434. /package/framework/{v0.5.20 → v0.5.21}/lib/domain/README.md +0 -0
  435. /package/framework/{v0.5.20 → v0.5.21}/lib/domain/package.json +0 -0
  436. /package/framework/{v0.5.20 → v0.5.21}/lib/domain/src/main.js +0 -0
  437. /package/framework/{v0.5.20 → v0.5.21}/lib/dto/package.json +0 -0
  438. /package/framework/{v0.5.20 → v0.5.21}/lib/dto/src/main.js +0 -0
  439. /package/framework/{v0.5.20 → v0.5.21}/lib/dto-pipe/package.json +0 -0
  440. /package/framework/{v0.5.20 → v0.5.21}/lib/dto-pipe/src/main.js +0 -0
  441. /package/framework/{v0.5.20 → v0.5.21}/lib/dto-types/package.json +0 -0
  442. /package/framework/{v0.5.20 → v0.5.21}/lib/dto-types/src/main.js +0 -0
  443. /package/framework/{v0.5.20 → v0.5.21}/lib/generator/index.js +0 -0
  444. /package/framework/{v0.5.20 → v0.5.21}/lib/i18n/package.json +0 -0
  445. /package/framework/{v0.5.20 → v0.5.21}/lib/i18n/src/main.js +0 -0
  446. /package/framework/{v0.5.20 → v0.5.21}/lib/image-build/package.json +0 -0
  447. /package/framework/{v0.5.20 → v0.5.21}/lib/image-build/src/main.js +0 -0
  448. /package/framework/{v0.5.20 → v0.5.21}/lib/index.js +0 -0
  449. /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/LICENSE +0 -0
  450. /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/README.md +0 -0
  451. /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/package.json +0 -0
  452. /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/src/main.js +0 -0
  453. /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-events/package.json +0 -0
  454. /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-events/src/main.js +0 -0
  455. /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-redact/package.json +0 -0
  456. /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-redact/src/main.js +0 -0
  457. /package/framework/{v0.5.20 → v0.5.21}/lib/instrument/package.json +0 -0
  458. /package/framework/{v0.5.20 → v0.5.21}/lib/instrument/src/main.js +0 -0
  459. /package/framework/{v0.5.20 → v0.5.21}/lib/job/package.json +0 -0
  460. /package/framework/{v0.5.20 → v0.5.21}/lib/job/src/main.js +0 -0
  461. /package/framework/{v0.5.20 → v0.5.21}/lib/job-store.js +0 -0
  462. /package/framework/{v0.5.20 → v0.5.21}/lib/json-config-header/package.json +0 -0
  463. /package/framework/{v0.5.20 → v0.5.21}/lib/json-config-header/src/main.js +0 -0
  464. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/README.md +0 -0
  465. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/package.json +0 -0
  466. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/default/index.js +0 -0
  467. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/file/index.js +0 -0
  468. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  469. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  470. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/mq/index.js +0 -0
  471. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/mq/listener.js +0 -0
  472. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/mq/speaker.js +0 -0
  473. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/helper.js +0 -0
  474. /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/main.js +0 -0
  475. /package/framework/{v0.5.20 → v0.5.21}/lib/math/index.js +0 -0
  476. /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-dispatch/package.json +0 -0
  477. /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-dispatch/src/main.js +0 -0
  478. /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-http/package.json +0 -0
  479. /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-http/src/main.js +0 -0
  480. /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-server/package.json +0 -0
  481. /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-server/src/main.js +0 -0
  482. /package/framework/{v0.5.20 → v0.5.21}/lib/merge/README.md +0 -0
  483. /package/framework/{v0.5.20 → v0.5.21}/lib/merge/package.json +0 -0
  484. /package/framework/{v0.5.20 → v0.5.21}/lib/merge/src/main.js +0 -0
  485. /package/framework/{v0.5.20 → v0.5.21}/lib/metrics/package.json +0 -0
  486. /package/framework/{v0.5.20 → v0.5.21}/lib/metrics/src/main.js +0 -0
  487. /package/framework/{v0.5.20 → v0.5.21}/lib/model.js +0 -0
  488. /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-filters/README.md +0 -0
  489. /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-filters/package.json +0 -0
  490. /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-filters/src/main.js +0 -0
  491. /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-resolver/package.json +0 -0
  492. /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-resolver/src/main.js +0 -0
  493. /package/framework/{v0.5.20 → v0.5.21}/lib/proc.js +0 -0
  494. /package/framework/{v0.5.20 → v0.5.21}/lib/release-watch/package.json +0 -0
  495. /package/framework/{v0.5.20 → v0.5.21}/lib/release-watch/src/main.js +0 -0
  496. /package/framework/{v0.5.20 → v0.5.21}/lib/render-cache/package.json +0 -0
  497. /package/framework/{v0.5.20 → v0.5.21}/lib/render-cache-store.js +0 -0
  498. /package/framework/{v0.5.20 → v0.5.21}/lib/routing/README.md +0 -0
  499. /package/framework/{v0.5.20 → v0.5.21}/lib/routing/build.json +0 -0
  500. /package/framework/{v0.5.20 → v0.5.21}/lib/routing/package.json +0 -0
  501. /package/framework/{v0.5.20 → v0.5.21}/lib/routing/src/radix.js +0 -0
  502. /package/framework/{v0.5.20 → v0.5.21}/lib/routing-introspect/package.json +0 -0
  503. /package/framework/{v0.5.20 → v0.5.21}/lib/routing-introspect/src/main.js +0 -0
  504. /package/framework/{v0.5.20 → v0.5.21}/lib/secrets/package.json +0 -0
  505. /package/framework/{v0.5.20 → v0.5.21}/lib/secrets/src/backends/env.js +0 -0
  506. /package/framework/{v0.5.20 → v0.5.21}/lib/secrets/src/main.js +0 -0
  507. /package/framework/{v0.5.20 → v0.5.21}/lib/session-store.js +0 -0
  508. /package/framework/{v0.5.20 → v0.5.21}/lib/shell.js +0 -0
  509. /package/framework/{v0.5.20 → v0.5.21}/lib/state.js +0 -0
  510. /package/framework/{v0.5.20 → v0.5.21}/lib/swig-filters/README.md +0 -0
  511. /package/framework/{v0.5.20 → v0.5.21}/lib/swig-filters/package.json +0 -0
  512. /package/framework/{v0.5.20 → v0.5.21}/lib/swig-filters/src/main.js +0 -0
  513. /package/framework/{v0.5.20 → v0.5.21}/lib/swig-resolver/package.json +0 -0
  514. /package/framework/{v0.5.20 → v0.5.21}/lib/swig-resolver/src/main.js +0 -0
  515. /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/package.json +0 -0
  516. /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/src/loaders/http.js +0 -0
  517. /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/src/loaders/memory.js +0 -0
  518. /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/src/main.js +0 -0
  519. /package/framework/{v0.5.20 → v0.5.21}/lib/url/README.md +0 -0
  520. /package/framework/{v0.5.20 → v0.5.21}/lib/url/index.js +0 -0
  521. /package/framework/{v0.5.20 → v0.5.21}/lib/url/routing.json +0 -0
  522. /package/framework/{v0.5.20 → v0.5.21}/lib/uuid/package.json +0 -0
  523. /package/framework/{v0.5.20 → v0.5.21}/lib/uuid/src/main.js +0 -0
  524. /package/framework/{v0.5.20 → v0.5.21}/lib/validator.js +0 -0
  525. /package/framework/{v0.5.20 → v0.5.21}/lib/watcher/package.json +0 -0
  526. /package/framework/{v0.5.20 → v0.5.21}/lib/watcher/src/main.js +0 -0
  527. /package/framework/{v0.5.20 → v0.5.21}/lib/ws-framing/package.json +0 -0
  528. /package/framework/{v0.5.20 → v0.5.21}/lib/ws-framing/src/main.js +0 -0
  529. /package/framework/{v0.5.20 → v0.5.21}/lib/ws-query/package.json +0 -0
  530. /package/framework/{v0.5.20 → v0.5.21}/lib/ws-query/src/main.js +0 -0
  531. /package/framework/{v0.5.20 → v0.5.21}/lib/ws-session/package.json +0 -0
  532. /package/framework/{v0.5.20 → v0.5.21}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
6
6
  and is generated by [Changie](https://github.com/miniscruff/changie).
7
7
 
8
8
 
9
+ ## 0.5.21 - 2026-07-20
10
+ ### Added
11
+ * Popin eager preload — a trigger can opt into warming its AJAX content off the critical path with data-gina-dialog-preload="eager" (case-insensitive): after window load, at browser idle, the popin plugin fetches the content one trigger at a time through the same gate as the hover/focus warm (the "false" opt-out, the disabled skip, and the cache dedup all apply — whichever warm runs second is a no-op), so a later open injects instantly with no second GET. The pass is skipped when the browser signals Save-Data. Default behavior is unchanged: hover/focus warm stays the default and "false" still disables warming entirely. Browser-bundled — rebuild your bundles to pick it up.
12
+ ### Fixed
13
+ * Fixed CSP useNonce nonces diverging between the Content-Security-Policy header and the framework-injected inline bootstrap script on cache-enabled routes: the bootstrap nonce was frozen at first compile inside the per-view compiled-template cache (and the persisted layout cache) while the header rotated per request, so every cache-path response failed nonce validation under an enforcing policy. The bootstrap nonce is now injected as a render-time template conditional (re-evaluated per response), stale pre-fix layout-cache files are healed in place on the next compile, and cache HITS re-mint: the serve path rewrites the stored CSP header and body with a fresh per-response nonce on both engines, so header and markup nonces match and rotate on misses and hits alike.
14
+ * A bundle whose config/routing.json is missing or unreadable at boot now refuses to start with an error naming the bundle and environment (previously it booted silently with only the framework-synthetic routes, so every app route 404'd and cross-bundle route lookups threw hours later with no boot-time signal); an external supervisor restart (an orchestrator liveness/restart or a container restart policy) then retries until the release tree settles, which self-heals mid-deploy races — the gina daemon itself does not retry a startup crash (it reports it once and stops; restart manually) — a deployment that relied on the silent half-boot must fix its release artifact. The route-lookup not-found error now also names the bundle and its rule count, so a degraded or near-empty routing table is tellable from a plain mistyped rule at the call site
15
+ * FormValidator: on live-check fields with autocomplete="off", the Safari-autocomplete keydown interception no longer swallows modifier chords — Cmd/Ctrl+A/C/V/X/Z and Cmd+Arrow run their native defaults instead of typing the chord letter into the field (Cmd+A appended "a") or routing keyboard paste through document.execCommand("paste"), which is inert in unprivileged web content, so keyboard paste on intercepted fields works again (#B134)
16
+ * The framework env template no longer declares a hardcoded accept-language RESPONSE header — Accept-Language is a request header, and the runtime-merged template default made every response (error responses included) emit it. A project or bundle env.json that declares its own response headers keeps working, including re-declaring accept-language, which is still emitted verbatim and still honored by the controller's locale fallback; deployments whose generated env.json copied the old template value should remove that line themselves
17
+ * FormValidator: the Safari-autocomplete keydown interception (fields with autocomplete="off" on a live-check form) now gates on REAL Safari only — every Chromium UA (Chrome/Edge/Brave/Opera) carries the Safari/537.36 token, so the bare /safari/i test ran the WebKit workaround on Chromium where it was never intended; Chromium users get native typing/autofill behavior back, while WebKit-on-iOS browsers (CriOS/FxiOS) stay covered by design (#B135)
18
+ * FormValidator live-check: when the whole-form validation pass turns valid (e.g. a checkbox interaction raises a field another field's comparison rule reads), the pass now clears every previously-errored field's rendered error message along with re-enabling the submit trigger — pre-fix the stale blocking-error paragraph stayed visible next to an enabled submit until the field's next keystroke; applied to both global-pass copies (input/checkbox/radio path and select path), and the pass still never renders new errors on untouched fields (#B136)
19
+ * Merged-process projects (several bundles sharing one port, served by one process): the first cross-bundle getUrl no longer permanently replaces the target bundle's routing table with the starting app's — previously every cross-bundle link to that bundle rendered the literal 404:[<METHOD>]<rule>@<bundle> marker instead of a URL, and merged-mode inbound statics dispatch could match requests against the wrong bundle's table. Each bundle now keeps its own routing table (the hostname share is preserved); projects with distinct per-bundle ports were never affected.
20
+ ### Security
21
+ * Server-side error responses no longer serialize stack traces to HTTP clients outside local scope: the engine-level error responder logs the full stack server-side and sends the message line only (JSON/XHR bodies, the inline HTML fallback, and custom-error-page data), the JSON render delegate's HTTP/1.1 reason-phrase fallback ships the error message instead of a stack, and the cached-file stream error path ships message-only — local scope keeps the stack on the wire for the development toolbar
22
+
9
23
  ## 0.5.20 - 2026-07-19
10
24
  ### Changed
11
25
  * Multipart parsing now uses `@rhinostone/busboy` installed from npm instead of a patched copy vendored inside the framework. The fork is a strict superset of upstream busboy 1.6.0 whose only addition exposes each part's parsed Content-Disposition parameters, which is what lets the upload layer read the `group="..."` tag — previously a local patch that had to be re-applied by hand on every upstream upgrade. Upload behaviour and the multipart wire format are unchanged: files still arrive with their group, an unconfigured group is still rejected, and a file with no group still falls back to `untagged`. Pickup is the version plus a bundle restart; no client rebuild is needed.
package/README.md CHANGED
@@ -42,12 +42,15 @@ open https://localhost:3100
42
42
 
43
43
  > **npm 12+** blocks install scripts by default, and gina's post-install bootstraps `~/.gina` and the framework dependencies. Install with `npm install -g gina@latest --allow-scripts=gina`, or allow it once for all global installs with `npm config set allow-scripts=gina --location=user`. (Not needed on npm ≤ 11.)
44
44
 
45
- ## What's in 0.5.20
46
-
47
- - **Fixedregion locale data: one file per language, with localized country names.** The region-locale generator used to append each requested language's rows to the previous language's output, so `dist/region/fr.json` carried every country twice (the English copy first) and `getLocales().getCountries()` always resolved the English row. Each language now ships as a standalone file, and non-English builds localize `countryName` a bundle resolving a `fr` culture now renders `Allemagne`, `États-Unis`, `Royaume-Uni` where it previously showed `Germany`, `US`, `UK`, through the same `getLocales().getCountries()` path with no application changes. Rows with no ISO 3166 alpha-2 code are dropped (they could only ever render blank). The region files are read once at boot, so restart your bundles after upgrading to pick up the regenerated data. (#50)
48
- - **Fixed — `getCountries(code)` honors its projection argument.** The optional `code` argument (e.g. `capital`, `continent`, `tld`) was computed and never applied; it now adds that field to every returned row while the four historical fields (`isoShort`, `isoLong`, `countryName`, `officialStateName`) stay untouched, so calls without an argument return exactly what they did before. An unknown or non-string field logs a warning and is ignored, and a bundle with no locale set gets an empty list instead of throwing. (#50)
49
- - **Fixed — FormValidator: numbered `is` rules now enforce, injected forms activate live checking, and boolean `_case_` conditions match live.** Numbered `is` aliases (`is1`, `is2`, …) were silently skipped and now install and run on both the client and the server **a form that submitted clean because its `is2` condition was ignored may begin failing validation (or returning 422), so sweep your rule files for numbered `is` keys before upgrading.** Each alias now records its error under its own key on both sides, and server-side validation of rules carrying `$` cross-field references no longer crashes. Separately, dynamically injected (popin) forms now resolve `data-gina-form-rule` so live checking activates, and `_case_` conditions written as the strings `"true"` / `"false"` now match during live checking. These are browser-bundled changes — rebuild your bundles after upgrading. (#B127/#B128/#B129)
50
- - **Changedbusboy is now an npm dependency, not a vendored copy.** Multipart form parsing uses [`@rhinostone/busboy`](https://github.com/gina-io/busboy) — a strict superset of upstream busboy 1.6.0 whose only addition exposes each part's parsed Content-Disposition parameters, which is what lets the upload layer read the `group="…"` tag installed from npm instead of a patched copy carried inside the framework tree. Upload behaviour and the multipart wire format are unchanged: files still arrive with their group, an unconfigured group is still rejected, and a file with no group still falls back to `untagged`. No application changes and no client rebuild pickup is the version plus a bundle restart.
45
+ ## What's in 0.5.21
46
+
47
+ - **Security500 bodies no longer carry stack traces outside local scope.** Uncaught controller and middleware errors route through the server-side error responder, which used to serialize the full stack absolute server paths and frames into the JSON `error` field, the inline HTML fallback, and custom-error-page data on every scope. Outside local scope the wire now carries only the error's message line (the JSON render delegate's HTTP/1.1 reason-phrase fallback and the cached-file stream error path included); the full stack goes to the server log. Local scope is unchanged the development toolbar keeps its stack.
48
+ - **Changeda missing bundle `routing.json` now fails the boot (deliberate).** A bundle whose `config/routing.json` was missing at boot used to start silently with only the framework-synthetic routes — every app route 404'd, and cross-bundle lookups threw hours later. The boot now refuses to start with an error naming the bundle and environment, exactly like a malformed `routing.json` always has; under an external supervisor (Kubernetes, a container restart policy, an init system) the restart retries until the release tree settles, while a bare `gina bundle:start` reports the crash once and stays down until restarted manually. The route-lookup not-found error also names the bundle and its rule count, so a degraded table is tellable from a mistyped rule that half is browser-bundled, so rebuild your bundles.
49
+ - **Fixed — FormValidator: keyboard shortcuts on `autocomplete="off"` fields, the Safari-only gate, and stale error clearing.** The Safari-autocomplete keydown interception no longer swallows modifier chords (Cmd/Ctrl+A/C/V/X/Z run their native defaults instead of typing the chord letter into the field) and now runs on real Safari only every Chromium UA carries the `Safari/537.36` token, so Chrome/Edge/Brave were wrongly intercepted. And when a live-check whole-form pass turns valid, every previously-errored field's message is now cleared along with re-enabling the submit trigger, instead of leaving a stale blocking error on screen. Browser-bundled — rebuild your bundles. (#B134/#B135/#B136)
50
+ - **Fixedcross-bundle links in merged-process projects.** In a project whose bundles share one port (served by one process), the first cross-bundle `getUrl` permanently replaced the target bundle's routing table with the starting app's every cross-bundle link to that bundle rendered a literal `404:[…]` marker instead of a URL. Each bundle now keeps its own routing table. Server-side only; projects with distinct per-bundle ports were never affected. (#B137)
51
+ - **Fixed — CSP `useNonce` on cache-enabled routes.** The framework-injected inline bootstrap's nonce was frozen at first compile inside the compiled-template and layout caches while the `Content-Security-Policy` header rotated per request, so every cache-path response failed nonce validation under an enforcing policy. The nonce is now injected per response, stale pre-fix layout-cache files heal in place, and cache hits re-mint both the stored header and body with a fresh nonce on both engines.
52
+ - **Fixed — the hardcoded `accept-language` response header is gone.** Accept-Language is a request header, but the framework env template declared it as a response default, so every response — error responses included — emitted it. An env.json that declares its own response headers keeps working verbatim; deployments whose generated env.json copied the old template line should remove it.
53
+ - **Added — popin eager preload.** Mark a trigger with `data-gina-dialog-preload="eager"` and the popin plugin fetches its AJAX content after window load, at browser idle — one trigger at a time, off the critical path — so a later open injects instantly with no second GET. Same safety gates as the hover/focus warm (the `"false"` opt-out, the disabled skip, cache dedup), and the pass is skipped under Save-Data. Default behavior is unchanged. Browser-bundled — rebuild your bundles.
51
54
 
52
55
  See the full [Changelog](./CHANGELOG.md) and [Roadmap](./ROADMAP.md).
53
56
 
package/ROADMAP.md CHANGED
@@ -45,6 +45,7 @@ This roadmap covers planned features, architectural improvements, new connectors
45
45
  | **Q3 2026** | `0.5.18` ✅ | **Added**: a redis-backed L2 render cache — rendered output is cached in a shared store, so several replicas serve the same rendered page and a freshly-started replica serves what a peer already rendered (cross-replica cold-start), degrading to per-replica caching if redis is down · pluggable cache backends (`server.cache.type`: `memory` / `fs` / `redis`) with bundle-wide `sliding` / `maxAge` fallbacks a route inherits · type-safe DTOs and a default-on validation pipe (`gina.dto` — one shape projected to runtime validation, response shaping, JSON Schema and TypeScript; `param.dto` validates the payload before the action with a localised 422, `param.responseDto` shapes the wire, `gina bundle:types` emits declarations, and `bundle:openapi` / `bundle:mcp` emit real request/response schemas) · `releaseWatch` — an opt-in stale built-release watch for local production rehearsals (source-tree fingerprint against the manifest release stamp, `GET /_gina/release/status` + an SSE stream, idle-gated rebuild-and-restart honouring in-flight requests and busy probes, a live shadow-DOM banner, and `restartMode: supervisor` for daemonless container launches) · `POST /_gina/cache/clear` + a `gina cache:clear` CLI (flush the rendered-output cache, or evict by event across bundles) · two-tier cache observability (an RFC 9211 `Cache-Status` `detail` naming the serving tier, plus an `l2` redis-health block on `/_gina/cache/stats`) · **Changed**: render-cache keys are release-namespaced, so an upgrade auto-invalidates (`GINA_CACHE_NAMESPACE`, else the framework version) · the `Cache-Status` miss form is now the RFC 9211 `gina-cache; fwd=uri-miss`, and Express bundles get their first cache-miss signal · **Fixed**: event-driven cache invalidation works — `self.cache.invalidateByEvent()` now exists, and a key carrying a querystring no longer throws a 500 that discarded an already-rendered page · the `fs` cache survives a restart (disk read-back via a `.meta` sidecar, original absolute expiry preserved, no TTL extension) · a checkbox's `value` attribute no longer decides its `checked` state (#49) · the published TypeScript declarations describe the runtime · errors surface instead of crashing, masking, or coming back as `0` (detached-context `throwError`, partial-boot `getLib()` / `getConfig()`, a bitwise-or at nine sites, and `$` in log messages) |
46
46
  | **Q3 2026** | `0.5.19` ✅ | **Added**: route authorization — a `routing.json` rule gates access before the action runs via `param.requireAuth` (a 401 for XHR, a non-cacheable login redirect for a browser navigation, the original request snapshotted for `resumeRequest()`), `param.roles` (ANY-of, implies `requireAuth`), and `param.policy` (a per-bundle function for the ownership/record checks roles can't express, AND-composed after roles); denials stay generic — required roles and the policy name never reach the wire — author mistakes refuse to boot, and `self.hasRole()` authorizes mid-logic · an audit trail — opt-in `self.audit(action, data)` writes a user-attributed append-only JSONL record (its own store, never the logger sinks; an actor snapshot, `X-Forwarded-For` never trusted), route-authorization denials recorded automatically, and an always-on request id correlating audit records to JSON logs · an OCI image/container CLI on the `image:build` host — `image:list` / `image:rm` / `image:run` (podman; publishes the EXPOSEd port, `--env-var` / `--env-file` keep secrets out of argv) and a `container:` group (`container:ps` / `container:stop`, reporting the rung a container came down on) · **Changed**: `redirect()` carries request data through the session by default (a one-shot flash, gone on refresh), the clear-text `?inheritedData=` URL form and its 2000-char cap now session-less-only — removing a plaintext-secret-in-URL disclosure when a session-ful bundle halts a credential-bearing POST · **Fixed**: Prometheus metrics no longer double-count under the isaac engine (#OBS1) · the relative `self.redirect('/path')` form resolves again and an unresolvable target 404s instead of crashing (`redirect()` is now async), and `getRoute()` no longer 500s on a requirements-less GET route with extra params (#B120/#B121) · `image:build` for gina-dependent projects no longer fails at gina-init and the pinned framework wins `require('gina')` (#B118/#B119) · `gina.emit` is an inert stub (#B109) and the checkbox migration warning now covers the un-tick direction (#49) |
47
47
  | **Q3 2026** | `0.5.20` ✅ | **Fixed**: region locale data — the generator now emits one standalone file per language with localized country names (a `fr` culture renders `Allemagne` / `États-Unis` / `Royaume-Uni` through the same `getLocales().getCountries()` path, no app changes; rows without an ISO 3166 alpha-2 code are dropped; read once at boot, so restart to pick up), and `getCountries(code)` honors its projection argument — adding the requested field while the four historical fields stay untouched, an empty locale set degrading to an empty list instead of throwing (#50) · **Fixed**: FormValidator — numbered `is` rules (`is1`, `is2`, …) now install and enforce on client and server (previously silently skipped; **sweep rule JSONs before upgrading — forms may begin 422ing**), each alias keying its error distinctly and server-side `$`-cross-field rules no longer crashing; injected/popin forms resolve `data-gina-form-rule` so live checking activates; boolean `_case_` conditions match live (#B127/#B128/#B129) · **Changed**: multipart parsing uses `@rhinostone/busboy` installed from npm instead of a patched vendored copy — a strict superset of upstream busboy 1.6.0, upload behaviour and the wire format unchanged, pickup is the version plus a bundle restart |
48
+ | **Q3 2026** | `0.5.21` ✅ | **Security**: server-side error responses no longer serialize stack traces to HTTP clients outside local scope — the responder logs the full stack server-side and ships the message line only (JSON bodies, the inline HTML fallback, custom-error-page data; local scope keeps the development-toolbar stack) · **Changed**: a bundle whose `config/routing.json` is missing at boot now refuses to start with an error naming the bundle and environment (previously a silent half-boot with only the framework-synthetic routes; an external supervisor's restart retries until the release tree settles — the daemon itself is fail-stop), and the route-lookup not-found error names the bundle and its rule count · **Fixed**: FormValidator — modifier chords (Cmd/Ctrl+A/C/V/X/Z) run their native defaults again on `autocomplete="off"` live-check fields, the Safari-autocomplete interception gates on real Safari only (Chromium UAs no longer intercepted), and a whole-form live-check pass that turns valid clears every previously-errored field's message (#B134/#B135/#B136) · **Fixed**: merged-process (same-port multi-bundle) projects — the first cross-bundle getUrl no longer permanently replaces the target bundle's routing table with the starting app's, which rendered every cross-bundle link as a literal `404:[…]` marker; distinct-port projects were never affected (#B137) · **Fixed**: CSP `useNonce` on cache-enabled routes — the header and inline-bootstrap nonces now match and rotate per response, on cache hits and misses alike · **Fixed**: the env template's hardcoded `accept-language` response header is gone (a request header, wrongly emitted on every response) · **Added**: popin eager preload — `data-gina-dialog-preload="eager"` warms a popin's AJAX content at browser idle after window load, same safety gates as the hover/focus warm, skipped under Save-Data |
48
49
  | **Q4 2026** | `0.6.0` | Security & compliance controls (technical safeguards mapping to PCI-DSS / SOC2 / HIPAA) |
49
50
  | **Q1 2027** | `0.5.x` | HTTP/2 priorities (blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
50
51
  | **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
@@ -65,6 +66,7 @@ This roadmap covers planned features, architectural improvements, new connectors
65
66
  | ✅ | **HEAD method** — `req.head` populated with query-string and URI params. Full controller action runs so all response headers are set correctly; body is suppressed before writing to the wire. Both `render()` and `renderJSON()` honour HEAD. Routes declared as `GET` automatically accept HEAD — no extra routing rule needed. | `0.3.0` | 2026-03-31 |
66
67
  | ✅ | **Client-side components (Web Components)** — Standards-based conventions for stateful client widgets: custom elements v1, zero dependency, no build tooling. Server-rendered light-DOM authoring keeps HTML (designer) and JS (developer) separated — the behavior-only class binds its own server-rendered subtree and holds no markup strings (repeatable markup clones from a server-rendered `<template>`). Components upgrade automatically in popin/XHR-injected content with no rebinding; SEO/GEO-first (meaningful content ships in the initial server-rendered HTML). `gina view:add` scaffolds a reference component (engine partial + behavior-only class); e2e coverage locks popin auto-upgrade, strict-CSP compatibility (real nonce'd header, no `unsafe-inline`), SSR hydration from attributes + a JSON `data-*` payload, and no-JS crawler equivalence. The `gina-*` tag prefix is reserved for framework components. Form-associated custom elements participate in FormValidator — a named component exposing a `.value` getter is collected, validated, serialized into the AJAX payload, and error-rendered like a native control (client-side live-check on its composed bubbling `change`, dirty-tracking, and auto-id), so long as it declares `static formAssociated = true`, carries a `name`, and fires a composed `change` on commit. Live-data components ride the same lifecycle — open the connection in `connectedCallback`, close it in `disconnectedCallback` (popin close then tears it down automatically) — paired with `method:"ws"` routes or SSE via `renderStream()`, with per-animation-frame batching guidance for high-frequency streams; the lifecycle contract is executed against a live HTTP/2 extended-CONNECT loopback in the test suite. Dev-mode Inspector observability: the View tab carries a component census with a red undefined-components indicator (a typo'd tag or a missing definition script is no longer a silent failure), and the Events tab surfaces client-side `<tag>:<verb>` component events — metadata always, `detail` values only behind the existing `inspector.events.captureArgs` opt-in. | `0.5.15` | 2026-07-11 |
67
68
  | ✅ | **Stale built-release watch** — For LOCAL production rehearsals. A bundle serving a built release under `local` scope + a non-dev env has no hot-reload, so after you edit source it silently keeps serving the stale build. Opt in via `server.releaseWatch` in `settings.json`: the bundle watches its SOURCE tree, compares fingerprints against the manifest release stamp, and surfaces staleness on `GET /_gina/release/status` and a live `GET /_gina/release/events` SSE stream (notify mode, the default) — or auto-rebuilds on change (opt-in `auto` mode). `POST /_gina/release/rebuild` rebuilds with an **idle-gated restart** that waits on in-flight HTTP requests and `gina.registerBusyProbe` application probes, so a restart never interrupts in-flight work. Hard-gated on `local` scope + a non-dev env — never active on a real cluster. | `0.5.18-alpha` | 2026-07-16 |
69
+ | ✅ | **Popin eager preload** — Opt-in idle warming for AJAX popin content. Mark a trigger with `data-gina-dialog-preload="eager"` (case-insensitive) and the popin plugin fetches its content after `window` load, at browser idle — one trigger at a time, off the critical path — so opening feels instant with no second GET. Same safety gates as the hover/focus warm: the `"false"` opt-out and the disabled skip apply identically, and an eager warm and a hover warm coalesce into a single GET (whichever runs second is a no-op). The pass is skipped when the browser signals Save-Data. Default behavior is unchanged — hover/focus warm remains the default. | `0.5.21-alpha` | 2026-07-19 |
68
70
 
69
71
  ---
70
72
 
@@ -0,0 +1 @@
1
+ 0.5.21
@@ -6295,7 +6295,10 @@ function Routing() {
6295
6295
 
6296
6296
 
6297
6297
  if ( typeof(routing[rule]) == 'undefined' ) {
6298
- throw new Error('[ RoutingHelper::getRouting(rule, params) ] : `' +rule + '` not found !')
6298
+ // #B132 name the bundle + its table size so a degraded/near-empty
6299
+ // table (e.g. a bundle whose routing config never loaded) is
6300
+ // tellable from a plain mistyped rule at the call site.
6301
+ throw new Error('[ RoutingHelper::getRouting(rule, params) ] : `' +rule + '` not found ! (bundle `'+ bundle +'` holds '+ Object.keys(routing).length +' rules)')
6299
6302
  }
6300
6303
 
6301
6304
  var route = JSON.clone(routing[rule]);
@@ -13799,6 +13802,24 @@ function ValidatorPlugin(rules, data, formId, culture) {
13799
13802
  handleErrorsDisplay($gForm, gResult.error, gResult.data, _touchedField);
13800
13803
  }
13801
13804
  }
13805
+ // #B136 — the fresh global pass is VALID but the store still
13806
+ // holds errors from an earlier pass (e.g. a cross-field
13807
+ // comparison fixed by ANOTHER control's change: a checkbox
13808
+ // handler raising the compared field). Every stored error is
13809
+ // stale — clear each previously-errored field's display, not
13810
+ // just the touched field's, so the re-enabled submit trigger
13811
+ // never sits beside a stale blocking-error message.
13812
+ // handleErrorsDisplay's empty-errors path also prunes the
13813
+ // per-field bookkeeping; new errors are never rendered here
13814
+ // (untouched-field display still waits for interaction or
13815
+ // submit).
13816
+ else if ( isFormValid && instance.$forms[formId].errors && instance.$forms[formId].errors.count() > 0 ) {
13817
+ var staleErrors = instance.$forms[formId].errors;
13818
+ instance.$forms[formId].errors = {};
13819
+ for (var staleField in staleErrors) {
13820
+ handleErrorsDisplay($gForm, {}, null, staleField);
13821
+ }
13822
+ }
13802
13823
  // Fixed on 2025-03-16
13803
13824
  // Eg.: input select change impacting another element: solve `no more errors`
13804
13825
  else if ( instance.$forms[formId].errors && !instance.$forms[formId].errors.count() ) {
@@ -14011,7 +14032,19 @@ function ValidatorPlugin(rules, data, formId, culture) {
14011
14032
  * handleAutoComplete
14012
14033
  * This is a temporary fix to handle safari autocomplete/autosuggest
14013
14034
  * Will be removed when Safari honores autocomplete="off"
14035
+ *
14036
+ * Intercepts keydown on the field (preventDefault + a programmatic value
14037
+ * rebuild behind a transient readonly) so the browser never sees typing
14038
+ * and offers no autofill/autosuggest. Modifier chords (metaKey/ctrlKey)
14039
+ * are deliberately NOT intercepted (#B134): they return before
14040
+ * preventDefault so the native select-all/copy/paste/cut/undo defaults
14041
+ * run — the rebuild cannot reproduce them.
14042
+ *
14043
+ * Gated to REAL Safari at the registerForLiveChecking call site (#B135):
14044
+ * Chromium UAs carry the Safari token but were never this workaround's
14045
+ * target — they get native behavior.
14014
14046
  * @param {object} $el HTMLElement
14047
+ * @param {number} [liveCheckTimer] - live-check debounce handle, cleared per intercepted keystroke
14015
14048
  */
14016
14049
  var handleAutoComplete = function($el, liveCheckTimer) {
14017
14050
 
@@ -14032,6 +14065,17 @@ function ValidatorPlugin(rules, data, formId, culture) {
14032
14065
  // add once
14033
14066
  if ( typeof(gina.events[evtName]) == 'undefined' ) {
14034
14067
  addListener(gina, event.currentTarget, evtName, function(e) {
14068
+ // #B134 — modifier chords are NOT intercepted: return before
14069
+ // preventDefault so the native select-all/copy/paste/cut/undo
14070
+ // defaults run. The rebuild below cannot reproduce them — the
14071
+ // printable branch typed the chord letter into the field
14072
+ // (Cmd+A appended "a") and execCommand("paste") is inert in
14073
+ // unprivileged web content. The field is not readonly here
14074
+ // (focusin removed it), so the native edit lands and the
14075
+ // live-check picks it up on the keyup that follows.
14076
+ if ( e.metaKey || e.ctrlKey ) {
14077
+ return;
14078
+ }
14035
14079
  e.preventDefault();
14036
14080
  clearTimeout(liveCheckTimer);
14037
14081
 
@@ -14115,53 +14159,61 @@ function ValidatorPlugin(rules, data, formId, culture) {
14115
14159
  }
14116
14160
  break;
14117
14161
  // Shortcuts
14118
- case 17: // CTRL
14119
- case 91: // CMD
14120
- console.debug("CMD, CTRL hit");
14121
- e.preventDefault();
14122
- break;
14123
- case 67: // to handle CMD+C (copy)
14124
- if (
14125
- keyboardMapping[67] && keyboardMapping[91] // mac osx
14126
- ||
14127
- keyboardMapping[67] && keyboardMapping[17] // windows
14128
- ) {
14129
- $_el.setSelectionRange(posStart, posEnd);
14130
- document.execCommand("copy");
14131
- break;
14132
- }
14133
- case 86: // to handle CMD+V (paste)
14134
- if (
14135
- keyboardMapping[86] && keyboardMapping[91] // mac osx
14136
- ||
14137
- keyboardMapping[86] && keyboardMapping[17] // windows
14138
- ) {
14139
- if (posStart != posEnd) {
14140
- $_el.value = $_el.value.replace(str.substring(posStart, posEnd), '');
14141
- }
14142
- setCaretToPos($_el, posStart);
14143
- document.execCommand("paste");
14144
- break;
14145
- }
14146
- case 88: // to handle CMD+X (cut)
14147
- if (
14148
- keyboardMapping[88] && keyboardMapping[91] // mac osx
14149
- ||
14150
- keyboardMapping[88] && keyboardMapping[17] // windows
14151
- ) {
14152
- $_el.setSelectionRange(posStart, posEnd);
14153
- document.execCommand("cut");
14154
- break;
14155
- }
14156
- case 90: // to handle CMD+Z (undo)
14157
- if (
14158
- keyboardMapping[90] && keyboardMapping[91] // mac osx
14159
- ||
14160
- keyboardMapping[90] && keyboardMapping[17] // windows
14161
- ) {
14162
- $_el.value = $_el.defaultValue;
14163
- break;
14164
- }
14162
+ // #B134 the modifier-chord cases below are unreachable
14163
+ // since the e.metaKey/e.ctrlKey bail at the top of this
14164
+ // handler: chords now run natively, and the native
14165
+ // copy/cut/paste/select-all/undo defaults are correct
14166
+ // where these re-implementations were not (the paste
14167
+ // re-implementation was inert in unprivileged web
14168
+ // content, and undo-to-defaultValue wiped user input).
14169
+ // Kept commented for the record.
14170
+ // case 17: // CTRL
14171
+ // case 91: // CMD
14172
+ // console.debug("CMD, CTRL hit");
14173
+ // e.preventDefault();
14174
+ // break;
14175
+ // case 67: // to handle CMD+C (copy)
14176
+ // if (
14177
+ // keyboardMapping[67] && keyboardMapping[91] // mac osx
14178
+ // ||
14179
+ // keyboardMapping[67] && keyboardMapping[17] // windows
14180
+ // ) {
14181
+ // $_el.setSelectionRange(posStart, posEnd);
14182
+ // document.execCommand("copy");
14183
+ // break;
14184
+ // }
14185
+ // case 86: // to handle CMD+V (paste)
14186
+ // if (
14187
+ // keyboardMapping[86] && keyboardMapping[91] // mac osx
14188
+ // ||
14189
+ // keyboardMapping[86] && keyboardMapping[17] // windows
14190
+ // ) {
14191
+ // if (posStart != posEnd) {
14192
+ // $_el.value = $_el.value.replace(str.substring(posStart, posEnd), '');
14193
+ // }
14194
+ // setCaretToPos($_el, posStart);
14195
+ // document.execCommand("paste");
14196
+ // break;
14197
+ // }
14198
+ // case 88: // to handle CMD+X (cut)
14199
+ // if (
14200
+ // keyboardMapping[88] && keyboardMapping[91] // mac osx
14201
+ // ||
14202
+ // keyboardMapping[88] && keyboardMapping[17] // windows
14203
+ // ) {
14204
+ // $_el.setSelectionRange(posStart, posEnd);
14205
+ // document.execCommand("cut");
14206
+ // break;
14207
+ // }
14208
+ // case 90: // to handle CMD+Z (undo)
14209
+ // if (
14210
+ // keyboardMapping[90] && keyboardMapping[91] // mac osx
14211
+ // ||
14212
+ // keyboardMapping[90] && keyboardMapping[17] // windows
14213
+ // ) {
14214
+ // $_el.value = $_el.defaultValue;
14215
+ // break;
14216
+ // }
14165
14217
  default:
14166
14218
  // Replace selection
14167
14219
  if (e.key.length > 1) {
@@ -14230,9 +14282,17 @@ function ValidatorPlugin(rules, data, formId, culture) {
14230
14282
  addLiveForInput($form, $el, liveCheckTimer, isCustomEl);
14231
14283
  if ( !isCustomEl ) {
14232
14284
  // Bypass Safari autocomplete (native inputs only)
14285
+ // #B135 — REAL Safari only: every Chromium UA (Chrome/Edge/
14286
+ // Brave/Opera...) also carries the "Safari/537.36" token, so
14287
+ // the bare /safari/i test matched them all and ran this
14288
+ // WebKit workaround where it was never intended (see the
14289
+ // handleAutoComplete header). WebKit-on-iOS third-party
14290
+ // browsers (CriOS/FxiOS/EdgiOS — no "Chrome"/"Chromium"
14291
+ // token) stay matched on purpose: they run Safari's engine.
14233
14292
  var isAutoCompleteField = $el.getAttribute('autocomplete');
14234
14293
  if (
14235
14294
  /safari/i.test(navigator.userAgent)
14295
+ && !/chrom(e|ium)/i.test(navigator.userAgent)
14236
14296
  && isAutoCompleteField
14237
14297
  && /^(off|false)/i.test(isAutoCompleteField)
14238
14298
  ) {
@@ -15544,6 +15604,17 @@ function ValidatorPlugin(rules, data, formId, culture) {
15544
15604
  handleErrorsDisplay($gForm, gResult.error, gResult.data, _touchedField);
15545
15605
  }
15546
15606
  }
15607
+ // #B136 — same stale-clear as processEvent's global pass (keep the
15608
+ // two copies in sync): the fresh pass is valid but the store still
15609
+ // holds earlier errors — clear each previously-errored field's
15610
+ // display, not just the touched field's.
15611
+ else if ( isFormValid && instance.$forms[formId].errors && instance.$forms[formId].errors.count() > 0 ) {
15612
+ var staleErrors = instance.$forms[formId].errors;
15613
+ instance.$forms[formId].errors = {};
15614
+ for (var staleField in staleErrors) {
15615
+ handleErrorsDisplay($gForm, {}, null, staleField);
15616
+ }
15617
+ }
15547
15618
 
15548
15619
  updateSubmitTriggerState( $gForm, isFormValid);
15549
15620
  once = false;
@@ -18252,9 +18323,10 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/merge', 'utils/events' ], f
18252
18323
 
18253
18324
  /**
18254
18325
  * Module-level preload cache, keyed by URL. Warmed by the delegated
18255
- * mouseover/focusin listeners (installPreload) and consumed once at open time
18256
- * (consumePreload). Shared across popin instances so a hover-preload survives the
18257
- * subsequent click. A reserved-but-not-yet-loaded entry is `null` (in-flight).
18326
+ * mouseover/focusin listeners (installPreload) and by the opt-in idle eager
18327
+ * pass (installEagerPreload); consumed once at open time (consumePreload).
18328
+ * Shared across popin instances so a warm entry survives the subsequent
18329
+ * click. A reserved-but-not-yet-loaded entry is `null` (in-flight).
18258
18330
  *
18259
18331
  * @inner
18260
18332
  * @type {object}
@@ -18312,6 +18384,8 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/merge', 'utils/events' ], f
18312
18384
  var _ginaDialogDelegated = false;
18313
18385
  /** @inner @type {boolean} module guard — the preload listeners are installed once */
18314
18386
  var _ginaPreloadInstalled = false;
18387
+ /** @inner @type {boolean} module guard — the idle eager-preload pass is installed once */
18388
+ var _ginaEagerInstalled = false;
18315
18389
 
18316
18390
  /**
18317
18391
  * Gina Popin Handler
@@ -18797,13 +18871,21 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/merge', 'utils/events' ], f
18797
18871
  * Cross-origin URLs are left for the click-time XHR/CORS path.
18798
18872
  *
18799
18873
  * @inner
18874
+ * @param {string} url - same-origin popin content URL
18875
+ * @param {function} [onDone] - completion callback, fired on EVERY exit path
18876
+ * (cross-origin bail, cache, or decline) so a serialized caller — the
18877
+ * eager warm queue — always advances. The hover path passes none.
18800
18878
  */
18801
- function preloadFetch(url) {
18879
+ function preloadFetch(url, onDone) {
18880
+ var _preloadDone = function () {
18881
+ if ( typeof(onDone) == 'function' ) { onDone(); }
18882
+ };
18802
18883
  if (
18803
18884
  /^(http|https):/.test(url)
18804
18885
  && !new RegExp('^' + window.location.protocol + '//' + window.location.host).test(url)
18805
18886
  ) {
18806
18887
  delete preloadCache[url];
18888
+ _preloadDone();
18807
18889
  return;
18808
18890
  }
18809
18891
  var xhrPreload = new XMLHttpRequest();
@@ -18829,6 +18911,7 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/merge', 'utils/events' ], f
18829
18911
  delete preloadCache[url];
18830
18912
  for ( var _wf = 0; _wf < _waiters.length; ++_wf ) { _waiters[_wf](null); }
18831
18913
  }
18914
+ _preloadDone();
18832
18915
  }
18833
18916
  };
18834
18917
  xhrPreload.send();
@@ -18929,10 +19012,10 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/merge', 'utils/events' ], f
18929
19012
  /**
18930
19013
  * installPreload — one-time delegated `mouseover` + `focusin` listeners that warm
18931
19014
  * preloadCache for AJAX triggers (`data-gina-dialog-src` / legacy
18932
- * `data-gina-popin-url`). GET + same-origin only; disabled triggers skipped;
18933
- * repeated hover over descendants is a no-op (URL-cache dedup). A trigger whose
18934
- * GET is not safe to fire on hover/focus (server-side effects) opts out with
18935
- * `data-gina-dialog-preload="false"` honored on legacy triggers too (#B91).
19015
+ * `data-gina-popin-url`). Per-trigger gating (disabled skip, the #B91
19016
+ * `data-gina-dialog-preload="false"` opt-out, URL-cache dedup) lives in
19017
+ * warmTrigger, shared with the idle eager pass (installEagerPreload) so the
19018
+ * two warm paths can never drift.
18936
19019
  *
18937
19020
  * @inner
18938
19021
  */
@@ -18949,30 +19032,119 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/merge', 'utils/events' ], f
18949
19032
  if ( !$trigger ) {
18950
19033
  return;
18951
19034
  }
18952
- if (
18953
- $trigger.getAttribute('disabled') != null && $trigger.getAttribute('disabled') != 'false'
18954
- || $trigger.getAttribute('aria-disabled') == 'true'
18955
- ) {
18956
- return;
18957
- }
18958
- // #B91 — per-trigger preload opt-out: a trigger whose GET has server-side
18959
- // effects declares itself. Case-insensitive on purpose (a templated "False"
18960
- // must not silently fail open and fire the GET anyway); its click still
18961
- // loads normally, at click time (consumePreload -> false).
18962
- if ( /^false$/i.test($trigger.getAttribute('data-gina-dialog-preload')) ) {
18963
- return;
18964
- }
18965
- var url = $trigger.getAttribute('data-gina-dialog-src') || $trigger.getAttribute('data-gina-popin-url');
18966
- if ( !url || typeof(preloadCache[url]) != 'undefined' ) {
18967
- return; // already cached or in-flight — dedup
18968
- }
18969
- preloadCache[url] = null; // reserve in-flight slot (dedup concurrent intents)
18970
- preloadFetch(url);
19035
+ warmTrigger($trigger);
18971
19036
  };
18972
19037
  document.addEventListener('mouseover', onIntent);
18973
19038
  document.addEventListener('focusin', onIntent);
18974
19039
  }
18975
19040
 
19041
+ /**
19042
+ * warmTrigger — shared per-trigger warm gate + fetch, used by BOTH the
19043
+ * hover/focus intent path (installPreload's onIntent) and the idle eager
19044
+ * pass (installEagerPreload). Gates, in order: the disabled/aria-disabled
19045
+ * skip, the #B91 `data-gina-dialog-preload="false"` opt-out
19046
+ * (case-insensitive), URL resolution, the already-cached/in-flight dedup —
19047
+ * then the in-flight slot reserve + GET. Keeping the gates in ONE place is
19048
+ * the point: a future gate change cannot land in one warm path and miss
19049
+ * the other.
19050
+ *
19051
+ * `onDone` (optional) fires on EVERY exit path — gate skip or fetch
19052
+ * completion — so a serialized caller (the eager queue) always advances.
19053
+ * The hover path passes none.
19054
+ *
19055
+ * @inner
19056
+ * @param {object} $trigger - the matched trigger element
19057
+ * @param {function} [onDone]
19058
+ */
19059
+ function warmTrigger($trigger, onDone) {
19060
+ var _warmDone = function () {
19061
+ if ( typeof(onDone) == 'function' ) { onDone(); }
19062
+ };
19063
+ if (
19064
+ $trigger.getAttribute('disabled') != null && $trigger.getAttribute('disabled') != 'false'
19065
+ || $trigger.getAttribute('aria-disabled') == 'true'
19066
+ ) {
19067
+ _warmDone();
19068
+ return;
19069
+ }
19070
+ // #B91 — per-trigger preload opt-out: a trigger whose GET has server-side
19071
+ // effects declares itself. Case-insensitive on purpose (a templated "False"
19072
+ // must not silently fail open and fire the GET anyway); its click still
19073
+ // loads normally, at click time (consumePreload -> false).
19074
+ if ( /^false$/i.test($trigger.getAttribute('data-gina-dialog-preload')) ) {
19075
+ _warmDone();
19076
+ return;
19077
+ }
19078
+ var url = $trigger.getAttribute('data-gina-dialog-src') || $trigger.getAttribute('data-gina-popin-url');
19079
+ if ( !url || typeof(preloadCache[url]) != 'undefined' ) {
19080
+ _warmDone();
19081
+ return; // already cached or in-flight — dedup
19082
+ }
19083
+ preloadCache[url] = null; // reserve in-flight slot (dedup concurrent intents)
19084
+ preloadFetch(url, onDone);
19085
+ }
19086
+
19087
+ /**
19088
+ * installEagerPreload — one-time idle warm-all pass for triggers that opt
19089
+ * in with `data-gina-dialog-preload="eager"` (case-insensitive). Runs off
19090
+ * the critical path by construction: waits for `window` load, then
19091
+ * schedules on requestIdleCallback (setTimeout fallback — load-bearing for
19092
+ * browsers without rIC), and warms the opted-in triggers ONE AT A TIME
19093
+ * through the same warmTrigger gate as the hover path — so the #B91
19094
+ * `"false"` opt-out, the disabled skip, and the cache dedup (an eager warm
19095
+ * and a hover warm coalesce into one GET) all apply identically. Skipped
19096
+ * entirely when the browser signals Save-Data.
19097
+ *
19098
+ * One-shot: triggers injected after the pass are not re-scanned — the
19099
+ * delegated hover/focus warm covers them. Content staleness matches the
19100
+ * shipped hover-warm semantics (no TTL): the cache entry lives until
19101
+ * consumed, declined, or page unload — a trigger opts into that window by
19102
+ * declaring `eager`.
19103
+ *
19104
+ * @inner
19105
+ */
19106
+ function installEagerPreload() {
19107
+ if ( _ginaEagerInstalled ) {
19108
+ return;
19109
+ }
19110
+ _ginaEagerInstalled = true;
19111
+ // Respect the user's reduced-data preference — no speculative warm at all.
19112
+ if ( typeof(navigator) != 'undefined' && navigator.connection && navigator.connection.saveData ) {
19113
+ return;
19114
+ }
19115
+ var run = function () {
19116
+ var $candidates = document.querySelectorAll('[data-gina-dialog-src],[data-gina-popin-url]');
19117
+ var queue = [];
19118
+ for (var c = 0, cLen = $candidates.length; c < cLen; ++c) {
19119
+ if ( /^eager$/i.test($candidates[c].getAttribute('data-gina-dialog-preload')) ) {
19120
+ queue.push($candidates[c]);
19121
+ }
19122
+ }
19123
+ // Serialized: each warm starts only when the previous one finished
19124
+ // (or was gate-skipped) — N eager popins never burst N parallel GETs.
19125
+ var next = function () {
19126
+ var $trigger = queue.shift();
19127
+ if ( !$trigger ) {
19128
+ return;
19129
+ }
19130
+ warmTrigger($trigger, next);
19131
+ };
19132
+ next();
19133
+ };
19134
+ var schedule = function () {
19135
+ if ( typeof(window.requestIdleCallback) == 'function' ) {
19136
+ window.requestIdleCallback(run);
19137
+ } else {
19138
+ setTimeout(run, 1500);
19139
+ }
19140
+ };
19141
+ if ( document.readyState == 'complete' ) {
19142
+ schedule();
19143
+ } else {
19144
+ window.addEventListener('load', schedule, { once: true });
19145
+ }
19146
+ }
19147
+
18976
19148
  /**
18977
19149
  * openInPageDialog
18978
19150
  *
@@ -20924,9 +21096,12 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/merge', 'utils/events' ], f
20924
21096
 
20925
21097
  // New `data-gina-dialog-*` entry layer — install the delegated open + preload
20926
21098
  // listeners once per page (module-guarded). Additive to the legacy bindOpen
20927
- // scan (which registerPopin still runs per popin).
21099
+ // scan (which registerPopin still runs per popin). The eager pass warms
21100
+ // `data-gina-dialog-preload="eager"` triggers off the critical path
21101
+ // (post-load idle) through the same warmTrigger gate.
20928
21102
  bindDelegatedOpen();
20929
21103
  installPreload();
21104
+ installEagerPreload();
20930
21105
  //instance.on('init', function(event) {
20931
21106
  addListener(gina, instance.target, 'init.'+instance.id, function(e) {
20932
21107