gina 0.6.4 → 0.6.5

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 (567) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/CONTRIBUTING.md +23 -3
  3. package/README.md +36 -34
  4. package/ROADMAP.md +1 -0
  5. package/framework/v0.6.5/VERSION +1 -0
  6. package/framework/v0.6.5/core/asset/plugin/dist/vendor/gina/css/gina.min.css +1 -0
  7. package/framework/v0.6.5/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  8. package/framework/v0.6.5/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  9. package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +29 -3
  10. package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/js/gina.js +715 -131
  11. package/framework/v0.6.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js +643 -0
  12. package/framework/v0.6.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  13. package/framework/v0.6.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  14. package/framework/{v0.6.4 → v0.6.5}/core/connectors/duckdb/lib/connector.js +3 -3
  15. package/framework/{v0.6.4 → v0.6.5}/core/connectors/sqlite/lib/connector.js +3 -3
  16. package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.js +30 -3
  17. package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/validator/src/form-validator.js +10 -2
  18. package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/validator/src/main.js +285 -93
  19. package/framework/{v0.6.4 → v0.6.5}/lib/loading-state/src/main.js +4 -5
  20. package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/containers/mq/speaker.js +29 -0
  21. package/framework/{v0.6.4 → v0.6.5}/package.json +1 -1
  22. package/gna.js +4 -4
  23. package/llms.txt +8 -8
  24. package/package.json +6 -4
  25. package/playwright.config.js +32 -7
  26. package/schema/connectors.json +1 -1
  27. package/framework/v0.6.4/VERSION +0 -1
  28. package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -1
  29. package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  30. package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  31. package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -640
  32. package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  33. package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  34. /package/framework/{v0.6.4 → v0.6.5}/AUTHORS +0 -0
  35. /package/framework/{v0.6.4 → v0.6.5}/LICENSE +0 -0
  36. /package/framework/{v0.6.4 → v0.6.5}/core/asset/html/nolayout.html +0 -0
  37. /package/framework/{v0.6.4 → v0.6.5}/core/asset/html/static.html +0 -0
  38. /package/framework/{v0.6.4 → v0.6.5}/core/asset/img/android-chrome-192x192.png +0 -0
  39. /package/framework/{v0.6.4 → v0.6.5}/core/asset/img/android-chrome-512x512.png +0 -0
  40. /package/framework/{v0.6.4 → v0.6.5}/core/asset/img/apple-touch-icon.png +0 -0
  41. /package/framework/{v0.6.4 → v0.6.5}/core/asset/img/favicon-16x16.png +0 -0
  42. /package/framework/{v0.6.4 → v0.6.5}/core/asset/img/favicon-32x32.png +0 -0
  43. /package/framework/{v0.6.4 → v0.6.5}/core/asset/img/favicon.ico +0 -0
  44. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/README.md +0 -0
  45. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  46. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  47. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  48. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  49. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  50. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  51. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  52. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  53. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  54. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  55. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  56. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  57. /package/framework/{v0.6.4 → v0.6.5}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  58. /package/framework/{v0.6.4 → v0.6.5}/core/config.js +0 -0
  59. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/ai/index.js +0 -0
  60. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/ai/lib/connector.js +0 -0
  61. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/index.js +0 -0
  62. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/lib/connector.js +0 -0
  63. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  64. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  65. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/lib/n1ql.js +0 -0
  66. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/lib/session-store.js +0 -0
  67. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  68. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  69. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/duckdb/index.js +0 -0
  70. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/mongodb/index.js +0 -0
  71. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/mongodb/lib/connector.js +0 -0
  72. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/mongodb/lib/job-store.js +0 -0
  73. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  74. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/mongodb/lib/session-store.js +0 -0
  75. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/mysql/index.js +0 -0
  76. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/mysql/lib/connector.js +0 -0
  77. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/postgresql/index.js +0 -0
  78. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/postgresql/lib/connector.js +0 -0
  79. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/redis/index.js +0 -0
  80. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/redis/lib/connector.js +0 -0
  81. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/redis/lib/job-store.js +0 -0
  82. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/redis/lib/render-cache-store.js +0 -0
  83. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/redis/lib/session-store.js +0 -0
  84. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/scylladb/index.js +0 -0
  85. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/scylladb/lib/connector.js +0 -0
  86. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/scylladb/lib/session-store.js +0 -0
  87. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/sql-parser.js +0 -0
  88. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/sqlite/index.js +0 -0
  89. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/sqlite/lib/job-store.js +0 -0
  90. /package/framework/{v0.6.4 → v0.6.5}/core/connectors/sqlite/lib/session-store.js +0 -0
  91. /package/framework/{v0.6.4 → v0.6.5}/core/content.encoding +0 -0
  92. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.framework.js +0 -0
  93. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.render-json.js +0 -0
  94. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.render-nunjucks-async.js +0 -0
  95. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.render-nunjucks.js +0 -0
  96. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.render-stream.js +0 -0
  97. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.render-swig-async.js +0 -0
  98. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.render-swig.js +0 -0
  99. /package/framework/{v0.6.4 → v0.6.5}/core/controller/controller.render-v1.js +0 -0
  100. /package/framework/{v0.6.4 → v0.6.5}/core/controller/index.js +0 -0
  101. /package/framework/{v0.6.4 → v0.6.5}/core/controller/inspector-window-emit.js +0 -0
  102. /package/framework/{v0.6.4 → v0.6.5}/core/controller/release-banner.js +0 -0
  103. /package/framework/{v0.6.4 → v0.6.5}/core/dev/index.js +0 -0
  104. /package/framework/{v0.6.4 → v0.6.5}/core/dev/lib/class.js +0 -0
  105. /package/framework/{v0.6.4 → v0.6.5}/core/dev/lib/factory.js +0 -0
  106. /package/framework/{v0.6.4 → v0.6.5}/core/dev/lib/tools.js +0 -0
  107. /package/framework/{v0.6.4 → v0.6.5}/core/gna.js +0 -0
  108. /package/framework/{v0.6.4 → v0.6.5}/core/locales/README.md +0 -0
  109. /package/framework/{v0.6.4 → v0.6.5}/core/locales/currency.json +0 -0
  110. /package/framework/{v0.6.4 → v0.6.5}/core/locales/dist/language/en.json +0 -0
  111. /package/framework/{v0.6.4 → v0.6.5}/core/locales/dist/language/fr.json +0 -0
  112. /package/framework/{v0.6.4 → v0.6.5}/core/locales/dist/region/en.json +0 -0
  113. /package/framework/{v0.6.4 → v0.6.5}/core/locales/dist/region/fr.json +0 -0
  114. /package/framework/{v0.6.4 → v0.6.5}/core/locales/index.js +0 -0
  115. /package/framework/{v0.6.4 → v0.6.5}/core/mime.types +0 -0
  116. /package/framework/{v0.6.4 → v0.6.5}/core/model/entity.js +0 -0
  117. /package/framework/{v0.6.4 → v0.6.5}/core/model/index.js +0 -0
  118. /package/framework/{v0.6.4 → v0.6.5}/core/model/template/entityFactory.js +0 -0
  119. /package/framework/{v0.6.4 → v0.6.5}/core/model/template/index.js +0 -0
  120. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/README.md +0 -0
  121. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/index.js +0 -0
  122. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/csrf/README.md +0 -0
  123. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/csrf/package.json +0 -0
  124. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/csrf/src/main.js +0 -0
  125. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/README.md +0 -0
  126. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/coep/README.md +0 -0
  127. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/coep/package.json +0 -0
  128. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  129. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/coop/README.md +0 -0
  130. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/coop/package.json +0 -0
  131. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  132. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/corp/README.md +0 -0
  133. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/corp/package.json +0 -0
  134. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  135. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/csp/README.md +0 -0
  136. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/csp/package.json +0 -0
  137. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  138. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  139. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  140. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  141. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  142. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  143. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  144. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  145. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  146. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  147. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/package.json +0 -0
  148. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  149. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  150. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  151. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/src/main.js +0 -0
  152. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  153. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  154. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  155. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  156. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  157. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  158. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  159. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  160. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  161. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  162. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  163. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  164. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  165. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  166. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  167. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  168. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  169. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  170. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/session/README.md +0 -0
  171. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/session/package.json +0 -0
  172. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/session/src/main.js +0 -0
  173. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/storage/README.md +0 -0
  174. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/storage/build.json +0 -0
  175. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/storage/package.json +0 -0
  176. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/storage/src/main.js +0 -0
  177. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/validator/README.md +0 -0
  178. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/validator/build.json +0 -0
  179. /package/framework/{v0.6.4 → v0.6.5}/core/plugins/lib/validator/package.json +0 -0
  180. /package/framework/{v0.6.4 → v0.6.5}/core/router.js +0 -0
  181. /package/framework/{v0.6.4 → v0.6.5}/core/server.express.js +0 -0
  182. /package/framework/{v0.6.4 → v0.6.5}/core/server.isaac.js +0 -0
  183. /package/framework/{v0.6.4 → v0.6.5}/core/server.js +0 -0
  184. /package/framework/{v0.6.4 → v0.6.5}/core/status.codes +0 -0
  185. /package/framework/{v0.6.4 → v0.6.5}/core/template/_gitignore +0 -0
  186. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/config/app.json +0 -0
  187. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  188. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/config/routing.json +0 -0
  189. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/config/settings.json +0 -0
  190. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  191. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/config/templates.json +0 -0
  192. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  193. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  194. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  195. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  196. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/index.js +0 -0
  197. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle/locales/en.json +0 -0
  198. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  199. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  200. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  201. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  202. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  203. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  204. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  205. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  206. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/readme.md +0 -0
  207. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_public/sw.js +0 -0
  208. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  209. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  210. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  211. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  212. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  213. /package/framework/{v0.6.4 → v0.6.5}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  214. /package/framework/{v0.6.4 → v0.6.5}/core/template/command/gina.bat.tpl +0 -0
  215. /package/framework/{v0.6.4 → v0.6.5}/core/template/command/gina.tpl +0 -0
  216. /package/framework/{v0.6.4 → v0.6.5}/core/template/conf/env.json +0 -0
  217. /package/framework/{v0.6.4 → v0.6.5}/core/template/conf/manifest.json +0 -0
  218. /package/framework/{v0.6.4 → v0.6.5}/core/template/conf/package.json +0 -0
  219. /package/framework/{v0.6.4 → v0.6.5}/core/template/conf/settings.json +0 -0
  220. /package/framework/{v0.6.4 → v0.6.5}/core/template/conf/statics.json +0 -0
  221. /package/framework/{v0.6.4 → v0.6.5}/core/template/conf/templates.json +0 -0
  222. /package/framework/{v0.6.4 → v0.6.5}/core/template/error/client/json/401.json +0 -0
  223. /package/framework/{v0.6.4 → v0.6.5}/core/template/error/client/json/403.json +0 -0
  224. /package/framework/{v0.6.4 → v0.6.5}/core/template/error/client/json/404.json +0 -0
  225. /package/framework/{v0.6.4 → v0.6.5}/core/template/error/server/html/50x.html +0 -0
  226. /package/framework/{v0.6.4 → v0.6.5}/core/template/error/server/json/500.json +0 -0
  227. /package/framework/{v0.6.4 → v0.6.5}/core/template/error/server/json/503.json +0 -0
  228. /package/framework/{v0.6.4 → v0.6.5}/core/template/extensions/logger/config.json +0 -0
  229. /package/framework/{v0.6.4 → v0.6.5}/helpers/console.js +0 -0
  230. /package/framework/{v0.6.4 → v0.6.5}/helpers/context.js +0 -0
  231. /package/framework/{v0.6.4 → v0.6.5}/helpers/data/LICENSE +0 -0
  232. /package/framework/{v0.6.4 → v0.6.5}/helpers/data/README.md +0 -0
  233. /package/framework/{v0.6.4 → v0.6.5}/helpers/data/package.json +0 -0
  234. /package/framework/{v0.6.4 → v0.6.5}/helpers/data/src/main.js +0 -0
  235. /package/framework/{v0.6.4 → v0.6.5}/helpers/dateFormat.js +0 -0
  236. /package/framework/{v0.6.4 → v0.6.5}/helpers/index.js +0 -0
  237. /package/framework/{v0.6.4 → v0.6.5}/helpers/json/LICENSE +0 -0
  238. /package/framework/{v0.6.4 → v0.6.5}/helpers/json/README.md +0 -0
  239. /package/framework/{v0.6.4 → v0.6.5}/helpers/json/package.json +0 -0
  240. /package/framework/{v0.6.4 → v0.6.5}/helpers/json/src/main.js +0 -0
  241. /package/framework/{v0.6.4 → v0.6.5}/helpers/path.js +0 -0
  242. /package/framework/{v0.6.4 → v0.6.5}/helpers/plugins/README.md +0 -0
  243. /package/framework/{v0.6.4 → v0.6.5}/helpers/plugins/package.json +0 -0
  244. /package/framework/{v0.6.4 → v0.6.5}/helpers/plugins/src/api-error.js +0 -0
  245. /package/framework/{v0.6.4 → v0.6.5}/helpers/plugins/src/main.js +0 -0
  246. /package/framework/{v0.6.4 → v0.6.5}/helpers/prototypes.js +0 -0
  247. /package/framework/{v0.6.4 → v0.6.5}/helpers/task.js +0 -0
  248. /package/framework/{v0.6.4 → v0.6.5}/helpers/text.js +0 -0
  249. /package/framework/{v0.6.4 → v0.6.5}/lib/admin/package.json +0 -0
  250. /package/framework/{v0.6.4 → v0.6.5}/lib/admin/src/main.js +0 -0
  251. /package/framework/{v0.6.4 → v0.6.5}/lib/archiver/README.md +0 -0
  252. /package/framework/{v0.6.4 → v0.6.5}/lib/archiver/build.json +0 -0
  253. /package/framework/{v0.6.4 → v0.6.5}/lib/archiver/package.json +0 -0
  254. /package/framework/{v0.6.4 → v0.6.5}/lib/archiver/src/dep/jszip.min.js +0 -0
  255. /package/framework/{v0.6.4 → v0.6.5}/lib/archiver/src/main.js +0 -0
  256. /package/framework/{v0.6.4 → v0.6.5}/lib/async/package.json +0 -0
  257. /package/framework/{v0.6.4 → v0.6.5}/lib/async/src/main.js +0 -0
  258. /package/framework/{v0.6.4 → v0.6.5}/lib/audit/package.json +0 -0
  259. /package/framework/{v0.6.4 → v0.6.5}/lib/audit/src/main.js +0 -0
  260. /package/framework/{v0.6.4 → v0.6.5}/lib/audit-store.js +0 -0
  261. /package/framework/{v0.6.4 → v0.6.5}/lib/authn/package.json +0 -0
  262. /package/framework/{v0.6.4 → v0.6.5}/lib/authn/src/lockout.js +0 -0
  263. /package/framework/{v0.6.4 → v0.6.5}/lib/authn/src/main.js +0 -0
  264. /package/framework/{v0.6.4 → v0.6.5}/lib/authn/src/totp.js +0 -0
  265. /package/framework/{v0.6.4 → v0.6.5}/lib/authz-gate/package.json +0 -0
  266. /package/framework/{v0.6.4 → v0.6.5}/lib/authz-gate/src/main.js +0 -0
  267. /package/framework/{v0.6.4 → v0.6.5}/lib/cache/README.md +0 -0
  268. /package/framework/{v0.6.4 → v0.6.5}/lib/cache/build.json +0 -0
  269. /package/framework/{v0.6.4 → v0.6.5}/lib/cache/package.json +0 -0
  270. /package/framework/{v0.6.4 → v0.6.5}/lib/cache/src/main.js +0 -0
  271. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/aliases.json +0 -0
  272. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/audit/arguments.json +0 -0
  273. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/audit/help.txt +0 -0
  274. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/audit/verify.js +0 -0
  275. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/add.js +0 -0
  276. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/arguments.json +0 -0
  277. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/build.js +0 -0
  278. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/copy.js +0 -0
  279. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/cp.js +0 -0
  280. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/help.js +0 -0
  281. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/help.txt +0 -0
  282. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  283. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/list.js +0 -0
  284. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/man.js +0 -0
  285. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/mcp-start.js +0 -0
  286. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/mcp.js +0 -0
  287. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/oas.js +0 -0
  288. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/openapi.js +0 -0
  289. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/remove.js +0 -0
  290. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/rename.js +0 -0
  291. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/restart.js +0 -0
  292. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/rm.js +0 -0
  293. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/start.js +0 -0
  294. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/status.js +0 -0
  295. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/stop.js +0 -0
  296. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/bundle/types.js +0 -0
  297. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/cache/arguments.json +0 -0
  298. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/cache/clear.js +0 -0
  299. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/cache/help.txt +0 -0
  300. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/cache/stats.js +0 -0
  301. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/add.js +0 -0
  302. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/arguments.json +0 -0
  303. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/help.js +0 -0
  304. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/help.txt +0 -0
  305. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/infer.js +0 -0
  306. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/list.js +0 -0
  307. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/migrate.js +0 -0
  308. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/models.js +0 -0
  309. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/remove.js +0 -0
  310. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/rm.js +0 -0
  311. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/connector/test.js +0 -0
  312. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/container/arguments.json +0 -0
  313. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/container/help.js +0 -0
  314. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/container/help.txt +0 -0
  315. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/container/man.js +0 -0
  316. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/container/ps.js +0 -0
  317. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/container/stop.js +0 -0
  318. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/add.js +0 -0
  319. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/arguments.json +0 -0
  320. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/help.txt +0 -0
  321. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/inc/args.js +0 -0
  322. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/inc/namespace.js +0 -0
  323. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  324. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/inc/reference-scan.js +0 -0
  325. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/inc/scaffold.js +0 -0
  326. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/remove.js +0 -0
  327. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/rename.js +0 -0
  328. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/controller/rm.js +0 -0
  329. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/add.js +0 -0
  330. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/get.js +0 -0
  331. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/help.js +0 -0
  332. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/help.txt +0 -0
  333. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/link-dev.js +0 -0
  334. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/list.js +0 -0
  335. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/remove.js +0 -0
  336. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/rm.js +0 -0
  337. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/set.js +0 -0
  338. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/unset.js +0 -0
  339. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/env/use.js +0 -0
  340. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/add.js +0 -0
  341. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/arguments.json +0 -0
  342. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/build.js +0 -0
  343. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/dot.js +0 -0
  344. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/get.js +0 -0
  345. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/help.js +0 -0
  346. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/help.txt +0 -0
  347. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/init.js +0 -0
  348. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/link-node-modules.js +0 -0
  349. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/link.js +0 -0
  350. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/list.js +0 -0
  351. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/man.js +0 -0
  352. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/msg.json +0 -0
  353. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/open.js +0 -0
  354. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/remove.js +0 -0
  355. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/reset.js +0 -0
  356. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/restart.js +0 -0
  357. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/set.js +0 -0
  358. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/start.js +0 -0
  359. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/status.js +0 -0
  360. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/stop.js +0 -0
  361. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/tail.js +0 -0
  362. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/update.js +0 -0
  363. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/framework/version.js +0 -0
  364. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/gina-dev.1.md +0 -0
  365. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/gina-framework.1.md +0 -0
  366. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/gina.1.md +0 -0
  367. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/helper.js +0 -0
  368. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/i18n/add.js +0 -0
  369. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/i18n/arguments.json +0 -0
  370. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/i18n/export.js +0 -0
  371. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/i18n/help.js +0 -0
  372. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/i18n/help.txt +0 -0
  373. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/i18n/import.js +0 -0
  374. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/i18n/scan.js +0 -0
  375. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/_host.js +0 -0
  376. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/arguments.json +0 -0
  377. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/build.js +0 -0
  378. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/help.js +0 -0
  379. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/help.txt +0 -0
  380. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/list.js +0 -0
  381. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/man.js +0 -0
  382. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/rm.js +0 -0
  383. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/image/run.js +0 -0
  384. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/index.js +0 -0
  385. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/inspector/help.js +0 -0
  386. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/inspector/help.txt +0 -0
  387. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/inspector/open.js +0 -0
  388. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/man-render.js +0 -0
  389. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/minion/arguments.json +0 -0
  390. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/minion/help.js +0 -0
  391. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/minion/help.txt +0 -0
  392. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/minion/kill.js +0 -0
  393. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/minion/list.js +0 -0
  394. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/msg.json +0 -0
  395. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/port/help.js +0 -0
  396. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/port/help.txt +0 -0
  397. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/port/inc/scan.js +0 -0
  398. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/port/list.js +0 -0
  399. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/port/reset.js +0 -0
  400. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/port/set.js +0 -0
  401. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/add.js +0 -0
  402. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/arguments.json +0 -0
  403. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/backup.js +0 -0
  404. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/build.js +0 -0
  405. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/help.js +0 -0
  406. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/help.txt +0 -0
  407. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/import.js +0 -0
  408. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/list.js +0 -0
  409. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/man.js +0 -0
  410. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/move.js +0 -0
  411. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/remove.js +0 -0
  412. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/rename.js +0 -0
  413. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/restart.js +0 -0
  414. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/restore.js +0 -0
  415. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/rm.js +0 -0
  416. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/start.js +0 -0
  417. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/status.js +0 -0
  418. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/project/stop.js +0 -0
  419. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/protocol/arguments.json +0 -0
  420. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/protocol/help.js +0 -0
  421. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/protocol/help.txt +0 -0
  422. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/protocol/list.js +0 -0
  423. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/protocol/remove.js +0 -0
  424. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/protocol/set.js +0 -0
  425. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/add.js +0 -0
  426. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/help.js +0 -0
  427. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/help.txt +0 -0
  428. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/link-local.js +0 -0
  429. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/link-production.js +0 -0
  430. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/list.js +0 -0
  431. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/remove.js +0 -0
  432. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/rm.js +0 -0
  433. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/scope/use.js +0 -0
  434. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/secrets/arguments.json +0 -0
  435. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/secrets/check.js +0 -0
  436. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/secrets/help.js +0 -0
  437. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/secrets/help.txt +0 -0
  438. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/secrets/scan.js +0 -0
  439. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/service/help.js +0 -0
  440. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/service/help.txt +0 -0
  441. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/service/list.js +0 -0
  442. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/service/man.js +0 -0
  443. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/service/start.js +0 -0
  444. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd/view/add.js +0 -0
  445. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd-status-format/package.json +0 -0
  446. /package/framework/{v0.6.4 → v0.6.5}/lib/cmd-status-format/src/main.js +0 -0
  447. /package/framework/{v0.6.4 → v0.6.5}/lib/collection/README.md +0 -0
  448. /package/framework/{v0.6.4 → v0.6.5}/lib/collection/build.json +0 -0
  449. /package/framework/{v0.6.4 → v0.6.5}/lib/collection/package.json +0 -0
  450. /package/framework/{v0.6.4 → v0.6.5}/lib/collection/src/main.js +0 -0
  451. /package/framework/{v0.6.4 → v0.6.5}/lib/config.js +0 -0
  452. /package/framework/{v0.6.4 → v0.6.5}/lib/connector-config/package.json +0 -0
  453. /package/framework/{v0.6.4 → v0.6.5}/lib/connector-config/src/main.js +0 -0
  454. /package/framework/{v0.6.4 → v0.6.5}/lib/connector-error/package.json +0 -0
  455. /package/framework/{v0.6.4 → v0.6.5}/lib/connector-error/src/main.js +0 -0
  456. /package/framework/{v0.6.4 → v0.6.5}/lib/connector-registry/package.json +0 -0
  457. /package/framework/{v0.6.4 → v0.6.5}/lib/connector-registry/src/main.js +0 -0
  458. /package/framework/{v0.6.4 → v0.6.5}/lib/cron/README.md +0 -0
  459. /package/framework/{v0.6.4 → v0.6.5}/lib/cron/package.json +0 -0
  460. /package/framework/{v0.6.4 → v0.6.5}/lib/cron/src/main.js +0 -0
  461. /package/framework/{v0.6.4 → v0.6.5}/lib/domain/LICENSE +0 -0
  462. /package/framework/{v0.6.4 → v0.6.5}/lib/domain/README.md +0 -0
  463. /package/framework/{v0.6.4 → v0.6.5}/lib/domain/package.json +0 -0
  464. /package/framework/{v0.6.4 → v0.6.5}/lib/domain/src/main.js +0 -0
  465. /package/framework/{v0.6.4 → v0.6.5}/lib/dto/package.json +0 -0
  466. /package/framework/{v0.6.4 → v0.6.5}/lib/dto/src/main.js +0 -0
  467. /package/framework/{v0.6.4 → v0.6.5}/lib/dto-pipe/package.json +0 -0
  468. /package/framework/{v0.6.4 → v0.6.5}/lib/dto-pipe/src/main.js +0 -0
  469. /package/framework/{v0.6.4 → v0.6.5}/lib/dto-types/package.json +0 -0
  470. /package/framework/{v0.6.4 → v0.6.5}/lib/dto-types/src/main.js +0 -0
  471. /package/framework/{v0.6.4 → v0.6.5}/lib/generator/index.js +0 -0
  472. /package/framework/{v0.6.4 → v0.6.5}/lib/i18n/package.json +0 -0
  473. /package/framework/{v0.6.4 → v0.6.5}/lib/i18n/src/main.js +0 -0
  474. /package/framework/{v0.6.4 → v0.6.5}/lib/image-build/package.json +0 -0
  475. /package/framework/{v0.6.4 → v0.6.5}/lib/image-build/src/main.js +0 -0
  476. /package/framework/{v0.6.4 → v0.6.5}/lib/index.js +0 -0
  477. /package/framework/{v0.6.4 → v0.6.5}/lib/inherits/LICENSE +0 -0
  478. /package/framework/{v0.6.4 → v0.6.5}/lib/inherits/README.md +0 -0
  479. /package/framework/{v0.6.4 → v0.6.5}/lib/inherits/package.json +0 -0
  480. /package/framework/{v0.6.4 → v0.6.5}/lib/inherits/src/main.js +0 -0
  481. /package/framework/{v0.6.4 → v0.6.5}/lib/inspector-events/package.json +0 -0
  482. /package/framework/{v0.6.4 → v0.6.5}/lib/inspector-events/src/main.js +0 -0
  483. /package/framework/{v0.6.4 → v0.6.5}/lib/inspector-redact/package.json +0 -0
  484. /package/framework/{v0.6.4 → v0.6.5}/lib/inspector-redact/src/main.js +0 -0
  485. /package/framework/{v0.6.4 → v0.6.5}/lib/instrument/package.json +0 -0
  486. /package/framework/{v0.6.4 → v0.6.5}/lib/instrument/src/main.js +0 -0
  487. /package/framework/{v0.6.4 → v0.6.5}/lib/job/package.json +0 -0
  488. /package/framework/{v0.6.4 → v0.6.5}/lib/job/src/main.js +0 -0
  489. /package/framework/{v0.6.4 → v0.6.5}/lib/job-store.js +0 -0
  490. /package/framework/{v0.6.4 → v0.6.5}/lib/json-config-header/package.json +0 -0
  491. /package/framework/{v0.6.4 → v0.6.5}/lib/json-config-header/src/main.js +0 -0
  492. /package/framework/{v0.6.4 → v0.6.5}/lib/loading-state/package.json +0 -0
  493. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/README.md +0 -0
  494. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/package.json +0 -0
  495. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/containers/default/index.js +0 -0
  496. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/containers/file/index.js +0 -0
  497. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  498. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  499. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/containers/mq/index.js +0 -0
  500. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/containers/mq/listener.js +0 -0
  501. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/helper.js +0 -0
  502. /package/framework/{v0.6.4 → v0.6.5}/lib/logger/src/main.js +0 -0
  503. /package/framework/{v0.6.4 → v0.6.5}/lib/math/index.js +0 -0
  504. /package/framework/{v0.6.4 → v0.6.5}/lib/mcp-dispatch/package.json +0 -0
  505. /package/framework/{v0.6.4 → v0.6.5}/lib/mcp-dispatch/src/main.js +0 -0
  506. /package/framework/{v0.6.4 → v0.6.5}/lib/mcp-http/package.json +0 -0
  507. /package/framework/{v0.6.4 → v0.6.5}/lib/mcp-http/src/main.js +0 -0
  508. /package/framework/{v0.6.4 → v0.6.5}/lib/mcp-server/package.json +0 -0
  509. /package/framework/{v0.6.4 → v0.6.5}/lib/mcp-server/src/main.js +0 -0
  510. /package/framework/{v0.6.4 → v0.6.5}/lib/merge/README.md +0 -0
  511. /package/framework/{v0.6.4 → v0.6.5}/lib/merge/package.json +0 -0
  512. /package/framework/{v0.6.4 → v0.6.5}/lib/merge/src/main.js +0 -0
  513. /package/framework/{v0.6.4 → v0.6.5}/lib/metrics/package.json +0 -0
  514. /package/framework/{v0.6.4 → v0.6.5}/lib/metrics/src/main.js +0 -0
  515. /package/framework/{v0.6.4 → v0.6.5}/lib/model.js +0 -0
  516. /package/framework/{v0.6.4 → v0.6.5}/lib/net-locality/package.json +0 -0
  517. /package/framework/{v0.6.4 → v0.6.5}/lib/net-locality/src/main.js +0 -0
  518. /package/framework/{v0.6.4 → v0.6.5}/lib/nunjucks-filters/README.md +0 -0
  519. /package/framework/{v0.6.4 → v0.6.5}/lib/nunjucks-filters/package.json +0 -0
  520. /package/framework/{v0.6.4 → v0.6.5}/lib/nunjucks-filters/src/main.js +0 -0
  521. /package/framework/{v0.6.4 → v0.6.5}/lib/nunjucks-resolver/package.json +0 -0
  522. /package/framework/{v0.6.4 → v0.6.5}/lib/nunjucks-resolver/src/main.js +0 -0
  523. /package/framework/{v0.6.4 → v0.6.5}/lib/proc.js +0 -0
  524. /package/framework/{v0.6.4 → v0.6.5}/lib/release-watch/package.json +0 -0
  525. /package/framework/{v0.6.4 → v0.6.5}/lib/release-watch/src/main.js +0 -0
  526. /package/framework/{v0.6.4 → v0.6.5}/lib/render-cache/package.json +0 -0
  527. /package/framework/{v0.6.4 → v0.6.5}/lib/render-cache/src/main.js +0 -0
  528. /package/framework/{v0.6.4 → v0.6.5}/lib/render-cache-store.js +0 -0
  529. /package/framework/{v0.6.4 → v0.6.5}/lib/routing/README.md +0 -0
  530. /package/framework/{v0.6.4 → v0.6.5}/lib/routing/build.json +0 -0
  531. /package/framework/{v0.6.4 → v0.6.5}/lib/routing/package.json +0 -0
  532. /package/framework/{v0.6.4 → v0.6.5}/lib/routing/src/main.js +0 -0
  533. /package/framework/{v0.6.4 → v0.6.5}/lib/routing/src/radix.js +0 -0
  534. /package/framework/{v0.6.4 → v0.6.5}/lib/routing-introspect/package.json +0 -0
  535. /package/framework/{v0.6.4 → v0.6.5}/lib/routing-introspect/src/main.js +0 -0
  536. /package/framework/{v0.6.4 → v0.6.5}/lib/secrets/package.json +0 -0
  537. /package/framework/{v0.6.4 → v0.6.5}/lib/secrets/src/backends/env.js +0 -0
  538. /package/framework/{v0.6.4 → v0.6.5}/lib/secrets/src/backends/file.js +0 -0
  539. /package/framework/{v0.6.4 → v0.6.5}/lib/secrets/src/env-file.js +0 -0
  540. /package/framework/{v0.6.4 → v0.6.5}/lib/secrets/src/main.js +0 -0
  541. /package/framework/{v0.6.4 → v0.6.5}/lib/session-store.js +0 -0
  542. /package/framework/{v0.6.4 → v0.6.5}/lib/shell.js +0 -0
  543. /package/framework/{v0.6.4 → v0.6.5}/lib/sqlite-driver.js +0 -0
  544. /package/framework/{v0.6.4 → v0.6.5}/lib/state.js +0 -0
  545. /package/framework/{v0.6.4 → v0.6.5}/lib/swig-filters/README.md +0 -0
  546. /package/framework/{v0.6.4 → v0.6.5}/lib/swig-filters/package.json +0 -0
  547. /package/framework/{v0.6.4 → v0.6.5}/lib/swig-filters/src/main.js +0 -0
  548. /package/framework/{v0.6.4 → v0.6.5}/lib/swig-resolver/package.json +0 -0
  549. /package/framework/{v0.6.4 → v0.6.5}/lib/swig-resolver/src/main.js +0 -0
  550. /package/framework/{v0.6.4 → v0.6.5}/lib/template-loaders/package.json +0 -0
  551. /package/framework/{v0.6.4 → v0.6.5}/lib/template-loaders/src/loaders/http.js +0 -0
  552. /package/framework/{v0.6.4 → v0.6.5}/lib/template-loaders/src/loaders/memory.js +0 -0
  553. /package/framework/{v0.6.4 → v0.6.5}/lib/template-loaders/src/main.js +0 -0
  554. /package/framework/{v0.6.4 → v0.6.5}/lib/url/README.md +0 -0
  555. /package/framework/{v0.6.4 → v0.6.5}/lib/url/index.js +0 -0
  556. /package/framework/{v0.6.4 → v0.6.5}/lib/url/routing.json +0 -0
  557. /package/framework/{v0.6.4 → v0.6.5}/lib/uuid/package.json +0 -0
  558. /package/framework/{v0.6.4 → v0.6.5}/lib/uuid/src/main.js +0 -0
  559. /package/framework/{v0.6.4 → v0.6.5}/lib/validator.js +0 -0
  560. /package/framework/{v0.6.4 → v0.6.5}/lib/watcher/package.json +0 -0
  561. /package/framework/{v0.6.4 → v0.6.5}/lib/watcher/src/main.js +0 -0
  562. /package/framework/{v0.6.4 → v0.6.5}/lib/ws-framing/package.json +0 -0
  563. /package/framework/{v0.6.4 → v0.6.5}/lib/ws-framing/src/main.js +0 -0
  564. /package/framework/{v0.6.4 → v0.6.5}/lib/ws-query/package.json +0 -0
  565. /package/framework/{v0.6.4 → v0.6.5}/lib/ws-query/src/main.js +0 -0
  566. /package/framework/{v0.6.4 → v0.6.5}/lib/ws-session/package.json +0 -0
  567. /package/framework/{v0.6.4 → v0.6.5}/lib/ws-session/src/main.js +0 -0
@@ -4787,7 +4787,12 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
4787
4787
  }
4788
4788
 
4789
4789
 
4790
- var isValid = ( typeof(this.value) != 'undefined' && this.value != null && this.value != '' && !/^\s+/.test(this.value) ) ? true : false;
4790
+ // was: var isValid = ( typeof(this.value) != 'undefined' && this.value != null && this.value != '' && !/^\s+/.test(this.value) ) ? true : false;
4791
+ // #B245 - the leading anchor alone made ANY leading-whitespace-padded value
4792
+ // read as empty (" x" was rejected while "x " passed, and a paired `trim`
4793
+ // healed the data AFTER the error was recorded); emptiness means
4794
+ // whitespace-ONLY, so anchor both ends. All-whitespace still fails.
4795
+ var isValid = ( typeof(this.value) != 'undefined' && this.value != null && this.value != '' && !/^\s+$/.test(this.value) ) ? true : false;
4791
4796
  var errors = self[this['name']]['errors'] || {};
4792
4797
 
4793
4798
 
@@ -5131,7 +5136,10 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
5131
5136
  self[el]['trim'] = function(isApplicable) {
5132
5137
  if ( typeof(isApplicable) == 'boolean' && isApplicable ) {
5133
5138
  //if ( typeof(this.value) == 'string' ) {
5134
- this.value = this.value.replace(/^\s+|\s+$/, '');
5139
+ // was: this.value = this.value.replace(/^\s+|\s+$/, '');
5140
+ // #B245 - without the global flag, replace() rewrote only the FIRST
5141
+ // match: " x " came back "x " (leading stripped, trailing kept).
5142
+ this.value = this.value.replace(/^\s+|\s+$/g, '');
5135
5143
  local.data[this.name] = local.data[this.name] = this.value;
5136
5144
  //}
5137
5145
  return self[this.name]
@@ -7499,6 +7507,47 @@ function setupXhr(options) {
7499
7507
  return xhr;
7500
7508
  }
7501
7509
 
7510
+ /**
7511
+ * getFilenameFromContentDisposition
7512
+ *
7513
+ * Extracts the `filename` parameter from a response `Content-Disposition`
7514
+ * header for the XHR blob-download path. Both RFC 6266 value forms are
7515
+ * accepted: a bare token (`filename=report.pdf`, read up to the next `;`)
7516
+ * and a quoted-string (`filename="monthly report.pdf"`, delimiters stripped,
7517
+ * `\"` and `\\` unescaped). Returns an empty string when the header is
7518
+ * missing or carries no `filename` parameter (e.g. a bare `attachment`), so
7519
+ * the caller can hand the browser an empty `download` attribute and let it
7520
+ * derive a name instead of throwing mid-handler. The extended RFC 5987
7521
+ * parameter (`filename` followed by a star) is never matched — the star
7522
+ * breaks the `filename=` adjacency — so a header carrying both parameters
7523
+ * yields the plain one instead of folding the two values together.
7524
+ *
7525
+ * @function getFilenameFromContentDisposition
7526
+ * @param {string|null} contentDisposition - raw header value, e.g. from `xhr.getResponseHeader('Content-Disposition')`
7527
+ * @returns {string} filename - the decoded filename, or `''` when none is present
7528
+ *
7529
+ * @example
7530
+ * getFilenameFromContentDisposition('attachment; filename="monthly report.pdf"');
7531
+ * // -> 'monthly report.pdf'
7532
+ * @example
7533
+ * getFilenameFromContentDisposition('attachment');
7534
+ * // -> ''
7535
+ */
7536
+ function getFilenameFromContentDisposition(contentDisposition) {
7537
+ if (!contentDisposition) {
7538
+ return '';
7539
+ }
7540
+ var found = contentDisposition.match(/filename\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([^;]+))/i);
7541
+ if (!found) {
7542
+ return '';
7543
+ }
7544
+ if ( typeof(found[1]) != 'undefined' ) {
7545
+ // quoted-string: delimiters are not part of the name; unescape quoted pairs
7546
+ return found[1].replace(/\\(.)/g, '$1');
7547
+ }
7548
+ return found[2].replace(/^\s+|\s+$/g, '');
7549
+ }
7550
+
7502
7551
  /**
7503
7552
  * handleXhr
7504
7553
  *
@@ -7650,7 +7699,7 @@ function handleXhr(xhr, $el, options, require) {
7650
7699
  var url = window.URL.createObjectURL(blob);
7651
7700
  a.href = url;
7652
7701
  var contentDisposition = xhr.getResponseHeader('Content-Disposition');
7653
- a.download = contentDisposition.match('\=(.*)')[0].substring(1);
7702
+ a.download = getFilenameFromContentDisposition(contentDisposition);
7654
7703
  //programatically click the link to trigger the download
7655
7704
  a.click();
7656
7705
  //release the reference to the file by revoking the Object URL
@@ -8991,12 +9040,29 @@ define('gina', [ 'require', 'lib/merge', 'lib/uuid', 'lib/routing', 'utils/event
8991
9040
 
8992
9041
  /**
8993
9042
  * setOptions
8994
- * Override default config options or add new options properties
9043
+ * Overrides default config options or adds new option properties on the
9044
+ * exposed `gina.config` — the object every plugin and library reads.
9045
+ * Applied in place with override semantics: a top-level scalar from
9046
+ * `options` replaces the existing value, a top-level object is merged one
9047
+ * level deep, and keys absent from `options` are never removed.
9048
+ *
9049
+ * N.B.: the framework boot passes the exposed config itself through this
9050
+ * function; that call is a no-op by design. In a child frame inheriting a
9051
+ * parent frame's instance, the inherited handler configures the parent.
9052
+ *
9053
+ * @param {object} options - e.g. `{ loadingAttribute: 'data-loading' }`
8995
9054
  *
8996
- * @param {object} options
9055
+ * @example
9056
+ * gina.setOptions({ loadingAttribute: 'data-loading' });
9057
+ * // gina.config.loadingAttribute is now 'data-loading'
8997
9058
  * */
8998
9059
  var setOptions = function(options) {
8999
- proto.config = merge(proto.config, options, true)
9060
+ if ( !options || typeof(options) != 'object' || options === $instance.config ) {
9061
+ // nothing to merge: no options given, or the boot passing the
9062
+ // exposed config back to itself
9063
+ return
9064
+ }
9065
+ $instance.config = merge($instance.config, options, true)
9000
9066
  }
9001
9067
 
9002
9068
  // instance proto
@@ -9316,16 +9382,15 @@ if ( _isNode ) {
9316
9382
  * ## Configuring the attribute name
9317
9383
  *
9318
9384
  * The name is read from `gina.config.loadingAttribute`, lazily, at every call —
9319
- * `gina.config` is populated after the bundle loads (via `setOptions`), so a value
9385
+ * `gina.config` is populated by the loader after the bundle loads, so a value
9320
9386
  * captured at module-definition time would be stale. A project already built on
9321
9387
  * `data-loading` opts in with:
9322
9388
  *
9323
- * ```html
9324
- * <script src="/js/vendor/gina/gina.min.js"
9325
- * data-gina-config="{ loadingAttribute: 'data-loading' }"></script>
9389
+ * ```js
9390
+ * gina.setOptions({ loadingAttribute: 'data-loading' });
9326
9391
  * ```
9327
9392
  *
9328
- * or `gina.setOptions({ loadingAttribute: 'data-loading' })`. There is no
9393
+ * There is no
9329
9394
  * auto-detection: a DOM probe reads nothing at rest (the attribute only exists
9330
9395
  * while something is loading) and a stylesheet probe races late-loaded sheets and
9331
9396
  * throws on cross-origin ones. Configuration is explicit by design.
@@ -9767,10 +9832,88 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
9767
9832
 
9768
9833
 
9769
9834
 
9835
+ /**
9836
+ * A click the user asked the BROWSER to handle specially — cmd/ctrl for a new
9837
+ * tab, shift for a new window, alt for a download in some browsers. Binding it
9838
+ * swallows that intent, exactly as the `download` / `target` / `#` shapes did
9839
+ * before the bind-time guard in `bindLinks`.
9840
+ *
9841
+ * Mirrors the nav plugin's equivalent test, with two deliberate differences:
9842
+ * - nav also bails on `event.defaultPrevented`. That cannot be reused here:
9843
+ * this plugin's own per-anchor listener suppresses the default before the
9844
+ * document proxy runs, so the flag is always set by the time the proxy is
9845
+ * reached and the bail would fire on every single click.
9846
+ * - nav also bails on a non-left `event.button`. Measured unnecessary here:
9847
+ * a middle click fires `auxclick`, not `click`, so it never arrives.
9848
+ *
9849
+ * Must be consulted at every site that still holds the NATIVE event — the
9850
+ * per-anchor listener, the document proxy and this child proxy. The custom
9851
+ * event dispatched onward carries no modifier data at all (`triggerEvent`
9852
+ * copies native properties only when handed a `proxiedEvent`, which no call
9853
+ * site here does), so a check placed after that hop could never fire.
9854
+ *
9855
+ * @inner
9856
+ * @private
9857
+ * @param {object} e - the native click event
9858
+ * @returns {boolean} true when a modifier key was held
9859
+ *
9860
+ * @example
9861
+ * if ( isModifiedClick(e) ) return; // let the browser open its new tab
9862
+ */
9863
+ var isModifiedClick = function(e) {
9864
+ return !!( e && (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) );
9865
+ }
9866
+
9867
+ /**
9868
+ * isLinkDisabled
9869
+ *
9870
+ * Tells whether a bound link is currently marked disabled — #B310's
9871
+ * click-time gate. The predicate is the popin trigger gate's (#B296),
9872
+ * itself mirroring the validator's (#B293), so all three subsystems
9873
+ * agree on what "disabled" means for a trigger: the aria-disabled
9874
+ * marker always counts; the native attribute counts only where
9875
+ * `disabled` is not a real IDL property (on an anchor it never is, so
9876
+ * both arms are live here), because a genuine form control's
9877
+ * browser-enforced disable never lets the click reach JS at all.
9878
+ *
9879
+ * Consulted at the TWO dispatch sites that turn a click into a
9880
+ * request — the document proxy and the child-node proxy — AFTER their
9881
+ * cancelEvent: a registered link keeps suppressing its default, gated
9882
+ * or not, so a disabled link goes nowhere rather than falling back to
9883
+ * navigation. Deliberately NOT consulted in linkRequest (the public
9884
+ * API + the redirect funnel — a programmatic call is not operating
9885
+ * the control, the same scope reasoning as the validator's gesture
9886
+ * gate) nor in the per-anchor CSP suppression listener (a gated link
9887
+ * still suppresses its default).
9888
+ *
9889
+ * @inner
9890
+ * @private
9891
+ * @param {object} $el - the bound anchor
9892
+ * @returns {boolean} true when the link is marked disabled
9893
+ *
9894
+ * @example
9895
+ * if ( isLinkDisabled($el) ) return; // swallow the click, send nothing
9896
+ */
9897
+ var isLinkDisabled = function($el) {
9898
+ return !!(
9899
+ $el
9900
+ && (
9901
+ !('disabled' in $el)
9902
+ && $el.getAttribute('disabled') != null && $el.getAttribute('disabled') != 'false'
9903
+ || $el.getAttribute('aria-disabled') == 'true'
9904
+ )
9905
+ );
9906
+ }
9907
+
9770
9908
  var proxyClick = function($childNode, $el, evt) {
9771
9909
 
9772
9910
  addListener(gina, $childNode, 'click', function(e) {
9911
+ if ( isModifiedClick(e) ) return;
9912
+
9773
9913
  cancelEvent(e);
9914
+ // #B310 — the disabled gate, AFTER cancelEvent: a registered
9915
+ // link keeps suppressing its default, gated or not.
9916
+ if ( isLinkDisabled($el) ) return;
9774
9917
 
9775
9918
  triggerEvent(gina, $el, evt);
9776
9919
  });
@@ -10089,8 +10232,34 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10089
10232
  /**
10090
10233
  * bindLinks
10091
10234
  *
10235
+ * Binds every `<a data-gina-link>` under `$target` so its clicks issue an XHR
10236
+ * instead of navigating. An anchor spelling `data-gina-link="false"` opts out.
10237
+ *
10238
+ * Three shapes are skipped at bind time (#B288) because they ask the BROWSER for
10239
+ * something an XHR cannot deliver — a `download` save, a `target` window, or a
10240
+ * pure `#` in-page fragment move. A skipped anchor is left completely untouched
10241
+ * (no generated id, no click listeners) and therefore behaves exactly like
10242
+ * un-marked markup. The test is made against the RESOLVED url, so the documented
10243
+ * `<a href="#" data-gina-link-url="/real/target">` placeholder idiom still binds.
10244
+ *
10245
+ * Cross-origin anchors are deliberately NOT skipped — `linkRequest` supports them
10246
+ * (it drops credentials and relies on the target's CORS headers). Non-left-button
10247
+ * clicks need no guard: a middle click fires `auxclick`, not `click`.
10248
+ *
10092
10249
  * @param {object} $target - DOM element
10093
10250
  * @param {object} [options]
10251
+ *
10252
+ * @example
10253
+ * // bound — same-origin GET over XHR
10254
+ * // <a href="/reports/42" data-gina-link>Open</a>
10255
+ *
10256
+ * // bound — placeholder href, real target in the data attribute
10257
+ * // <a href="#" data-gina-link data-gina-link-url="/reports/42">Open</a>
10258
+ *
10259
+ * // NOT bound — the browser saves, moves in-page, or opens a window itself
10260
+ * // <a href="/report.pdf" data-gina-link download>Save</a>
10261
+ * // <a href="/reports/42" data-gina-link target="_blank">New tab</a>
10262
+ * // <a href="#section-3" data-gina-link>Jump</a>
10094
10263
  * */
10095
10264
  var bindLinks = function($target, options) {
10096
10265
 
@@ -10134,8 +10303,35 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10134
10303
  props.url = $el.getAttribute('href')
10135
10304
  }
10136
10305
 
10137
-
10138
-
10306
+ // #B288 — leave the browser's own affordances alone. Three anchor shapes
10307
+ // ask the BROWSER to do something an XHR cannot do, and binding them
10308
+ // silently swallowed the user's intent (all three measured in a real
10309
+ // browser against the shipped bundle):
10310
+ // `download` — the user asked for a saved file; the native save streams
10311
+ // and names it, where the XHR path buffers the whole body
10312
+ // in memory first.
10313
+ // `target` — asks for another window/tab; an XHR opens neither, so the
10314
+ // click did nothing observable at all.
10315
+ // a pure `#` — an in-page fragment move; there is no resource to request,
10316
+ // and the plugin issued a GET for the literal "#name".
10317
+ // Skipped at BIND time, so a skipped anchor gets neither the id nor either
10318
+ // click listener and behaves exactly as un-marked markup — gating only the
10319
+ // request would leave the default still suppressed and produce a dead link
10320
+ // (the #B141 failure this plugin already shipped once).
10321
+ // Keyed on the RESOLVED url, never on `href`: `data-gina-link-url` wins
10322
+ // (see just above), so the documented placeholder idiom
10323
+ // `<a href="#" data-gina-link data-gina-link-url="/real/target">` still binds.
10324
+ // Deliberately NOT guarded here: cross-origin (a supported link feature —
10325
+ // see the CORS branch in `linkRequest`) and non-left-button clicks (a middle
10326
+ // click fires `auxclick`, not `click`, so it never reaches this plugin —
10327
+ // measured: the browser opens the tab and no request is made).
10328
+ if (
10329
+ $el.getAttribute('download') != null
10330
+ || $el.getAttribute('target') != null
10331
+ || /^#/.test( props.url || '' )
10332
+ ) {
10333
+ continue;
10334
+ }
10139
10335
 
10140
10336
  elId = $el.getAttribute('id');
10141
10337
  if ( typeof(elId) == 'undefined' || elId == null || elId == '' || /popin\.link/.test(elId) ) {
@@ -10157,7 +10353,10 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10157
10353
  // script-src-attr under nonce-based policies. preventDefault (NOT cancelEvent —
10158
10354
  // its stopPropagation would block the document-level delegation that fires the
10159
10355
  // AJAX request) covers direct AND child clicks while leaving the delegation intact.
10160
- addListener(gina, $el, 'click', function(e) { e.preventDefault(); });
10356
+ // The modifier bail runs FIRST: suppressing here would kill the browser's new
10357
+ // tab/window no matter what the document proxy later decides, because this
10358
+ // listener is reached before it.
10359
+ addListener(gina, $el, 'click', function(e) { if ( isModifiedClick(e) ) return; e.preventDefault(); });
10161
10360
 
10162
10361
  $newLink = null;
10163
10362
 
@@ -10188,6 +10387,10 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10188
10387
  // for proxies, use linkInstance.id as target is always `document`
10189
10388
  addListener(gina, instance.target, evt, function(event) {
10190
10389
 
10390
+ // A modified click belongs to the browser. Bail before the id backfill
10391
+ // below, so deferring leaves no trace on the element either.
10392
+ if ( isModifiedClick(event) ) return;
10393
+
10191
10394
  if ( typeof(event.target.id) == 'undefined' ) {
10192
10395
  event.target.setAttribute('id', evt +'.'+ uuid() );
10193
10396
  event.target.id = event.target.getAttribute('id')
@@ -10195,13 +10398,29 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10195
10398
 
10196
10399
 
10197
10400
 
10198
- if ( /^link\.click\./.test(event.target.id) ) {
10401
+ // #B302 — dispatch on REGISTRATION, never on the id's SHAPE. `bindLinks`
10402
+ // KEEPS an author-supplied `id` (only an empty/missing/`popin.link` id gets
10403
+ // the generated `link.click.gina-link-<instance>-<uuid>` form), so gating
10404
+ // here on that shape made `<a id="my-link" data-gina-link>text</a>` a DEAD
10405
+ // link: it registered its `$links` entry and its custom-event listener
10406
+ // normally, this proxy then refused to trigger it, and the per-anchor
10407
+ // listener above had already suppressed the default — so the click did
10408
+ // nothing at all. `instance.$links` is the very lookup `getLinkById` is,
10409
+ // and it is PER-INSTANCE, so it answers "is this one of MY links?"
10410
+ // directly — subsuming the old second, instance-scoping regex — and it
10411
+ // holds for BOTH id shapes. Note the child proxy (`proxyClick`) has always
10412
+ // been shape-agnostic (it takes the id as a parameter), which is why a
10413
+ // nested-element click on such an anchor already worked; this makes the
10414
+ // direct-click path agree with it rather than adding a new mechanism.
10415
+ // A click on non-link markup yields an id absent from `$links` — no-op.
10416
+ if ( typeof(instance.$links[event.target.id]) != 'undefined' ) {
10199
10417
  cancelEvent(event);
10200
- var _evt = event.target.id;
10201
-
10202
- if ( new RegExp( '^link.click.gina-link-' + instance.id).test(_evt) )
10203
- triggerEvent(gina, event.target, _evt, event.detail);
10204
-
10418
+ // #B310 — the disabled gate, AFTER cancelEvent (same
10419
+ // reasoning as proxyClick's): suppressed, not sent.
10420
+ if ( isLinkDisabled(event.target) ) {
10421
+ return;
10422
+ }
10423
+ triggerEvent(gina, event.target, event.target.id, event.detail);
10205
10424
  }
10206
10425
  });
10207
10426
 
@@ -11478,6 +11697,23 @@ function ValidatorPlugin(rules, data, formId, culture) {
11478
11697
 
11479
11698
  }
11480
11699
 
11700
+ /**
11701
+ * #B319 — one-shot exemption raised while the framework moves focus to the
11702
+ * first invalid field to DELIVER a refused submit's answer (the #B246/#B308
11703
+ * display-only reveal, and the `validate.<id>` failure branch). `.focus()`
11704
+ * dispatches `focusin` synchronously, so without this flag that dispatch
11705
+ * re-enters the live-check listener whose `refreshWarning` call sees the
11706
+ * field is by then the active element and hides the very message the answer
11707
+ * just rendered (#B312: the message IS the answer). The focusin arm skips
11708
+ * the downgrade while the flag is up; both focus sites clear it on every
11709
+ * exit, so the user's next interaction — typing, refocusing — re-engages
11710
+ * the deliberate mid-typing suppression untouched.
11711
+ *
11712
+ * @private
11713
+ * @type {boolean}
11714
+ */
11715
+ var isAnswerFocusInProgress = false;
11716
+
11481
11717
  var refreshWarning = function($el) {
11482
11718
  var formId = $el.form.id || $el.form.getAttribute('id');
11483
11719
  var elName = $el.name || $el.form.getAttribute('name');
@@ -12865,6 +13101,15 @@ function ValidatorPlugin(rules, data, formId, culture) {
12865
13101
  if ($submitTrigger) {
12866
13102
  // For A tag: aria-disabled=true
12867
13103
  if ( /^A$/i.test($submitTrigger.tagName) ) {
13104
+ // #B312 — unconditional again: the live-check gate now marks
13105
+ // `data-gina-form-submit-gated` (its own channel, untouched
13106
+ // here), so the in-flight lock is aria-disabled's only
13107
+ // framework writer on this trigger and the #B309 verdict
13108
+ // replay — a conditional re-mark read from the form's
13109
+ // `_gateMarked` shadow (commit cf366c34a) — had nothing left
13110
+ // to replay and is retired. An authored aria mark set
13111
+ // mid-flight is still released here; that was equally true
13112
+ // of the replay.
12868
13113
  $submitTrigger.removeAttribute('aria-disabled');
12869
13114
  } else {
12870
13115
  $submitTrigger.removeAttribute('disabled');
@@ -12943,9 +13188,17 @@ function ValidatorPlugin(rules, data, formId, culture) {
12943
13188
  if ($submitTrigger) {
12944
13189
  // For A tag: aria-disabled=true
12945
13190
  if ( /^A$/i.test($submitTrigger.tagName) ) {
12946
- $submitTrigger.removeAttribute('aria-disabled', true);
13191
+ // #B312 — unconditional again, in step with the loadend
13192
+ // release above (the #B309 verdict replay is retired with
13193
+ // the shared attribute — the gate marks its own channel
13194
+ // now), and the stray 2nd argument fixed by #B309 stays
13195
+ // gone.
13196
+ // was:
13197
+ // $submitTrigger.removeAttribute('aria-disabled', true);
13198
+ $submitTrigger.removeAttribute('aria-disabled');
12947
13199
  } else {
12948
- $submitTrigger.removeAttribute('disabled', true);
13200
+ // was: $submitTrigger.removeAttribute('disabled', true);
13201
+ $submitTrigger.removeAttribute('disabled');
12949
13202
  }
12950
13203
  }
12951
13204
  $form.target.removeAttribute('data-gina-form-loading');
@@ -12980,7 +13233,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
12980
13233
  var url = window.URL.createObjectURL(blob);
12981
13234
  a.href = url;
12982
13235
  var contentDisposition = xhr.getResponseHeader("Content-Disposition");
12983
- a.download = contentDisposition.match('\=(.*)')[0].substring(1);
13236
+ a.download = getFilenameFromContentDisposition(contentDisposition);
12984
13237
  //programatically click the link to trigger the download
12985
13238
  a.click();
12986
13239
 
@@ -16076,7 +16329,13 @@ function ValidatorPlugin(rules, data, formId, culture) {
16076
16329
  }
16077
16330
  // other inputs & textareas
16078
16331
  else if ( /^focusin\./i.test(event.type) ) {
16079
- if ( /\-error/.test($el.parentNode.className) ) {
16332
+ // #B319 — not on the answer focus: when a refused submit
16333
+ // moves focus to the first invalid field, the message it
16334
+ // just rendered must survive its own delivery.
16335
+ if (
16336
+ /\-error/.test($el.parentNode.className)
16337
+ && !isAnswerFocusInProgress
16338
+ ) {
16080
16339
  console.debug('#1 you just focusin ....'+$el.id, $el.value, instance.$forms[ $el.form.getAttribute('id') ].isValidating);
16081
16340
  refreshWarning($el);
16082
16341
  }
@@ -18718,20 +18977,18 @@ function ValidatorPlugin(rules, data, formId, culture) {
18718
18977
  _evt = 'reset.'+_evt
18719
18978
  }
18720
18979
 
18721
- // #B246 — a disabled submit trigger must not run the submit cycle.
18722
- // `updateSubmitTriggerState()` marks an invalid form's trigger with
18723
- // `aria-disabled="true"` and never with native `disabled`, precisely so
18724
- // the click still reaches us. Nothing READ that marker, so the trigger
18725
- // stayed fully operable: a click ran the collect -> validate ->
18726
- // `validate.<id>` chain and only the `isValid()` gate stopped the send.
18727
- // The trigger was inert in appearance ONLY, and that also contradicted
18728
- // the `aria-disabled` contract it advertises to assistive tech (which
18729
- // requires the author to suppress the action).
18980
+ // #B246 — a gated or disabled submit trigger must not run the submit
18981
+ // cycle. `updateSubmitTriggerState()` marks an invalid form's trigger
18982
+ // with `data-gina-form-submit-gated` + a class (#B312 — the
18983
+ // framework's own channel, no ARIA claim, precisely so the click
18984
+ // still reaches us and the vocabulary stays honest), and
18985
+ // `isTriggerDisabled` ALSO honours an AUTHORED aria/native disabled
18986
+ // mark and the anchor in-flight lock.
18730
18987
  //
18731
18988
  // Intercept HERE — before the `submit.<id>` dispatch below — so
18732
18989
  // `bindSubmitEl`'s handler never runs, `isSubmitting` is never latched
18733
18990
  // and no send path is reachable. The click is still answered with a
18734
- // display-only reveal, so the user learns WHY the trigger is disabled
18991
+ // display-only reveal, so the user learns WHY the trigger is refused
18735
18992
  // (which is what the operable-trigger design was bought for).
18736
18993
  // Checked on the CLICKED element, not `$formInstance.submitTrigger`:
18737
18994
  // a form may carry several submit buttons and only one registers.
@@ -18757,6 +19014,24 @@ function ValidatorPlugin(rules, data, formId, culture) {
18757
19014
  }
18758
19015
 
18759
19016
  if (gina.events[_evt]) {
19017
+ // #B294 — submit binding is TWO-STAGE and only the first stage is
19018
+ // delegated. The native click proxy lives on the FORM (:8090) and
19019
+ // survives any re-render; the listener that does the work is
19020
+ // attached to the trigger NODE by `bindSubmitEl` (:8231). Because
19021
+ // `gina.events` is a name -> id-STRING registry, the `submit.<id>`
19022
+ // key outlives the node, so after an AJAX/popin re-render replaces
19023
+ // the trigger this gate still passes: `cancelEvent` below suppresses
19024
+ // the native submit and `triggerEvent` fires at a node that has no
19025
+ // listener. The form does not even fall back to a normal submit, and
19026
+ // nothing self-heals — `bindForm` latches `binded` (:8580) and is
19027
+ // never re-entered on DOM replacement — so the trigger was
19028
+ // permanently and silently dead.
19029
+ // Re-bind the live node when its marker is absent. A clone cannot
19030
+ // inherit the expando, so this fires exactly once per replacement
19031
+ // and is a no-op on the normal path.
19032
+ if ( $el && $el.__ginaSubmitBoundFor !== _evt ) {
19033
+ bindSubmitEl(_evt, $el);
19034
+ }
18760
19035
  cancelEvent(event);
18761
19036
 
18762
19037
  triggerEvent(gina, $el, _evt, event.detail);
@@ -18913,25 +19188,33 @@ function ValidatorPlugin(rules, data, formId, culture) {
18913
19188
  var _a11yErrs = result['fields'] || result['error'];
18914
19189
  if ( _a11yErrs ) {
18915
19190
  var $a11yForm = event['target'];
18916
- for (var _ai = 0, _aLen = $a11yForm.length; _ai < _aLen; ++_ai) {
18917
- var _aField = $a11yForm[_ai];
18918
- var _aName = _aField.getAttribute('name');
18919
- if (
18920
- _aName
18921
- && typeof(_a11yErrs[_aName]) != 'undefined'
18922
- && ( typeof(_a11yErrs[_aName].count) != 'function' || _a11yErrs[_aName].count() > 0 )
18923
- && _aField.type != 'hidden'
18924
- && typeof(_aField.focus) == 'function'
18925
- ) {
18926
- _aField.focus();
18927
- // #A11Y5 (V8) — kept in step with focusFirstInvalidField:
18928
- // only stop once focus actually moved, since focus() is a
18929
- // no-op on an unfocusable host that still passes the
18930
- // typeof-function gate above.
18931
- if ( typeof(document) === 'undefined' || !document || document.activeElement === _aField ) {
18932
- break;
19191
+ // #B319 — same one-shot answer-focus exemption as
19192
+ // focusFirstInvalidField: this focus delivers the
19193
+ // answer, it is not the user editing the field.
19194
+ isAnswerFocusInProgress = true;
19195
+ try {
19196
+ for (var _ai = 0, _aLen = $a11yForm.length; _ai < _aLen; ++_ai) {
19197
+ var _aField = $a11yForm[_ai];
19198
+ var _aName = _aField.getAttribute('name');
19199
+ if (
19200
+ _aName
19201
+ && typeof(_a11yErrs[_aName]) != 'undefined'
19202
+ && ( typeof(_a11yErrs[_aName].count) != 'function' || _a11yErrs[_aName].count() > 0 )
19203
+ && _aField.type != 'hidden'
19204
+ && typeof(_aField.focus) == 'function'
19205
+ ) {
19206
+ _aField.focus();
19207
+ // #A11Y5 (V8) — kept in step with focusFirstInvalidField:
19208
+ // only stop once focus actually moved, since focus() is a
19209
+ // no-op on an unfocusable host that still passes the
19210
+ // typeof-function gate above.
19211
+ if ( typeof(document) === 'undefined' || !document || document.activeElement === _aField ) {
19212
+ break;
19213
+ }
18933
19214
  }
18934
19215
  }
19216
+ } finally {
19217
+ isAnswerFocusInProgress = false;
18935
19218
  }
18936
19219
  }
18937
19220
  }
@@ -18950,6 +19233,16 @@ function ValidatorPlugin(rules, data, formId, culture) {
18950
19233
  evt = 'submit.'+ evt;
18951
19234
  }
18952
19235
  //console.debug('attaching submit event: `'+ evt +'` on `'+ $submit.id + '` element for form `'+ $submit.form.id +'`');
19236
+ // #B294 — mark the node this listener is ACTUALLY attached to. Deliberately
19237
+ // a JS expando and NOT a `data-*` attribute: `cloneNode(true)` copies
19238
+ // attributes but not expandos (measured), so a re-rendered trigger arrives
19239
+ // carrying every attribute yet WITHOUT this marker. That asymmetry is what
19240
+ // makes it a reliable "is this the bound node?" test — and it is why the
19241
+ // inherited `dataset.ginaFormSubmitTriggerFor` cannot serve the same purpose.
19242
+ // Assigned after the `submit.` prefix is normalised above, so it holds the
19243
+ // same string `clickProxyHandler` compares against. Read at the :8037
19244
+ // dispatch gate.
19245
+ $submit.__ginaSubmitBoundFor = evt;
18953
19246
  addListener(gina, $submit, evt, function(event) {
18954
19247
  // start validation
18955
19248
  cancelEvent(event);
@@ -19137,13 +19430,39 @@ function ValidatorPlugin(rules, data, formId, culture) {
19137
19430
  , isBinded = $form.binded
19138
19431
  ;
19139
19432
 
19140
- // check submit trigger status
19141
- var submitTrigger = new DOMParser()
19142
- .parseFromString($target.innerHTML, 'text/html')
19143
- .getElementById($formInstance.submitTrigger);
19144
- // prevent submit if disabled
19145
- if ( submitTrigger && submitTrigger.disabled) {
19146
- cancelEvent(e);
19433
+ // #B308 — the disabled gate for USER GESTURES, with #B246's own predicate
19434
+ // read from the LIVE registered trigger, and #B246's own answer (cancel +
19435
+ // reveal). `e.isTrusted` scopes it: Enter-key submission and a wrapped-label
19436
+ // click (`<button type="submit"><span>`, whose click target has no `.type`
19437
+ // and so surfaces here instead of at the click proxy) arrive as trusted
19438
+ // submits; gina's own `triggerEvent` (`$forms[id].submit()`) dispatches an
19439
+ // untrusted CustomEvent and stays on the fresh-validate path below — a
19440
+ // programmatic submit is not operating the control, and the fresh pass is
19441
+ // the honest gate there. The reveal re-derives validity from live values,
19442
+ // so a stale marker heals and the NEXT gesture goes through.
19443
+ // Replaces the DOMParser innerHTML-copy guard below: the copy was blind to
19444
+ // the gate's marker (then `aria-disabled`, written by
19445
+ // updateSubmitTriggerState — since #B312 the gate marks its own
19446
+ // `data-gina-form-submit-gated` channel) while SIGHTED on a native `disabled` written
19447
+ // mid-dispatch by a double-submit guard — the exact attribute #B293 ruled
19448
+ // must not count on a real form control — so a wrapped-label trigger plus
19449
+ // a double-submit guard was a dead submit.
19450
+ // was:
19451
+ // // check submit trigger status
19452
+ // var submitTrigger = new DOMParser()
19453
+ // .parseFromString($target.innerHTML, 'text/html')
19454
+ // .getElementById($formInstance.submitTrigger);
19455
+ // // prevent submit if disabled
19456
+ // if ( submitTrigger && submitTrigger.disabled) {
19457
+ // cancelEvent(e);
19458
+ // }
19459
+ if ($formInstance && e.isTrusted) {
19460
+ var $registeredTrigger = document.getElementById($formInstance.submitTrigger) || null;
19461
+ if ( isTriggerDisabled($registeredTrigger) ) {
19462
+ cancelEvent(e);
19463
+ revealValidationState($formInstance);
19464
+ return false;
19465
+ }
19147
19466
  }
19148
19467
 
19149
19468
  // prevent event to be triggered twice
@@ -19159,12 +19478,10 @@ function ValidatorPlugin(rules, data, formId, culture) {
19159
19478
  // the event surfaces here instead. There is no clicked element on this path,
19160
19479
  // so the registered trigger is the best and only referent. Placed after the
19161
19480
  // disabled + defaultPrevented guards above, which both return first.
19162
- // NB. the disabled check at the top of this handler reads a DOMParser copy of
19163
- // the form's innerHTML, so it sees neither a live `disabled` set by JS nor the
19164
- // `aria-disabled` marker `updateSubmitTriggerState` uses. Re-check the live
19165
- // node with #B246's predicate: without it, every Enter-key submit on an
19166
- // invalid live-check form would flash the trigger armed for the length of the
19167
- // validation pass before the rejected branch released it.
19481
+ // NB. the #B308 gesture gate above already cancelled any TRUSTED submit on
19482
+ // a marked trigger, so this skip now guards the UNTRUSTED path: a
19483
+ // programmatic submit on a marked form runs the fresh validate pass below
19484
+ // and must not flash the trigger armed for the length of that pass.
19168
19485
  if ($formInstance) {
19169
19486
  var $loadingTrigger = document.getElementById($formInstance.submitTrigger);
19170
19487
  if ( !isTriggerDisabled($loadingTrigger) ) {
@@ -19341,6 +19658,33 @@ function ValidatorPlugin(rules, data, formId, culture) {
19341
19658
 
19342
19659
  } // EO bindForm()
19343
19660
 
19661
+ /**
19662
+ * updateSubmitTriggerState
19663
+ *
19664
+ * Syncs a form's registered submit trigger with the live-check verdict:
19665
+ * while the form is invalid and live checking is on, the trigger is marked
19666
+ * `data-gina-form-submit-gated="true"` plus a styling class (#B312); both
19667
+ * marks are removed the moment the form validates. The marker is the
19668
+ * framework's OWN channel — the trigger carries no ARIA disabled claim,
19669
+ * because it stays genuinely operable: a click on a gated trigger is
19670
+ * answered by the display-only reveal (#B246), and `isValid()` remains the
19671
+ * real send gate.
19672
+ *
19673
+ * `aria-disabled` is deliberately neither written nor cleared here: an
19674
+ * authored mark belongs to the author (the gates enforce it, and nothing
19675
+ * here strips it), and the anchor in-flight lock's mark belongs to the
19676
+ * settle releases in `send()`.
19677
+ *
19678
+ * @param {object|HTMLFormElement} $formInstanceOrTarget - form instance, or its form target
19679
+ * @param {boolean|string} isFormValid - the fresh validity verdict
19680
+ *
19681
+ * @returns {void}
19682
+ *
19683
+ * @example
19684
+ * updateSubmitTriggerState(instance.$forms['checkout'], true);
19685
+ *
19686
+ * @inner
19687
+ */
19344
19688
  var updateSubmitTriggerState = function($formInstanceOrTarget, isFormValid) {
19345
19689
  //console.debug('submitTrigger[isFormValid='+ isFormValid +']: ', $formInstance.submitTrigger)
19346
19690
  var $formInstance = null; // #B176: was an implicit global (undeclared assignment)
@@ -19359,23 +19703,29 @@ function ValidatorPlugin(rules, data, formId, culture) {
19359
19703
  ) {
19360
19704
  console.warn('This might be normal, so do not worry if this form is handled by your javascript: `'+ $formInstance.id +'`\nGina could not complete `updateSubmitTriggerState()`: `submitTrigger` might not be attached to form instance `'+ $formInstance.id +'`\nTo disable this warning, You just need to disable `Form Live Checking on your form by adding to your <form>: `data-gina-form-live-check-enabled=false``')
19361
19705
  } else if ( document.getElementById($formInstance.submitTrigger) ) {
19362
- // Represent the "invalid + live-check-on" state with aria-disabled + a class
19363
- // INSTEAD of the native `disabled` property. A natively-disabled <button>
19364
- // emits no click event at all, so the click cannot be observed and the user
19365
- // gets no feedback about WHY the trigger is dead. aria-disabled keeps the
19366
- // trigger focusable and perceivable, and clickProxyHandler INTERCEPTS the
19367
- // click (#B246) to answer it with a display-only reveal: every invalid field
19368
- // is rendered and the first is focused, while the submit cycle is never
19369
- // entered. The trigger is therefore genuinely not operable — which is what
19370
- // the aria-disabled contract promises assistive tech, and what the earlier
19371
- // "keep it operable so the click can still validate" shape got wrong: it
19372
- // left the real submit path reachable from a control announced as disabled.
19373
- // Mirrors gina's own <a>-tag submit-trigger handling, which already uses
19374
- // aria-disabled in-flight. The show branch KEEPS clearing native `disabled` so a trigger
19375
- // rendered `disabled` in markup still enables on valid / when live-check is off.
19706
+ // Represent the "invalid + live-check-on" state with the framework's own
19707
+ // marker — `data-gina-form-submit-gated` + a class — INSTEAD of any
19708
+ // disabled vocabulary (#B312). A natively-disabled <button> emits no click
19709
+ // event at all, so the click could not be observed and the user would get
19710
+ // no feedback about WHY nothing happens; and an ARIA disabled claim would
19711
+ // be dishonest here — the control stays genuinely operable, keeping the
19712
+ // trigger focusable and perceivable, and clickProxyHandler answers its
19713
+ // clicks (#B246) with a display-only reveal: every invalid field is
19714
+ // rendered and the first is focused, while `isValid()` remains the real
19715
+ // send gate. `aria-disabled` is left to its two honest writers — markup or
19716
+ // script AUTHORS (the gates enforce an authored mark, and the show branch
19717
+ // never strips one) and the anchor in-flight lock in `send()` (armed and
19718
+ // released at the request boundary).
19719
+ // was (#B76, retired by #B312): the hide branch wrote an
19720
+ // `aria-disabled="true"` claim and the show branch removed it — one
19721
+ // attribute carrying the gate verdict, authored marks AND the in-flight
19722
+ // lock, a sharing whose collisions produced #B309/#B311/#B313.
19376
19723
  // Tag-agnostic: setAttribute/classList work for both <button> and <a> submit
19377
- // triggers. Consumers must style the [aria-disabled="true"] /
19378
- // .gina-form-submit-disabled state (the framework ships no button CSS).
19724
+ // triggers. The show branch KEEPS clearing native `disabled` so a trigger
19725
+ // rendered `disabled` in markup still enables on valid / when live-check is off.
19726
+ // The framework ships a default look for the gated state (see
19727
+ // loading-state.scss); consumers may override or extend via the
19728
+ // [data-gina-form-submit-gated="true"] / .gina-form-submit-disabled hooks.
19379
19729
  var $submitTrigger = document.getElementById($formInstance.submitTrigger);
19380
19730
  if (
19381
19731
  /^true$/i.test(isFormValid)
@@ -19383,10 +19733,10 @@ function ValidatorPlugin(rules, data, formId, culture) {
19383
19733
  !/^(true)$/i.test($formInstance.target.dataset.ginaFormLiveCheckEnabled)
19384
19734
  ) { // show submitTrigger
19385
19735
  $submitTrigger.disabled = false;
19386
- $submitTrigger.removeAttribute('aria-disabled');
19736
+ $submitTrigger.removeAttribute('data-gina-form-submit-gated');
19387
19737
  $submitTrigger.classList.remove('gina-form-submit-disabled');
19388
- } else { // hide submitTrigger (perceivable but not operable, NOT native-disabled)
19389
- $submitTrigger.setAttribute('aria-disabled', 'true');
19738
+ } else { // hide submitTrigger (gated: marked not-ready, still operable)
19739
+ $submitTrigger.setAttribute('data-gina-form-submit-gated', 'true');
19390
19740
  $submitTrigger.classList.add('gina-form-submit-disabled');
19391
19741
  }
19392
19742
  }
@@ -19395,19 +19745,43 @@ function ValidatorPlugin(rules, data, formId, culture) {
19395
19745
  /**
19396
19746
  * isTriggerDisabled
19397
19747
  *
19398
- * Tells whether a submit trigger is currently marked as disabled.
19399
- * `updateSubmitTriggerState()` marks an invalid form's trigger with
19400
- * `aria-disabled="true"` rather than the native `disabled` property, so a
19401
- * native-only check can never see it. The predicate shape mirrors the popin
19402
- * plugin's own trigger gate, so both subsystems agree on what "disabled"
19403
- * means for a trigger.
19748
+ * Tells whether a submit trigger must currently be refused. Three marks
19749
+ * count, each with one honest writer (#B312): `updateSubmitTriggerState()`
19750
+ * gates an invalid form's trigger with the framework's own
19751
+ * `data-gina-form-submit-gated="true"` channel; an AUTHORED
19752
+ * `aria-disabled="true"` counts and is never cleared by the framework —
19753
+ * an author's disabled claim is enforced, not second-guessed; and the
19754
+ * anchor in-flight lock marks `aria-disabled` for the request window. The
19755
+ * aria/native arms keep the same shape as the popin and link plugins' own
19756
+ * gates, so the three subsystems still agree on what an authored
19757
+ * "disabled" means for a trigger; the gated arm is validator-only.
19758
+ *
19759
+ * #B293 — the native `disabled` attribute counts ONLY on an element where
19760
+ * `disabled` is not a real IDL property. On a genuine form control the
19761
+ * browser already suppresses the click entirely (measured: a natively
19762
+ * disabled <button> delivers no click event to JS at all), so this gate
19763
+ * never even runs for one — which means the only way the native arm could
19764
+ * fire there was a listener setting the attribute DURING the dispatch. That
19765
+ * is exactly the shape of the near-universal double-submit guard
19766
+ * (`onclick -> this.setAttribute('disabled', …)`), which is bound to the
19767
+ * button and therefore runs before gina's delegated proxy reaches this
19768
+ * check. Accepting it killed the submit outright: `send()` never ran, the
19769
+ * consumer's own handler cleared the attribute again, and every subsequent
19770
+ * click repeated the cycle with nothing marked and a normal-looking button.
19771
+ * On an <a> or a custom element the browser enforces nothing, so there the
19772
+ * attribute is still the only honest signal and is still read.
19404
19773
  *
19405
19774
  * @param {object} $el - candidate trigger (DOMObject)
19406
19775
  *
19407
- * @returns {boolean} true when the trigger must not be operated
19776
+ * @returns {boolean} true when the trigger's activation must be refused
19408
19777
  *
19409
19778
  * @example
19410
- * isTriggerDisabled($button); // true while aria-disabled="true" is set
19779
+ * isTriggerDisabled($button); // true while the trigger is gated, or carries an authored aria-disabled="true"
19780
+ *
19781
+ * @example
19782
+ * // <button disabled> never reaches here (the browser eats the click), and a
19783
+ * // `disabled` set mid-click by a double-submit guard is deliberately ignored
19784
+ * isTriggerDisabled($guardedButton); // false
19411
19785
  *
19412
19786
  * @inner
19413
19787
  */
@@ -19415,10 +19789,16 @@ function ValidatorPlugin(rules, data, formId, culture) {
19415
19789
  if ( !$el || typeof($el.getAttribute) != 'function' ) {
19416
19790
  return false;
19417
19791
  }
19792
+ // #B293: `disabled` is only meaningful where the browser does not enforce it.
19793
+ // was: $el.getAttribute('disabled') != null && $el.getAttribute('disabled') != 'false'
19794
+ var nativeCounts = !('disabled' in $el);
19418
19795
  return (
19419
- $el.getAttribute('disabled') != null && $el.getAttribute('disabled') != 'false'
19796
+ nativeCounts
19797
+ && $el.getAttribute('disabled') != null && $el.getAttribute('disabled') != 'false'
19420
19798
  ||
19421
19799
  $el.getAttribute('aria-disabled') == 'true'
19800
+ ||
19801
+ $el.getAttribute('data-gina-form-submit-gated') == 'true'
19422
19802
  );
19423
19803
  };
19424
19804
 
@@ -19433,7 +19813,9 @@ function ValidatorPlugin(rules, data, formId, culture) {
19433
19813
  * than calling here. That is DELIBERATE: the inline shape is locked by source
19434
19814
  * pins in `test/core/validator-aria-invalid.test.js` (`_a11yErrs`, `_aField`),
19435
19815
  * so collapsing the two would break pins unrelated to #B246. Keep the two in
19436
- * step if the focus rule ever changes.
19816
+ * step if the focus rule ever changes — as #B319 did: both sites raise the
19817
+ * answer-focus exemption around their loop, so delivering the answer cannot
19818
+ * be mistaken for the user editing the field.
19437
19819
  *
19438
19820
  * @param {object} $form - form target (DOMObject), not the instance
19439
19821
  * @param {object} errors - error map keyed by field name
@@ -19449,29 +19831,37 @@ function ValidatorPlugin(rules, data, formId, culture) {
19449
19831
  if ( !$form || !errors ) {
19450
19832
  return false;
19451
19833
  }
19452
- for (var i = 0, len = $form.length; i < len; ++i) {
19453
- var $field = $form[i];
19454
- var name = $field.getAttribute('name');
19455
- if (
19456
- name
19457
- && typeof(errors[name]) != 'undefined'
19458
- && ( typeof(errors[name].count) != 'function' || errors[name].count() > 0 )
19459
- && $field.type != 'hidden'
19460
- && typeof($field.focus) == 'function'
19461
- ) {
19462
- $field.focus();
19463
- // #A11Y5 (V8) — `typeof focus == 'function'` is true for EVERY HTMLElement,
19464
- // a custom element with neither `tabindex` nor `delegatesFocus` included,
19465
- // whose focus() is a silent no-op (measured). Without confirming the move,
19466
- // the loop reported success and stopped on a control that never took focus,
19467
- // so a failed submit announced nothing. Confirming it is also what makes the
19468
- // "skips unfocusable controls" contract above true rather than aspirational.
19469
- if ( typeof(document) === 'undefined' || !document || document.activeElement === $field ) {
19470
- return true;
19834
+ // #B319 — raise the one-shot answer-focus exemption so the synchronous
19835
+ // `focusin` dispatched by `$field.focus()` below cannot re-enter the
19836
+ // live-check suppression and hide the message this answer just rendered.
19837
+ isAnswerFocusInProgress = true;
19838
+ try {
19839
+ for (var i = 0, len = $form.length; i < len; ++i) {
19840
+ var $field = $form[i];
19841
+ var name = $field.getAttribute('name');
19842
+ if (
19843
+ name
19844
+ && typeof(errors[name]) != 'undefined'
19845
+ && ( typeof(errors[name].count) != 'function' || errors[name].count() > 0 )
19846
+ && $field.type != 'hidden'
19847
+ && typeof($field.focus) == 'function'
19848
+ ) {
19849
+ $field.focus();
19850
+ // #A11Y5 (V8) — `typeof focus == 'function'` is true for EVERY HTMLElement,
19851
+ // a custom element with neither `tabindex` nor `delegatesFocus` included,
19852
+ // whose focus() is a silent no-op (measured). Without confirming the move,
19853
+ // the loop reported success and stopped on a control that never took focus,
19854
+ // so a failed submit announced nothing. Confirming it is also what makes the
19855
+ // "skips unfocusable controls" contract above true rather than aspirational.
19856
+ if ( typeof(document) === 'undefined' || !document || document.activeElement === $field ) {
19857
+ return true;
19858
+ }
19471
19859
  }
19472
19860
  }
19861
+ return false;
19862
+ } finally {
19863
+ isAnswerFocusInProgress = false;
19473
19864
  }
19474
- return false;
19475
19865
  };
19476
19866
 
19477
19867
  /**
@@ -20186,6 +20576,27 @@ function ValidatorPlugin(rules, data, formId, culture) {
20186
20576
  // trigger end of validation
20187
20577
  // console.debug(field +' is the last element to be validated for formId: '+ formId, cb._errors, instance.$forms[formId].errors);
20188
20578
  isFormValid = ( cb._errors.count() > 0 ) ? false : true;
20579
+ // #B295 — `cb._errors` is `d.getErrors(field)`, which
20580
+ // form-validator.js scopes to a SINGLE field, so the flag
20581
+ // above means "this field passed", never "the form is
20582
+ // valid". Everything below is guarded on `!isFormValid`,
20583
+ // so a form that has just become valid got NO update at
20584
+ // all: `updateSubmitTriggerState` was never called and the
20585
+ // bind-time `aria-disabled` marker survived on a valid
20586
+ // form, while `$forms[id].errors` kept listing the field.
20587
+ // That was cosmetic until #B246 made the click gate read
20588
+ // the marker — then the first click after the query
20589
+ // settles is silently eaten.
20590
+ // Hand the verdict to the fresh whole-form pass below,
20591
+ // exactly as the not-last-field branch already does. It is
20592
+ // the only source that can be trusted here: measured with
20593
+ // another field left invalid, that pass reports its error
20594
+ // while both the field-scoped `cb._errors` AND the in-pass
20595
+ // `d.getErrors()` report none — so deciding from either of
20596
+ // those would enable the trigger on an invalid form.
20597
+ if (isFormValid) {
20598
+ needsGlobalReValidation = true;
20599
+ }
20189
20600
  if (!isFormValid && /^true|false$/i.test(instance.$forms[formId].isValidating)) {
20190
20601
  console.debug('[1] Should update error display now ', cb._errors);
20191
20602
  instance.$forms[formId].errors = merge(cb._errors, instance.$forms[formId].errors);
@@ -21793,9 +22204,18 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
21793
22204
  * @param {object} $popin - the registered popin.
21794
22205
  * @param {function} [onMiss] - the caller's click-time load, run only if an adopted
21795
22206
  * in-flight preload ends up failing.
22207
+ * @param {function} [onSettled] - #B285: fired when this consume stops owing
22208
+ * anything — synchronously after a ready (cached) apply, or when an adopted
22209
+ * in-flight preload resolves (success AND failure, before the body/miss
22210
+ * handling — the same release-before-apply order as popinLoad's readyState-4
22211
+ * site). Deliberately a bare notifier: the CALLERS own any busy affordance,
22212
+ * so this function stays loading-state-agnostic.
21796
22213
  * @returns {boolean} true if the preload was (or will be) consumed.
21797
22214
  */
21798
- function consumePreload(url, $popin, onMiss) {
22215
+ function consumePreload(url, $popin, onMiss, onSettled) {
22216
+ var _settle = function () {
22217
+ if ( typeof(onSettled) == 'function' ) { onSettled(); }
22218
+ };
21799
22219
  var slot = preloadCache[url];
21800
22220
  if ( typeof(slot) == 'undefined' ) {
21801
22221
  return false;
@@ -21812,6 +22232,9 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
21812
22232
  preloadWaiters[url] = [];
21813
22233
  }
21814
22234
  preloadWaiters[url].push(function (body) {
22235
+ // #B285 — the adopted wait is over (body or failure): settle FIRST,
22236
+ // matching the cold path's release-before-apply order.
22237
+ _settle();
21815
22238
  if ( body == null ) {
21816
22239
  if ( typeof(onMiss) == 'function' ) { onMiss(); }
21817
22240
  } else {
@@ -21834,6 +22257,10 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
21834
22257
  var $el = ensurePopinDialog($popin);
21835
22258
  if (GINA_ENV_IS_DEV) { updateToolbar(body); }
21836
22259
  handleLoadedBody(body, $popin, $el);
22260
+ // #B285 — synchronous settle: tells the caller no wait ever began, so it
22261
+ // must not arm. Load-bearing, not politeness: without this the caller
22262
+ // could not distinguish ready from in-flight and would arm forever.
22263
+ _settle();
21837
22264
  return true;
21838
22265
  }
21839
22266
 
@@ -22108,7 +22535,17 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22108
22535
  */
22109
22536
  function openFromTrigger($trigger) {
22110
22537
  if (
22111
- $trigger.getAttribute('disabled') != null && $trigger.getAttribute('disabled') != 'false'
22538
+ // #B296: the native `disabled` attribute is only meaningful where the browser
22539
+ // does NOT enforce it. On a real form control the browser suppresses the click
22540
+ // outright (measured: 0 clicks reach JS), so this arm could only ever fire on a
22541
+ // `disabled` written DURING the dispatch — the shape of every consumer
22542
+ // double-submit guard — which silently ate the open and left nothing marked.
22543
+ // Elements the browser does not enforce (`<a>`, custom elements, spans) keep it,
22544
+ // which is also what still honours armPopinTrigger's own `:1923` native write on
22545
+ // a non-<a> trigger. Mirrors the validator's isTriggerDisabled (#B293).
22546
+ // was: $trigger.getAttribute('disabled') != null && ... != 'false'
22547
+ !('disabled' in $trigger)
22548
+ && $trigger.getAttribute('disabled') != null && $trigger.getAttribute('disabled') != 'false'
22112
22549
  || $trigger.getAttribute('aria-disabled') == 'true'
22113
22550
  ) {
22114
22551
  return;
@@ -22161,7 +22598,26 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22161
22598
  // sibling trigger's warm), so skip the consume entirely — its GET
22162
22599
  // always happens at open time.
22163
22600
  var _noPreload = /^false$/i.test($trigger.getAttribute('data-gina-dialog-preload'));
22164
- if ( !_noPreload && consumePreload(descriptor.src, existing, onMiss) ) {
22601
+ // #B285 — an ADOPTED in-flight preload is a genuine wait: arm the trigger
22602
+ // for its duration exactly as the cold click-time XHR does, and release
22603
+ // when the adoption settles (the failure leg re-arms through popinLoad's
22604
+ // own path). The ready branch settles synchronously inside consumePreload,
22605
+ // so _adoptedWait is already false when it returns and nothing is armed —
22606
+ // nothing is owed when nothing is waited for.
22607
+ var _adoptedWait = true;
22608
+ var _armedForAdoption = false;
22609
+ var _onAdoptionSettled = function () {
22610
+ _adoptedWait = false;
22611
+ if (_armedForAdoption) {
22612
+ _armedForAdoption = false;
22613
+ releasePopinTrigger($trigger);
22614
+ }
22615
+ };
22616
+ if ( !_noPreload && consumePreload(descriptor.src, existing, onMiss, _onAdoptionSettled) ) {
22617
+ if (_adoptedWait) {
22618
+ armPopinTrigger($trigger);
22619
+ _armedForAdoption = true;
22620
+ }
22165
22621
  return;
22166
22622
  }
22167
22623
  onMiss();
@@ -22269,6 +22725,30 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22269
22725
  // attach click events
22270
22726
  addListener(gina, $el, evt, function(e) {
22271
22727
  cancelEvent(e);
22728
+ // #B298 — the legacy twin of openFromTrigger's own entry gate; the
22729
+ // predicate is copied verbatim from there, native arm included (see
22730
+ // its comment for why `disabled` counts only where the browser does
22731
+ // not enforce it). armPopinTrigger marks an <a> trigger
22732
+ // `aria-disabled` for the duration of the load, but the only dispatch
22733
+ // route for a legacy trigger — the document click proxy — tests the
22734
+ // native attribute alone, which an <a> never carries; a second click
22735
+ // during the load therefore reached here and started a second XHR.
22736
+ //
22737
+ // Gating HERE rather than in the proxy is load-bearing, not stylistic:
22738
+ // a trigger's direct children each get their own listener from
22739
+ // proxyClick, which fires the custom event DIRECTLY and never passes
22740
+ // the proxy predicate at all. Both routes converge on this handler,
22741
+ // and `currentTarget` is the element bindOpen bound, so a click that
22742
+ // lands on child markup cannot dodge the gate. Measured: a
22743
+ // proxy-level gate still let the child-click route fire twice.
22744
+ var $trigger = e.currentTarget;
22745
+ if (
22746
+ !('disabled' in $trigger)
22747
+ && $trigger.getAttribute('disabled') != null && $trigger.getAttribute('disabled') != 'false'
22748
+ || $trigger.getAttribute('aria-disabled') == 'true'
22749
+ ) {
22750
+ return;
22751
+ }
22272
22752
  // console.debug("[POPIN CLICK #3]", $popin.openTrigger, " VS ", e.currentTarget.id);
22273
22753
  $popin.openTrigger = e.currentTarget.id || e.currentTarget.getAttribute('id');
22274
22754
 
@@ -22315,7 +22795,24 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22315
22795
  // always-refetch means the GET happens at open time, never from
22316
22796
  // the cache (see the openFromTrigger twin).
22317
22797
  var _noPreload = /^false$/i.test(this.getAttribute('data-gina-dialog-preload'));
22318
- if ( !_noPreload && consumePreload(url, $popin, doLoad) ) {
22798
+ // #B285 — same adopted-wait arm as the openFromTrigger twin: a
22799
+ // click adopting a still-in-flight preload waits for real; arm
22800
+ // for the wait, release on settle (a failed adoption's doLoad
22801
+ // re-arms through popinLoad's own path).
22802
+ var _adoptedWait = true;
22803
+ var _armedForAdoption = false;
22804
+ var _onAdoptionSettled = function () {
22805
+ _adoptedWait = false;
22806
+ if (_armedForAdoption) {
22807
+ _armedForAdoption = false;
22808
+ releasePopinTrigger($trigger);
22809
+ }
22810
+ };
22811
+ if ( !_noPreload && consumePreload(url, $popin, doLoad, _onAdoptionSettled) ) {
22812
+ if (_adoptedWait) {
22813
+ armPopinTrigger($trigger);
22814
+ _armedForAdoption = true;
22815
+ }
22319
22816
  return;
22320
22817
  }
22321
22818
  doLoad();
@@ -22344,7 +22841,15 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22344
22841
  // for proxies, use popinInstance.id as target is always `document`
22345
22842
  addListener(gina, document, evt, function(event) {
22346
22843
 
22347
- if ( event.target.getAttribute('disabled') != null && event.target.getAttribute('disabled') != 'false' ) {
22844
+ // #B296: native `disabled` counts only where the browser does not enforce it —
22845
+ // see the openFromTrigger gate for the full rationale. This is the SOLE dispatch
22846
+ // path for legacy `data-gina-popin-name` triggers (bindDelegatedOpen returns
22847
+ // early for them at the `data-gina-dialog` check), so the same guard shape is
22848
+ // latent here. Reachability of THIS site was traced, not exercised.
22849
+ if (
22850
+ !('disabled' in event.target)
22851
+ && event.target.getAttribute('disabled') != null && event.target.getAttribute('disabled') != 'false'
22852
+ ) {
22348
22853
  return false;
22349
22854
  }
22350
22855
 
@@ -22434,7 +22939,16 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22434
22939
  addListener(gina, $element, 'click', function(event) {
22435
22940
  cancelEvent(event);
22436
22941
  // ignore disabled
22437
- if ( event.target.getAttribute('disabled') != null && event.target.getAttribute('disabled') != 'false' ) {
22942
+ // #B296: native `disabled` counts only where the browser does not enforce it —
22943
+ // see the openFromTrigger gate. MEASURED reachable here: an in-popin
22944
+ // `.gina-popin-close` <button> plus a CAPTURE-phase consumer guard leaves the
22945
+ // popin open with nothing marked. A target-phase guard bound after gina's own
22946
+ // listener (:1327) does NOT reproduce it — gina runs first — so this site is
22947
+ // narrower than openFromTrigger's, but real.
22948
+ if (
22949
+ !('disabled' in event.target)
22950
+ && event.target.getAttribute('disabled') != null && event.target.getAttribute('disabled') != 'false'
22951
+ ) {
22438
22952
  return false;
22439
22953
  }
22440
22954
  // NB.: `type == 'action'` will be handled by the form validator
@@ -22463,14 +22977,33 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22463
22977
  event.target.id = event.target.getAttribute('id')
22464
22978
  }
22465
22979
 
22466
- if ( /^popin\.close\./.test(event.target.id) ) {
22980
+ // #B299/#B301: reaching this branch ALREADY proves the element is a
22981
+ // `.gina-popin-close` — register('close', …) has a single call site, fed
22982
+ // only from `$el.querySelectorAll('.gina-popin-close')`. Re-deriving that
22983
+ // fact from the id prefix was the defect twice over: a consumer-supplied
22984
+ // id matches neither prefix (#B299), and `event.target` is whatever was
22985
+ // actually CLICKED, so an icon nested inside the button matched neither
22986
+ // either (#B301 — the ordinary `<button class="gina-popin-close"><svg/></button>`
22987
+ // shape, and the wider of the two). Both left the button inert and silent,
22988
+ // since `cancelEvent` at the top of this listener had already swallowed the
22989
+ // default. So read the element `register()` actually bound —
22990
+ // `event.currentTarget` — and treat a `popin.click.*` id as the SOLE
22991
+ // exception, which preserves the dual-role element (a trigger that is also
22992
+ // a close button; `bindOpen` scans the whole document, so it is reachable)
22993
+ // exactly as before.
22994
+ // The element's id is deliberately NOT touched: the `$close` teardown
22995
+ // sweep removes this listener via `gina.events[eId] == eId`, i.e. it
22996
+ // depends on the event name and the element id being the same string.
22997
+ var _isClickTrigger = /^popin\.click\./.test(event.currentTarget.id);
22998
+
22999
+ if ( !_isClickTrigger ) {
22467
23000
  cancelEvent(event);
22468
23001
  // Just in case we left the popin with a link:target = _blank
22469
23002
  $popin.isRedirecting = false;
22470
23003
  popinClose($popin.name);
22471
23004
  }
22472
23005
 
22473
- if ( /^popin\.click\./.test(event.target.id) ) {
23006
+ if ( _isClickTrigger ) {
22474
23007
  cancelEvent(event);
22475
23008
  var _evt = event.target.id;
22476
23009
 
@@ -22998,6 +23531,34 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
22998
23531
  loadingState.arm($popinTrigger);
22999
23532
  }
23000
23533
 
23534
+ /**
23535
+ * releasePopinTrigger
23536
+ *
23537
+ * armPopinTrigger's mirror: removes the attribute the arm set
23538
+ * (`aria-disabled` on an `<a>`, native `disabled` everywhere else) and
23539
+ * releases the shared `data-gina-loading` marker. Same shape as
23540
+ * popinLoad's own readyState-4 release; used by the adopted-preload
23541
+ * wait (#B285), whose release has no XHR of its own to hang it on.
23542
+ *
23543
+ * @inner
23544
+ * @param {HTMLElement} [$popinTrigger] - the control armPopinTrigger marked
23545
+ * @returns {void}
23546
+ *
23547
+ * @example
23548
+ * releasePopinTrigger($popinTrigger);
23549
+ */
23550
+ function releasePopinTrigger($popinTrigger) {
23551
+ if ( !$popinTrigger ) {
23552
+ return;
23553
+ }
23554
+ if ( /^A$/i.test($popinTrigger.tagName) ) {
23555
+ $popinTrigger.removeAttribute('aria-disabled');
23556
+ } else {
23557
+ $popinTrigger.removeAttribute('disabled');
23558
+ }
23559
+ loadingState.disarm($popinTrigger);
23560
+ }
23561
+
23001
23562
  /**
23002
23563
  * popinLoad
23003
23564
  *
@@ -23786,14 +24347,36 @@ define('gina/popin', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge'
23786
24347
  loadingState.disarm( document.getElementById($popin.openTrigger) );
23787
24348
 
23788
24349
  // removing from FormValidator instance
23789
- if ($validatorInstance) {
23790
- var i = 0, formsLength = $popin['$forms'].length;
23791
- if ($validatorInstance['$forms'] && formsLength > 0) {
23792
- for (; i < formsLength; ++i) {
23793
- if ( typeof($validatorInstance['$forms'][ $popin['$forms'][i] ]) != 'undefined' )
23794
- $validatorInstance['$forms'][ $popin['$forms'][i] ].destroy();
23795
-
23796
- $popin['$forms'].splice( i, 1);
24350
+ if ($validatorInstance && $validatorInstance['$forms']) {
24351
+ // #B265: iterate a COPY, and clear the array ONCE. The previous loop
24352
+ // spliced `$popin['$forms']` while walking it against a length captured
24353
+ // BEFORE the loop, so every element shifted left under the cursor and the
24354
+ // read index skipped one each time: the originally odd-indexed forms were
24355
+ // never destroyed AND were left behind in the very array the loop exists
24356
+ // to empty. Their validator entries then survived pointing at nodes the
24357
+ // `innerHTML = ''` above had already detached, so `validateFormById`
24358
+ // returned the stale entry on the next open and the form — trigger
24359
+ // included — was silently never re-bound.
24360
+ var _formIds = $popin['$forms'].slice();
24361
+ $popin['$forms'].length = 0;
24362
+ for (var i = 0, _formIdsLen = _formIds.length; i < _formIdsLen; ++i) {
24363
+ var $formToDestroy = $validatorInstance['$forms'][ _formIds[i] ];
24364
+ if ( typeof($formToDestroy) == 'undefined' ) {
24365
+ continue;
24366
+ }
24367
+ try {
24368
+ $formToDestroy.destroy();
24369
+ } catch (destroyErr) {
24370
+ // One form must never abort the teardown of the others.
24371
+ // `destroy()` -> `unbindForm` -> `getFormById(vFormId)` throws for
24372
+ // a form holding a `data-gina-form-virtual` file input whose
24373
+ // virtual form is no longer resolvable — and by this point every
24374
+ // form here is detached, which is exactly when that lookup fails.
24375
+ // This hazard is PRE-EXISTING, not introduced by the fix above:
24376
+ // before it, a throw here silently left every LATER form bound.
24377
+ if ( typeof(console) != 'undefined' && console.warn ) {
24378
+ console.warn('[gina] popin teardown: destroy() failed for form `' + _formIds[i] + '`', destroyErr);
24379
+ }
23797
24380
  }
23798
24381
  }
23799
24382
  }
@@ -27150,8 +27733,9 @@ if ( ( typeof(module) !== 'undefined' ) && module.exports ) {
27150
27733
  *
27151
27734
  * <script type="text/javascript" src="/js/vendor/gina/gina.min.js"></script>
27152
27735
  *
27153
- * You can add or edit config options through the `data-gina-config`
27154
- * <script type="text/javascript" src="/js/vendor/gina/gina.min.js" data-gina-config="{ env: 'dev', envIsDev: true, webroot: '/' }"></script>
27736
+ * Config options come from the server-rendered page environment. Once the
27737
+ * framework has loaded, option properties can be added or overridden through
27738
+ * gina.setOptions({ ... })
27155
27739
  *
27156
27740
  * Through RequireJS
27157
27741
  *