gina 0.3.9 → 0.3.10

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 (391) hide show
  1. package/.github/scripts/scan-vendored-cves.js +1 -1
  2. package/.github/workflows/bundle-freshness.yml +3 -3
  3. package/.github/workflows/security.yml +52 -0
  4. package/.github/workflows/vendored-cve.yml +2 -2
  5. package/CHANGELOG.md +12 -4
  6. package/README.md +5 -8
  7. package/ROADMAP.md +1 -0
  8. package/framework/v0.3.10/VERSION +1 -0
  9. package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.js +396 -295
  10. package/framework/v0.3.10/core/asset/plugin/dist/vendor/gina/js/gina.min.js +548 -0
  11. package/framework/v0.3.10/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  12. package/framework/v0.3.10/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  13. package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.v4.js +1 -1
  14. package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.js +19 -1
  15. package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-nunjucks.js +8 -8
  16. package/framework/{v0.3.9 → v0.3.10}/core/gna.js +1 -1
  17. package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/session/src/main.js +2 -2
  18. package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/src/main.js +388 -292
  19. package/framework/{v0.3.9 → v0.3.10}/core/server.isaac.js +16 -0
  20. package/framework/{v0.3.9 → v0.3.10}/core/server.js +4 -4
  21. package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/migrate.js +1 -1
  22. package/framework/{v0.3.9 → v0.3.10}/lib/cmd/inspector/help.txt +2 -2
  23. package/framework/{v0.3.9 → v0.3.10}/lib/collection/src/main.js +8 -3
  24. package/framework/{v0.3.9 → v0.3.10}/package.json +1 -1
  25. package/gna.js +4 -4
  26. package/llms.txt +21 -7
  27. package/package.json +3 -2
  28. package/resources/git-hooks/pre-commit +4 -1
  29. package/script/_load_private_tokens.js +77 -0
  30. package/script/check_no_local_leak.js +49 -21
  31. package/script/retry_lockfile_sync.js +85 -0
  32. package/framework/v0.3.9/VERSION +0 -1
  33. package/framework/v0.3.9/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -545
  34. package/framework/v0.3.9/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  35. package/framework/v0.3.9/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  36. /package/framework/{v0.3.9 → v0.3.10}/AUTHORS +0 -0
  37. /package/framework/{v0.3.9 → v0.3.10}/LICENSE +0 -0
  38. /package/framework/{v0.3.9 → v0.3.10}/core/asset/html/nolayout.html +0 -0
  39. /package/framework/{v0.3.9 → v0.3.10}/core/asset/html/static.html +0 -0
  40. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/android-chrome-192x192.png +0 -0
  41. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/android-chrome-512x512.png +0 -0
  42. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/apple-touch-icon.png +0 -0
  43. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/favicon-16x16.png +0 -0
  44. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/favicon-32x32.png +0 -0
  45. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/favicon.ico +0 -0
  46. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/README.md +0 -0
  47. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  48. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  49. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  50. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  51. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  52. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  53. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  54. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  55. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  56. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  57. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  58. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  59. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  60. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  61. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  62. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  63. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  64. /package/framework/{v0.3.9 → v0.3.10}/core/config.js +0 -0
  65. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/ai/index.js +0 -0
  66. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/ai/lib/connector.js +0 -0
  67. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/index.js +0 -0
  68. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.js +0 -0
  69. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  70. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  71. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  72. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/n1ql.js +0 -0
  73. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.js +0 -0
  74. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  75. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  76. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/mysql/index.js +0 -0
  77. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/mysql/lib/connector.js +0 -0
  78. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/postgresql/index.js +0 -0
  79. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/postgresql/lib/connector.js +0 -0
  80. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/redis/index.js +0 -0
  81. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/redis/lib/session-store.js +0 -0
  82. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sql-parser.js +0 -0
  83. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sqlite/index.js +0 -0
  84. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sqlite/lib/connector.js +0 -0
  85. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sqlite/lib/session-store.js +0 -0
  86. /package/framework/{v0.3.9 → v0.3.10}/core/content.encoding +0 -0
  87. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.framework.js +0 -0
  88. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-json.js +0 -0
  89. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-stream.js +0 -0
  90. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-swig.js +0 -0
  91. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-v1.js +0 -0
  92. /package/framework/{v0.3.9 → v0.3.10}/core/controller/index.js +0 -0
  93. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/LICENSE +0 -0
  94. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/README.md +0 -0
  95. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  96. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  97. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  98. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  99. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/package.json +0 -0
  100. /package/framework/{v0.3.9 → v0.3.10}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  101. /package/framework/{v0.3.9 → v0.3.10}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  102. /package/framework/{v0.3.9 → v0.3.10}/core/deps/streamsearch-1.1.0/package.json +0 -0
  103. /package/framework/{v0.3.9 → v0.3.10}/core/dev/index.js +0 -0
  104. /package/framework/{v0.3.9 → v0.3.10}/core/dev/lib/class.js +0 -0
  105. /package/framework/{v0.3.9 → v0.3.10}/core/dev/lib/factory.js +0 -0
  106. /package/framework/{v0.3.9 → v0.3.10}/core/dev/lib/tools.js +0 -0
  107. /package/framework/{v0.3.9 → v0.3.10}/core/locales/README.md +0 -0
  108. /package/framework/{v0.3.9 → v0.3.10}/core/locales/currency.json +0 -0
  109. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/language/en.json +0 -0
  110. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/language/fr.json +0 -0
  111. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/region/en.json +0 -0
  112. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/region/fr.json +0 -0
  113. /package/framework/{v0.3.9 → v0.3.10}/core/locales/index.js +0 -0
  114. /package/framework/{v0.3.9 → v0.3.10}/core/mime.types +0 -0
  115. /package/framework/{v0.3.9 → v0.3.10}/core/model/entity.js +0 -0
  116. /package/framework/{v0.3.9 → v0.3.10}/core/model/index.js +0 -0
  117. /package/framework/{v0.3.9 → v0.3.10}/core/model/template/entityFactory.js +0 -0
  118. /package/framework/{v0.3.9 → v0.3.10}/core/model/template/index.js +0 -0
  119. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/README.md +0 -0
  120. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/index.js +0 -0
  121. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/csrf/README.md +0 -0
  122. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/csrf/package.json +0 -0
  123. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/csrf/src/main.js +0 -0
  124. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/file/README.md +0 -0
  125. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/file/build.json +0 -0
  126. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/file/package.json +0 -0
  127. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/README.md +0 -0
  128. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/build.json +0 -0
  129. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/package.json +0 -0
  130. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/src/main.js +0 -0
  131. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/session/README.md +0 -0
  132. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/session/package.json +0 -0
  133. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/README.md +0 -0
  134. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/build.json +0 -0
  135. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/package.json +0 -0
  136. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/src/main.js +0 -0
  137. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/README.md +0 -0
  138. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/build.json +0 -0
  139. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/package.json +0 -0
  140. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/src/form-validator.js +0 -0
  141. /package/framework/{v0.3.9 → v0.3.10}/core/router.js +0 -0
  142. /package/framework/{v0.3.9 → v0.3.10}/core/server.express.js +0 -0
  143. /package/framework/{v0.3.9 → v0.3.10}/core/status.codes +0 -0
  144. /package/framework/{v0.3.9 → v0.3.10}/core/template/_gitignore +0 -0
  145. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/app.json +0 -0
  146. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  147. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/routing.json +0 -0
  148. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/settings.json +0 -0
  149. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  150. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/templates.json +0 -0
  151. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  152. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  153. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  154. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  155. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/index.js +0 -0
  156. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  157. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  158. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  159. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  160. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  161. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  162. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/readme.md +0 -0
  163. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  164. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  165. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  166. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  167. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  168. /package/framework/{v0.3.9 → v0.3.10}/core/template/command/gina.bat.tpl +0 -0
  169. /package/framework/{v0.3.9 → v0.3.10}/core/template/command/gina.tpl +0 -0
  170. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/env.json +0 -0
  171. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/manifest.json +0 -0
  172. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/package.json +0 -0
  173. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/settings.json +0 -0
  174. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/statics.json +0 -0
  175. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/templates.json +0 -0
  176. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/client/json/401.json +0 -0
  177. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/client/json/403.json +0 -0
  178. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/client/json/404.json +0 -0
  179. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/server/html/50x.html +0 -0
  180. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/server/json/500.json +0 -0
  181. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/server/json/503.json +0 -0
  182. /package/framework/{v0.3.9 → v0.3.10}/core/template/extensions/logger/config.json +0 -0
  183. /package/framework/{v0.3.9 → v0.3.10}/helpers/console.js +0 -0
  184. /package/framework/{v0.3.9 → v0.3.10}/helpers/context.js +0 -0
  185. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/LICENSE +0 -0
  186. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/README.md +0 -0
  187. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/package.json +0 -0
  188. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/src/main.js +0 -0
  189. /package/framework/{v0.3.9 → v0.3.10}/helpers/dateFormat.js +0 -0
  190. /package/framework/{v0.3.9 → v0.3.10}/helpers/index.js +0 -0
  191. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/LICENSE +0 -0
  192. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/README.md +0 -0
  193. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/package.json +0 -0
  194. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/src/main.js +0 -0
  195. /package/framework/{v0.3.9 → v0.3.10}/helpers/path.js +0 -0
  196. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/README.md +0 -0
  197. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/package.json +0 -0
  198. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/src/api-error.js +0 -0
  199. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/src/main.js +0 -0
  200. /package/framework/{v0.3.9 → v0.3.10}/helpers/prototypes.js +0 -0
  201. /package/framework/{v0.3.9 → v0.3.10}/helpers/task.js +0 -0
  202. /package/framework/{v0.3.9 → v0.3.10}/helpers/text.js +0 -0
  203. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/README.md +0 -0
  204. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/build.json +0 -0
  205. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/package.json +0 -0
  206. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/src/dep/jszip.min.js +0 -0
  207. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/src/main.js +0 -0
  208. /package/framework/{v0.3.9 → v0.3.10}/lib/async/package.json +0 -0
  209. /package/framework/{v0.3.9 → v0.3.10}/lib/async/src/main.js +0 -0
  210. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/README.md +0 -0
  211. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/build.json +0 -0
  212. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/package.json +0 -0
  213. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/src/main.js +0 -0
  214. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/aliases.json +0 -0
  215. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/add.js +0 -0
  216. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/arguments.json +0 -0
  217. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/build.js +0 -0
  218. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/copy.js +0 -0
  219. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/cp.js +0 -0
  220. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/help.js +0 -0
  221. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/help.txt +0 -0
  222. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/list.js +0 -0
  223. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/mcp-start.js +0 -0
  224. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/mcp.js +0 -0
  225. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/oas.js +0 -0
  226. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/openapi.js +0 -0
  227. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/remove.js +0 -0
  228. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/rename.js +0 -0
  229. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/restart.js +0 -0
  230. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/rm.js +0 -0
  231. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/start.js +0 -0
  232. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/status.js +0 -0
  233. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/stop.js +0 -0
  234. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/cache/stats.js +0 -0
  235. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/add.js +0 -0
  236. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/arguments.json +0 -0
  237. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/help.js +0 -0
  238. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/help.txt +0 -0
  239. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/list.js +0 -0
  240. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/remove.js +0 -0
  241. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/rm.js +0 -0
  242. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/add.js +0 -0
  243. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/get.js +0 -0
  244. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/help.js +0 -0
  245. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/help.txt +0 -0
  246. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/link-dev.js +0 -0
  247. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/list.js +0 -0
  248. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/remove.js +0 -0
  249. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/rm.js +0 -0
  250. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/set.js +0 -0
  251. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/unset.js +0 -0
  252. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/use.js +0 -0
  253. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/arguments.json +0 -0
  254. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/build.js +0 -0
  255. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/dot.js +0 -0
  256. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/get.js +0 -0
  257. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/help.js +0 -0
  258. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/help.txt +0 -0
  259. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/init.js +0 -0
  260. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/link-node-modules.js +0 -0
  261. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/link.js +0 -0
  262. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/msg.json +0 -0
  263. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/open.js +0 -0
  264. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/restart.js +0 -0
  265. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/set.js +0 -0
  266. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/start.js +0 -0
  267. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/status.js +0 -0
  268. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/stop.js +0 -0
  269. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/tail.js +0 -0
  270. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/update.js +0 -0
  271. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/version.js +0 -0
  272. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/gina-dev.1.md +0 -0
  273. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/gina-framework.1.md +0 -0
  274. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/gina.1.md +0 -0
  275. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/helper.js +0 -0
  276. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/index.js +0 -0
  277. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/inspector/help.js +0 -0
  278. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/inspector/open.js +0 -0
  279. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/minion/help.js +0 -0
  280. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/minion/help.txt +0 -0
  281. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/msg.json +0 -0
  282. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/help.js +0 -0
  283. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/help.txt +0 -0
  284. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/inc/scan.js +0 -0
  285. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/list.js +0 -0
  286. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/reset.js +0 -0
  287. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/set.js +0 -0
  288. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/add.js +0 -0
  289. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/arguments.json +0 -0
  290. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/build.js +0 -0
  291. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/help.js +0 -0
  292. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/help.txt +0 -0
  293. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/import.js +0 -0
  294. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/list.js +0 -0
  295. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/move.js +0 -0
  296. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/remove.js +0 -0
  297. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/rename.js +0 -0
  298. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/restart.js +0 -0
  299. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/rm.js +0 -0
  300. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/start.js +0 -0
  301. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/status.js +0 -0
  302. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/stop.js +0 -0
  303. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/help.js +0 -0
  304. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/help.txt +0 -0
  305. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/list.js +0 -0
  306. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/set.js +0 -0
  307. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/add.js +0 -0
  308. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/help.js +0 -0
  309. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/help.txt +0 -0
  310. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/link-local.js +0 -0
  311. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/link-production.js +0 -0
  312. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/list.js +0 -0
  313. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/remove.js +0 -0
  314. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/rm.js +0 -0
  315. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/use.js +0 -0
  316. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/service/help.js +0 -0
  317. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/service/help.txt +0 -0
  318. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/service/list.js +0 -0
  319. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/view/add.js +0 -0
  320. /package/framework/{v0.3.9 → v0.3.10}/lib/collection/README.md +0 -0
  321. /package/framework/{v0.3.9 → v0.3.10}/lib/collection/build.json +0 -0
  322. /package/framework/{v0.3.9 → v0.3.10}/lib/collection/package.json +0 -0
  323. /package/framework/{v0.3.9 → v0.3.10}/lib/config.js +0 -0
  324. /package/framework/{v0.3.9 → v0.3.10}/lib/connector-registry/package.json +0 -0
  325. /package/framework/{v0.3.9 → v0.3.10}/lib/connector-registry/src/main.js +0 -0
  326. /package/framework/{v0.3.9 → v0.3.10}/lib/cron/README.md +0 -0
  327. /package/framework/{v0.3.9 → v0.3.10}/lib/cron/package.json +0 -0
  328. /package/framework/{v0.3.9 → v0.3.10}/lib/cron/src/main.js +0 -0
  329. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/LICENSE +0 -0
  330. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/README.md +0 -0
  331. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/package.json +0 -0
  332. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/src/main.js +0 -0
  333. /package/framework/{v0.3.9 → v0.3.10}/lib/generator/index.js +0 -0
  334. /package/framework/{v0.3.9 → v0.3.10}/lib/index.js +0 -0
  335. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/LICENSE +0 -0
  336. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/README.md +0 -0
  337. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/package.json +0 -0
  338. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/src/main.js +0 -0
  339. /package/framework/{v0.3.9 → v0.3.10}/lib/inspector-redact/package.json +0 -0
  340. /package/framework/{v0.3.9 → v0.3.10}/lib/inspector-redact/src/main.js +0 -0
  341. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/README.md +0 -0
  342. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/package.json +0 -0
  343. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/default/index.js +0 -0
  344. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/file/index.js +0 -0
  345. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  346. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  347. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/mq/index.js +0 -0
  348. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/mq/listener.js +0 -0
  349. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/mq/speaker.js +0 -0
  350. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/helper.js +0 -0
  351. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/main.js +0 -0
  352. /package/framework/{v0.3.9 → v0.3.10}/lib/math/index.js +0 -0
  353. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-dispatch/package.json +0 -0
  354. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-dispatch/src/main.js +0 -0
  355. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-http/package.json +0 -0
  356. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-http/src/main.js +0 -0
  357. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-server/package.json +0 -0
  358. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-server/src/main.js +0 -0
  359. /package/framework/{v0.3.9 → v0.3.10}/lib/merge/README.md +0 -0
  360. /package/framework/{v0.3.9 → v0.3.10}/lib/merge/package.json +0 -0
  361. /package/framework/{v0.3.9 → v0.3.10}/lib/merge/src/main.js +0 -0
  362. /package/framework/{v0.3.9 → v0.3.10}/lib/model.js +0 -0
  363. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-filters/README.md +0 -0
  364. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-filters/package.json +0 -0
  365. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-filters/src/main.js +0 -0
  366. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-resolver/package.json +0 -0
  367. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-resolver/src/main.js +0 -0
  368. /package/framework/{v0.3.9 → v0.3.10}/lib/proc.js +0 -0
  369. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/README.md +0 -0
  370. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/build.json +0 -0
  371. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/package.json +0 -0
  372. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/src/main.js +0 -0
  373. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/src/radix.js +0 -0
  374. /package/framework/{v0.3.9 → v0.3.10}/lib/routing-introspect/package.json +0 -0
  375. /package/framework/{v0.3.9 → v0.3.10}/lib/routing-introspect/src/main.js +0 -0
  376. /package/framework/{v0.3.9 → v0.3.10}/lib/session-store.js +0 -0
  377. /package/framework/{v0.3.9 → v0.3.10}/lib/shell.js +0 -0
  378. /package/framework/{v0.3.9 → v0.3.10}/lib/state.js +0 -0
  379. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-filters/README.md +0 -0
  380. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-filters/package.json +0 -0
  381. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-filters/src/main.js +0 -0
  382. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-resolver/package.json +0 -0
  383. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-resolver/src/main.js +0 -0
  384. /package/framework/{v0.3.9 → v0.3.10}/lib/url/README.md +0 -0
  385. /package/framework/{v0.3.9 → v0.3.10}/lib/url/index.js +0 -0
  386. /package/framework/{v0.3.9 → v0.3.10}/lib/url/routing.json +0 -0
  387. /package/framework/{v0.3.9 → v0.3.10}/lib/uuid/package.json +0 -0
  388. /package/framework/{v0.3.9 → v0.3.10}/lib/uuid/src/main.js +0 -0
  389. /package/framework/{v0.3.9 → v0.3.10}/lib/validator.js +0 -0
  390. /package/framework/{v0.3.9 → v0.3.10}/lib/watcher/package.json +0 -0
  391. /package/framework/{v0.3.9 → v0.3.10}/lib/watcher/src/main.js +0 -0
@@ -4193,6 +4193,26 @@ function ValidatorPlugin(rules, data, formId) {
4193
4193
  } //EO for $els
4194
4194
 
4195
4195
  $els = null; $el = null; $elTMP = null; evt = null;
4196
+
4197
+ // [HTML5 form-reassociation support] Drain per-control listeners attached to
4198
+ // reassociated controls during bindForm. The element-by-tagName loops above
4199
+ // walk $form.target's descendant tree only, so reassociated controls (which
4200
+ // live outside that subtree) are invisible to them. We hold a side-table of
4201
+ // {el, evt, fn} triples and remove each listener directly from its element.
4202
+ // Direct removeEventListener (not the gina removeListener helper) avoids
4203
+ // touching gina.events bookkeeping that the form-level proxies still rely on.
4204
+ if ( Array.isArray($form.reassociatedListeners) ) {
4205
+ for (let i = 0, len = $form.reassociatedListeners.length; i < len; i++) {
4206
+ let entry = $form.reassociatedListeners[i];
4207
+ if (entry && entry.el && entry.el.removeEventListener) {
4208
+ entry.el.removeEventListener(entry.evt, entry.fn, false);
4209
+ } else if (entry && entry.el && entry.el.detachEvent) {
4210
+ entry.el.detachEvent('on' + entry.evt, entry.fn);
4211
+ }
4212
+ }
4213
+ $form.reassociatedListeners = [];
4214
+ }
4215
+
4196
4216
  // reset error display
4197
4217
  //resetErrorsDisplay($form);
4198
4218
  // or
@@ -4324,18 +4344,54 @@ function ValidatorPlugin(rules, data, formId) {
4324
4344
  if (!$form.fieldsSet)
4325
4345
  $form.fieldsSet = {};
4326
4346
 
4347
+ // Side-table for per-control listeners attached on form-reassociated controls
4348
+ // (controls whose form="X" attribute points at $target but which live OUTSIDE
4349
+ // $target's DOM subtree). Drained by unbindForm.
4350
+ if (!Array.isArray($form.reassociatedListeners))
4351
+ $form.reassociatedListeners = [];
4352
+
4353
+ // Helper: collect controls owned by $form, including HTML5 form-reassociated
4354
+ // controls (those carrying `form="X"` outside the form's DOM subtree). Walks
4355
+ // $form.elements (HTMLFormControlsCollection — owner-aware) for the primary set,
4356
+ // then a secondary in-tree sweep filtered by `.form === $form` to catch elements
4357
+ // HTMLFormControlsCollection skips (type=image, nameless+idless). The `.form`
4358
+ // filter also excludes in-tree descendants whose `form="..."` points at a different
4359
+ // form (parent-form contamination guard).
4360
+ var getOwnedElements = function($form, tag) {
4361
+ var arr = []
4362
+ , seen = {}
4363
+ , tagUpper = tag.toUpperCase()
4364
+ ;
4365
+ for (let i = 0, len = $form.elements.length; i < len; i++) {
4366
+ let $el = $form.elements[i];
4367
+ if ($el.tagName === tagUpper) {
4368
+ arr.push($el);
4369
+ if ($el.id) seen[$el.id] = true;
4370
+ }
4371
+ }
4372
+ var inTree = $form.getElementsByTagName(tag);
4373
+ for (let i = 0, len = inTree.length; i < len; i++) {
4374
+ let $el = inTree[i];
4375
+ if ($el.form === $form && (!$el.id || !seen[$el.id])) {
4376
+ arr.push($el);
4377
+ }
4378
+ }
4379
+ return arr;
4380
+ };
4381
+
4327
4382
  // binding form elements
4328
4383
  var type = null
4329
4384
  , id = null
4330
4385
 
4331
- // a|links
4386
+ // a|links — DOM-tree only (anchor elements don't carry the HTMLFormControlsCollection
4387
+ // owner relationship; reassociated <a data-gina-form-submit> is not a documented pattern)
4332
4388
  , $a = $target.getElementsByTagName('a')
4333
4389
  // input type: checkbox, radio, hidden, text, files, number, date ...
4334
- , $inputs = $target.getElementsByTagName('input')
4390
+ , $inputs = getOwnedElements($target, 'input')
4335
4391
  // textarea
4336
- , $textareas = $target.getElementsByTagName('textarea')
4392
+ , $textareas = getOwnedElements($target, 'textarea')
4337
4393
  // select
4338
- , $select = $target.getElementsByTagName('select')
4394
+ , $select = getOwnedElements($target, 'select')
4339
4395
  , allFormGroupedElements = {}
4340
4396
  , allFormGroupNames = []
4341
4397
  , formElementGroup = {}
@@ -4431,9 +4487,15 @@ function ValidatorPlugin(rules, data, formId) {
4431
4487
 
4432
4488
  if ( /^(checkbox|radio)$/i.test($inputs[f].type) && typeof($form.fieldsSet[elId].defaultChecked) == 'undefined' ) {
4433
4489
 
4434
-
4490
+ // Read the IDL `defaultChecked` (which mirrors the HTML `checked`
4491
+ // attribute) instead of the live `.checked`. For form-reassociated
4492
+ // radios hit by Chromium's parse-time IDL/attribute desync — sister
4493
+ // bug to the updateRadio reconciliation at commit 80dd89f9 — `.checked`
4494
+ // reads FALSE at bind time despite the attribute being present, so
4495
+ // caching from `.checked` would hold the wrong default and a subsequent
4496
+ // form-reset would clear the originally-checked option.
4435
4497
  $form.fieldsSet[elId].defaultChecked = (
4436
- /^(true|on)$/i.test($inputs[f].checked)
4498
+ $inputs[f].defaultChecked
4437
4499
  ||
4438
4500
  /^(true|on)$/.test(defaultValue)
4439
4501
  && /^(checkbox)$/i.test($inputs[f].type)
@@ -5321,9 +5383,32 @@ function ValidatorPlugin(rules, data, formId) {
5321
5383
  isInit = ( typeof(isInit) == 'undefined' || !isInit ) ? false : true;
5322
5384
  isTriggedByUser = ( typeof(isTriggedByUser) == 'undefined' || !isTriggedByUser ) ? false : true;
5323
5385
 
5386
+ // [HTML5 form-reassociation] Reconcile the IDL `.checked` property with the
5387
+ // `checked` HTML attribute on init when they disagree. Background: when
5388
+ // multiple form-reassociated radios share a `name` AND are DOM descendants of
5389
+ // a common ancestor `<form>`, Chromium-based browsers uncheck the earlier ones
5390
+ // at parse time even though each radio belongs to a distinct form-owner per
5391
+ // the HTML5 spec — leaving `.checked = false` while the `checked` HTML
5392
+ // attribute is still present. Aligning the IDL state with the attribute
5393
+ // matches the author's intent and is a no-op for the normal (non-reassociated)
5394
+ // shape where the two already agree.
5395
+ if ( isInit && !$el.checked && $el.hasAttribute('checked') ) {
5396
+ $el.checked = true;
5397
+ }
5398
+
5324
5399
  var checked = $el.checked, evt = null;
5325
5400
  var isBoolean = /^(true|false)$/i.test($el.value);
5326
- radioGroup = document.getElementsByName($el.name);
5401
+
5402
+ // [HTML5 form-reassociation] Scope the mutual-exclusion peer set by form-owner
5403
+ // per HTML5 spec ("the radio button group that contains a radio button a also
5404
+ // contains all the other input elements b that fulfill ... b's form owner is
5405
+ // a's form owner"). `getElementsByName` returns same-name radios across the
5406
+ // whole document regardless of owner — without this filter, unchecking peers
5407
+ // cross-fires into other forms whose radios happen to share the name.
5408
+ var rawRadioGroup = document.getElementsByName($el.name);
5409
+ radioGroup = Array.prototype.filter.call(rawRadioGroup, function(_r) {
5410
+ return _r.form === $el.form;
5411
+ });
5327
5412
 
5328
5413
  // loop if radio group
5329
5414
  for (let r = 0, rLen = radioGroup.length; r < rLen; ++r) {
@@ -5459,338 +5544,347 @@ function ValidatorPlugin(rules, data, formId) {
5459
5544
 
5460
5545
  evt = 'click';
5461
5546
 
5462
- proceed = function () {
5463
- var subEvent = null;
5464
- // handle form reset
5465
- subEvent = 'reset.'+$target.id;
5466
- if ( typeof(gina.events[subEvent]) == 'undefined' ) {
5467
- addListener(gina, $target, subEvent, function(e) {
5468
- e.preventDefault();
5547
+ // [HTML5 form-reassociation support] Form-level proxy handler bodies extracted as
5548
+ // named expressions so the same handlers can be attached on $target (form-level —
5549
+ // captures bubbled events from in-tree controls) AND on each reassociated control
5550
+ // (per-control — events on reassociated controls bubble through THEIR ancestors,
5551
+ // not through $target, so the form-level listener never fires for them). Handler
5552
+ // bodies read event.target.id and dispatch via gina.events; they don't depend on
5553
+ // event.currentTarget being the form (the few places that reference currentTarget
5554
+ // are guarded fallbacks that no-op on a control).
5555
+ var resetProxyHandler = function(event) {
5556
+ var $el = event.target;
5557
+ if (
5558
+ typeof(event.defaultPrevented) != 'undefined'
5559
+ && event.defaultPrevented
5560
+ ) {
5561
+ return false;
5562
+ }
5563
+ event.preventDefault();
5564
+ var _evt = $el.id;
5565
+ if (!_evt) return false;
5566
+ if ( !/^reset\./.test(_evt) ) {
5567
+ _evt = 'reset.'+$el.id
5568
+ }
5569
+ if (gina.events[_evt]) {
5570
+ triggerEvent(gina, $el, _evt, event.detail);
5571
+ }
5572
+ };
5573
+ var keydownProxyHandler = function(event) {
5574
+ var $el = event.target;
5575
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5576
+ return false;
5469
5577
 
5470
- var _id = e.currentTarget.id || e.target.id
5471
- var $form = instance.$forms[_id];
5472
- $form.target.dataset.ginaFormIsResetting = true;
5473
- resetFields($form);
5474
- // forcing it
5475
- var validationInfo = getFormValidationInfos($form.target, $form.rules, true);
5476
- var fields = validationInfo.fields;
5477
- var $fields = validationInfo.$fields;
5578
+ keyboardMapping[event.keyCode] = event.type == 'keydown';
5478
5579
 
5479
- validate($form.target, fields, $fields, $form.rules, function onSilentResetValidation(result){
5480
- var isFormValid = result.isValid();
5481
- console.debug('silent reset validation result[isValid:'+isFormValid+']: ', result);
5482
- //resetting error display
5483
- handleErrorsDisplay($form.target, {});
5580
+ var _evt = $el.id;
5581
+ if (!_evt) return false;
5484
5582
 
5485
- updateSubmitTriggerState( $form.target , isFormValid );
5486
- $form.target.dataset.ginaFormIsResetting = false;
5487
- });
5488
- })
5583
+ if ( !/^keydown\./.test(_evt) ) {
5584
+ _evt = 'keydown.'+$el.id
5489
5585
  }
5490
- // reset proxy
5491
- addListener(gina, $target, 'reset', function(event) {
5492
- var $el = event.target;
5493
- // prevent event to be triggered twice
5494
- if (
5495
- typeof(event.defaultPrevented) != 'undefined'
5496
- && event.defaultPrevented
5497
- ) {
5498
- return false;
5499
- }
5500
- // Fixed on 2021/06/08 - because of radio reset
5501
- event.preventDefault();
5502
-
5503
- var _evt = $el.id;
5504
- if (!_evt) return false;
5586
+ if (gina.events[_evt]) {
5587
+ cancelEvent(event);
5588
+ triggerEvent(gina, $el, _evt, event.detail, event);
5589
+ }
5590
+ };
5591
+ var keyupProxyHandler = function(event) {
5592
+ var $el = event.target;
5593
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5594
+ return false;
5505
5595
 
5506
- if ( !/^reset\./.test(_evt) ) {
5507
- _evt = 'reset.'+$el.id
5508
- }
5509
- if (gina.events[_evt]) {
5510
- triggerEvent(gina, $el, _evt, event.detail);
5511
- }
5512
- });
5513
- // keydown proxy
5514
- addListener(gina, $target, 'keydown', function(event) {
5515
- var $el = event.target;
5516
- // prevent event to be triggered twice
5517
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5518
- return false;
5596
+ if (keyboardMapping[event.keyCode]) {
5597
+ delete keyboardMapping[event.keyCode]
5598
+ }
5519
5599
 
5520
- keyboardMapping[event.keyCode] = event.type == 'keydown';
5600
+ var _evt = $el.id;
5601
+ if (!_evt) return false;
5602
+ if ( !/^keyup\./.test(_evt) ) {
5603
+ _evt = 'keyup.'+$el.id
5604
+ }
5605
+ if (gina.events[_evt]) {
5606
+ cancelEvent(event);
5607
+ triggerEvent(gina, $el, _evt, event.detail, event);
5608
+ }
5609
+ };
5610
+ var focusinProxyHandler = function(event) {
5611
+ var $el = event.target;
5612
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5613
+ return false;
5521
5614
 
5522
- var _evt = $el.id;
5523
- if (!_evt) return false;
5615
+ var _evt = $el.id;
5616
+ if (!_evt) return false;
5524
5617
 
5525
- if ( !/^keydown\./.test(_evt) ) {
5526
- _evt = 'keydown.'+$el.id
5527
- }
5528
- if (gina.events[_evt]) {
5529
- cancelEvent(event);
5530
- triggerEvent(gina, $el, _evt, event.detail, event);
5531
- }
5532
- });
5533
- // keyup proxy - updating keyboardMapping
5534
- addListener(gina, $target, 'keyup', function(event) {
5535
- var $el = event.target;
5536
- // prevent event to be triggered twice
5537
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5538
- return false;
5618
+ if ( !/^focusin\./.test(_evt) ) {
5619
+ _evt = 'focusin.'+$el.id
5620
+ }
5621
+ if (gina.events[_evt]) {
5622
+ cancelEvent(event);
5539
5623
 
5540
- if (keyboardMapping[event.keyCode]) {
5541
- delete keyboardMapping[event.keyCode]
5624
+ // event.target.form works for both in-tree and reassociated controls
5625
+ // (form-association is owner-relationship-aware); event.currentTarget
5626
+ // is the form when attached form-level, the control when per-control.
5627
+ var formId = event.target.form.getAttribute('id') || ((event.currentTarget && event.currentTarget.getAttribute) ? event.currentTarget.getAttribute('id') : null);
5628
+ var lastFocused = {
5629
+ id : $el.id,
5630
+ name: $el.name
5631
+ };
5632
+ if (!instance.$forms[formId].lastFocused.length) {
5633
+ instance.$forms[formId].lastFocused[0] = lastFocused;
5634
+ } else {
5635
+ instance.$forms[formId].lastFocused.splice(0,0,lastFocused);
5542
5636
  }
5637
+ lastFocused = ( typeof(instance.$forms[formId].lastFocused[1]) != 'undefined' ) ? instance.$forms[formId].lastFocused[1].id : null;
5543
5638
 
5544
- var _evt = $el.id;
5545
- if (!_evt) return false;
5546
- if ( !/^keyup\./.test(_evt) ) {
5547
- _evt = 'keyup.'+$el.id
5548
- }
5549
- if (gina.events[_evt]) {
5550
- cancelEvent(event);
5551
- triggerEvent(gina, $el, _evt, event.detail, event);
5552
- }
5553
- });
5639
+ instance.$forms[formId].lastFocused.splice(2);
5554
5640
 
5555
- // focusin proxy
5556
- addListener(gina, $target, 'focusin', function(event) {
5557
- var $el = event.target;
5558
- // prevent event to be triggered twice
5559
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5641
+ triggerEvent(gina, $el, _evt, event.detail);
5642
+ }
5643
+ };
5644
+ var focusoutProxyHandler = function(event) {
5645
+ var $el = event.target;
5646
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5560
5647
  return false;
5561
5648
 
5562
- var _evt = $el.id;
5563
- if (!_evt) return false;
5564
-
5565
- if ( !/^focusin\./.test(_evt) ) {
5566
- _evt = 'focusin.'+$el.id
5567
- }
5568
- if (gina.events[_evt]) {
5569
- cancelEvent(event);
5570
-
5571
- // Fixed on 2025-03-05 - "last focus" vs "current focus"
5572
- // To get active element: document.activeElement
5573
- var formId = event.target.form.getAttribute('id') || event.currentTarget.getAttribute('id');
5574
- var lastFocused = {
5575
- id : $el.id,
5576
- name: $el.name
5577
- };
5578
- if (!instance.$forms[formId].lastFocused.length) {
5579
- instance.$forms[formId].lastFocused[0] = lastFocused;
5580
- } else {
5581
- instance.$forms[formId].lastFocused.splice(0,0,lastFocused);
5582
- }
5583
- lastFocused = ( typeof(instance.$forms[formId].lastFocused[1]) != 'undefined' ) ? instance.$forms[formId].lastFocused[1].id : null;
5584
-
5585
- // cleanup
5586
- instance.$forms[formId].lastFocused.splice(2);
5649
+ var _evt = $el.id;
5650
+ if (!_evt) return false;
5587
5651
 
5588
- // console.debug('lastFocused: ', lastFocused, ' VS current: ', $el.id);
5589
-
5590
- triggerEvent(gina, $el, _evt, event.detail);
5591
- }
5592
- });
5593
- // focusout proxy
5594
- addListener(gina, $target, 'focusout', function(event) {
5595
- // Never preventDefault from a proxy listner
5596
- var $el = event.target;
5597
- // prevent event to be triggered twice
5598
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5599
- return false;
5652
+ if ( !/^focusout\./.test(_evt) ) {
5653
+ _evt = 'focusout.'+$el.id
5654
+ }
5655
+ if (gina.events[_evt]) {
5656
+ cancelEvent(event);
5600
5657
 
5601
- var _evt = $el.id;
5602
- if (!_evt) return false;
5658
+ triggerEvent(gina, $el, _evt, event.detail);
5659
+ }
5660
+ };
5661
+ var changeProxyHandler = function(event) {
5662
+ var $el = event.target;
5663
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5664
+ return false;
5603
5665
 
5604
- if ( !/^focusout\./.test(_evt) ) {
5605
- _evt = 'focusout.'+$el.id
5606
- }
5607
- if (gina.events[_evt]) {
5608
- cancelEvent(event);
5666
+ var _evt = $el.id;
5667
+ if (!_evt) return false;
5609
5668
 
5610
- triggerEvent(gina, $el, _evt, event.detail);
5611
- }
5612
- });
5669
+ if ( !/^change\./.test(_evt) ) {
5670
+ _evt = 'change.'+$el.id
5671
+ }
5672
+ if (gina.events[_evt]) {
5673
+ cancelEvent(event);
5674
+ triggerEvent(gina, $el, _evt, event.detail);
5675
+ }
5676
+ };
5677
+ var clickProxyHandler = function(event) {
5678
+ var $el = event.target;
5613
5679
 
5614
- // change proxy
5615
- addListener(gina, $target, 'change', function(event) {
5616
- // Never preventDefault from a proxy listner
5617
- var $el = event.target;
5618
- // prevent event to be triggered twice
5619
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5620
- return false;
5680
+ var isCustomSubmit = false, isCaseIgnored = false;
5621
5681
 
5622
- var _evt = $el.id;
5623
- if (!_evt) return false;
5682
+ if (
5683
+ /(label)/i.test(event.target.tagName)
5684
+ && typeof(event.target.control) != 'undefined'
5685
+ && event.target.control != null
5686
+ && /(checkbox|radio)/i.test(event.target.control.type)
5687
+ ||
5688
+ /(label)/i.test(event.target.parentNode.tagName)
5689
+ && typeof(event.target.parentNode.control) != 'undefined'
5690
+ && event.target.parentNode.control != null
5691
+ && /(checkbox|radio)/i.test(event.target.parentNode.control.type)
5692
+ ) {
5693
+ var isCaseIgnored = (
5694
+ event.target.getAttribute('for')
5695
+ ||
5696
+ event.target.parentNode.getAttribute('for')
5697
+ ) ? true : false
5698
+ ;
5699
+ $el = event.target.control || event.target.parentNode.control;
5624
5700
 
5625
- if ( !/^change\./.test(_evt) ) {
5626
- _evt = 'change.'+$el.id
5627
- }
5628
- if (gina.events[_evt]) {
5629
- cancelEvent(event);
5630
- triggerEvent(gina, $el, _evt, event.detail);
5701
+ }
5702
+ if (
5703
+ !$el.disabled
5704
+ && /(checkbox|radio)/i.test($el.type)
5705
+ && !isCaseIgnored
5706
+ ) {
5707
+ if ( /checkbox/i.test($el.type) ) {
5708
+ return updateCheckBox($el);
5709
+ } else if ( /radio/i.test($el.type) ) {
5710
+ return updateRadio($el, false, true);
5631
5711
  }
5632
- });
5633
- // click proxy
5634
- addListener(gina, $target, 'click', function(event) {
5635
- // Never preventDefault from a proxy listner
5636
- var $el = event.target;
5637
- // prevent event to be triggered twice
5638
- // if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5639
- // return false;
5712
+ }
5640
5713
 
5641
- var isCustomSubmit = false, isCaseIgnored = false;
5642
5714
 
5715
+ if (
5716
+ /(button|input)/i.test($el.tagName) && /(submit|checkbox|radio)/i.test($el.type)
5717
+ || /a/i.test($el.tagName) && $el.attributes.getNamedItem('data-gina-form-submit')
5718
+ || /a/i.test($el.parentNode.tagName) && $el.parentNode.attributes.getNamedItem('data-gina-form-submit')
5719
+ ) {
5720
+ var namedItem = $el.attributes.getNamedItem('data-gina-form-submit');
5721
+ var parentNamedItem = $el.parentNode.attributes.getNamedItem('data-gina-form-submit');
5643
5722
  if (
5644
- /(label)/i.test(event.target.tagName)
5645
- && typeof(event.target.control) != 'undefined'
5646
- && event.target.control != null
5647
- && /(checkbox|radio)/i.test(event.target.control.type)
5723
+ namedItem
5648
5724
  ||
5649
- /(label)/i.test(event.target.parentNode.tagName)
5650
- && typeof(event.target.parentNode.control) != 'undefined'
5651
- && event.target.parentNode.control != null
5652
- && /(checkbox|radio)/i.test(event.target.parentNode.control.type)
5725
+ parentNamedItem
5653
5726
  ) {
5654
- var isCaseIgnored = (
5655
- event.target.getAttribute('for')
5656
- ||
5657
- event.target.parentNode.getAttribute('for')
5658
- ) ? true : false
5659
- ;
5660
- // if `event.target.control` not working on all browser,
5661
- // try to detect `for` attribute OR check if on of the label's event.target.children is an input & type == (checkbox|radio)
5662
- $el = event.target.control || event.target.parentNode.control;
5663
-
5664
- }
5665
- if (
5666
- !$el.disabled
5667
- && /(checkbox|radio)/i.test($el.type)
5668
- && !isCaseIgnored
5669
- ) {
5670
- // apply checked choice : if true -> set to false, and if false -> set to true
5671
- if ( /checkbox/i.test($el.type) ) {
5672
- return updateCheckBox($el);
5673
- } else if ( /radio/i.test($el.type) ) {
5674
- return updateRadio($el, false, true);
5727
+ isCustomSubmit = true;
5728
+ // For form-level (event.currentTarget == form), reads the form's
5729
+ // method attribute. For per-control on a reassociated submit, the
5730
+ // currentTarget fallback yields null and the if(newFormMethod) below
5731
+ // skips the override block — typical reassociated submits don't need it.
5732
+ var newFormMethod = null;
5733
+ var $methodSrc = (event.currentTarget && event.currentTarget.getAttribute) ? event.currentTarget : ($el.form || null);
5734
+ if (namedItem) {
5735
+ newFormMethod = $el.getAttribute('data-gina-form-submit-method') || ($methodSrc ? $methodSrc.getAttribute('method') : null);
5736
+ } else {
5737
+ newFormMethod = $el.parentNode.getAttribute('data-gina-form-submit-method') || ($methodSrc ? $methodSrc.getAttribute('method') : null);
5675
5738
  }
5676
- }
5677
-
5678
-
5679
- // include only these elements for the binding
5680
- if (
5681
- /(button|input)/i.test($el.tagName) && /(submit|checkbox|radio)/i.test($el.type)
5682
- || /a/i.test($el.tagName) && $el.attributes.getNamedItem('data-gina-form-submit')
5683
- // You could also have a click on a child element like <a href="#"><span>click me</span></a>
5684
- || /a/i.test($el.parentNode.tagName) && $el.parentNode.attributes.getNamedItem('data-gina-form-submit')
5685
- ) {
5686
- var namedItem = $el.attributes.getNamedItem('data-gina-form-submit');
5687
- var parentNamedItem = $el.parentNode.attributes.getNamedItem('data-gina-form-submit');
5688
- if (
5689
- namedItem
5690
- ||
5691
- parentNamedItem
5692
- ) {
5693
- isCustomSubmit = true;
5694
- // Get others attribute and override current form attribute
5695
- var newFormMethod = null;
5696
- if (namedItem) {
5697
- newFormMethod = $el.getAttribute('data-gina-form-submit-method') || event.currentTarget.getAttribute('method');
5698
- } else {
5699
- newFormMethod = $el.parentNode.getAttribute('data-gina-form-submit-method') || event.currentTarget.getAttribute('method');
5700
- }
5701
- if (newFormMethod) {
5702
- // Backup originalMethod
5703
-
5704
- // Rewrite current method
5705
- if (namedItem && $el.form) {
5706
- if ($el.form.setAttribute) {
5707
- $el.form.setAttribute('method', newFormMethod);
5708
- } else {
5709
- event.currentTarget.setAttribute('method', newFormMethod);
5710
- }
5711
- } else if ($el.parentNode.form) {
5712
- if ($el.parentNode.form.setAttribute) {
5713
- $el.parentNode.form.setAttribute('method', newFormMethod);
5714
- } else {
5715
- event.currentTarget.setAttribute('method', newFormMethod);
5716
- }
5739
+ if (newFormMethod) {
5740
+ if (namedItem && $el.form) {
5741
+ if ($el.form.setAttribute) {
5742
+ $el.form.setAttribute('method', newFormMethod);
5743
+ } else if (event.currentTarget && event.currentTarget.setAttribute) {
5744
+ event.currentTarget.setAttribute('method', newFormMethod);
5745
+ }
5746
+ } else if ($el.parentNode.form) {
5747
+ if ($el.parentNode.form.setAttribute) {
5748
+ $el.parentNode.form.setAttribute('method', newFormMethod);
5749
+ } else if (event.currentTarget && event.currentTarget.setAttribute) {
5750
+ event.currentTarget.setAttribute('method', newFormMethod);
5717
5751
  }
5718
5752
  }
5719
5753
  }
5720
- // safety checking
5721
- if ( typeof($el.id) == 'undefined' || !$el.getAttribute('id') ) {
5722
- $el.setAttribute('id', 'click.' + uuid() );
5723
- $el.id = $el.getAttribute('id')
5724
- } else {
5725
- $el.id = $el.getAttribute('id')
5726
- }
5754
+ }
5755
+ if ( typeof($el.id) == 'undefined' || !$el.getAttribute('id') ) {
5756
+ $el.setAttribute('id', 'click.' + uuid() );
5757
+ $el.id = $el.getAttribute('id')
5758
+ } else {
5759
+ $el.id = $el.getAttribute('id')
5760
+ }
5727
5761
 
5728
5762
 
5729
- if (/^click\./.test($el.id) || withRules) {
5763
+ if (/^click\./.test($el.id) || withRules) {
5730
5764
 
5731
- var _evt = $el.id;
5765
+ var _evt = $el.id;
5732
5766
 
5733
- if (!_evt) return false;
5767
+ if (!_evt) return false;
5734
5768
 
5735
- if ( !/^click\./.test(_evt) ) {
5736
- _evt = $el.id
5737
- }
5769
+ if ( !/^click\./.test(_evt) ) {
5770
+ _evt = $el.id
5771
+ }
5738
5772
 
5739
- // normal case
5740
- if (
5741
- !$el.disabled
5742
- && /(checkbox|radio)/i.test($el.type)
5743
- ) {
5744
- //event.stopPropagation();
5745
- // apply checked choice : if true -> set to false, and if false -> set to true
5746
- if ( /checkbox/i.test($el.type) ) {
5747
- return updateCheckBox($el);
5748
- } else if ( /radio/i.test($el.type) ) {
5749
- return updateRadio($el, false, true);
5750
- }
5773
+ if (
5774
+ !$el.disabled
5775
+ && /(checkbox|radio)/i.test($el.type)
5776
+ ) {
5777
+ if ( /checkbox/i.test($el.type) ) {
5778
+ return updateCheckBox($el);
5779
+ } else if ( /radio/i.test($el.type) ) {
5780
+ return updateRadio($el, false, true);
5751
5781
  }
5782
+ }
5752
5783
 
5753
- // prevent event to be triggered twice
5754
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5755
- return false;
5784
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
5785
+ return false;
5756
5786
 
5757
- // in case we have multiple submit type buttons
5758
- if (
5759
- $el.type == 'submit' && !/^submit\./i.test(_evt)
5760
- ||
5761
- isCustomSubmit && !/^submit\./i.test(_evt)
5762
- ) {
5763
- _evt = 'submit.'+_evt;
5764
- // Updating submitTrigger in case it has been changed on the fly
5765
- instance.$forms[$form.id].submitTrigger = $form.submitTrigger = $el.id;
5766
- }
5767
- // in case we have multiple reset type buttons
5768
- if ( $el.type == 'reset' && !/^reset\./i.test(_evt) ) {
5769
- _evt = 'reset.'+_evt
5770
- }
5771
-
5772
- if (gina.events[_evt]) {
5773
- cancelEvent(event);
5787
+ if (
5788
+ $el.type == 'submit' && !/^submit\./i.test(_evt)
5789
+ ||
5790
+ isCustomSubmit && !/^submit\./i.test(_evt)
5791
+ ) {
5792
+ _evt = 'submit.'+_evt;
5793
+ instance.$forms[$form.id].submitTrigger = $form.submitTrigger = $el.id;
5794
+ }
5795
+ if ( $el.type == 'reset' && !/^reset\./i.test(_evt) ) {
5796
+ _evt = 'reset.'+_evt
5797
+ }
5774
5798
 
5775
- triggerEvent(gina, $el, _evt, event.detail);
5776
- } else if (
5777
- isCustomSubmit
5778
- && typeof(this.id) != 'undefined'
5779
- && this.id != ''
5780
- && typeof(gina.validator.$forms[this.id]) != 'undefined'
5781
- ) {
5782
- gina.validator.getFormById(this.id).submit();
5783
- cancelEvent(event); // stop #navigation
5784
- }
5799
+ if (gina.events[_evt]) {
5800
+ cancelEvent(event);
5785
5801
 
5802
+ triggerEvent(gina, $el, _evt, event.detail);
5803
+ } else if (
5804
+ isCustomSubmit
5805
+ && typeof(this.id) != 'undefined'
5806
+ && this.id != ''
5807
+ && typeof(gina.validator.$forms[this.id]) != 'undefined'
5808
+ ) {
5809
+ gina.validator.getFormById(this.id).submit();
5810
+ cancelEvent(event);
5786
5811
  }
5812
+
5787
5813
  }
5814
+ }
5815
+ };
5788
5816
 
5789
- })
5817
+ proceed = function () {
5818
+ var subEvent = null;
5819
+ // handle form reset
5820
+ subEvent = 'reset.'+$target.id;
5821
+ if ( typeof(gina.events[subEvent]) == 'undefined' ) {
5822
+ addListener(gina, $target, subEvent, function(e) {
5823
+ e.preventDefault();
5824
+
5825
+ var _id = e.currentTarget.id || e.target.id
5826
+ var $form = instance.$forms[_id];
5827
+ $form.target.dataset.ginaFormIsResetting = true;
5828
+ resetFields($form);
5829
+ // forcing it
5830
+ var validationInfo = getFormValidationInfos($form.target, $form.rules, true);
5831
+ var fields = validationInfo.fields;
5832
+ var $fields = validationInfo.$fields;
5833
+
5834
+ validate($form.target, fields, $fields, $form.rules, function onSilentResetValidation(result){
5835
+ var isFormValid = result.isValid();
5836
+ console.debug('silent reset validation result[isValid:'+isFormValid+']: ', result);
5837
+ //resetting error display
5838
+ handleErrorsDisplay($form.target, {});
5839
+
5840
+ updateSubmitTriggerState( $form.target , isFormValid );
5841
+ $form.target.dataset.ginaFormIsResetting = false;
5842
+ });
5843
+ })
5844
+ }
5845
+ // Form-level proxies: capture bubbled events from in-tree controls.
5846
+ addListener(gina, $target, 'reset', resetProxyHandler);
5847
+ addListener(gina, $target, 'keydown', keydownProxyHandler);
5848
+ addListener(gina, $target, 'keyup', keyupProxyHandler);
5849
+ addListener(gina, $target, 'focusin', focusinProxyHandler);
5850
+ addListener(gina, $target, 'focusout', focusoutProxyHandler);
5851
+ addListener(gina, $target, 'change', changeProxyHandler);
5852
+ addListener(gina, $target, 'click', clickProxyHandler);
5790
5853
  }
5791
5854
 
5792
5855
  proceed();
5793
5856
 
5857
+ // [HTML5 form-reassociation support] Per-control listener attachment for
5858
+ // reassociated controls (form="X" pointing at $target but living outside
5859
+ // $target's DOM subtree). Native events on these controls bubble through
5860
+ // their actual ancestors, not through $target, so the form-level proxies
5861
+ // above never see them. Per-control listeners ensure the proxy logic runs.
5862
+ // Tracked on $form.reassociatedListeners for unbindForm cleanup.
5863
+ //
5864
+ // Skipped events:
5865
+ // - 'reset': fires on the form directly when reset() is called or a reset
5866
+ // button submits to the form, regardless of where the button lives. The
5867
+ // form-level reset listener above captures this for both cases.
5868
+ // - 'submit': fires on the form directly when submit() is called or a submit
5869
+ // button submits. Same reasoning as reset.
5870
+ for (let _rIdx = 0, _rLen = $target.elements.length; _rIdx < _rLen; _rIdx++) {
5871
+ let $rEl = $target.elements[_rIdx];
5872
+ if (!$target.contains($rEl)) {
5873
+ addListener(gina, $rEl, 'keydown', keydownProxyHandler);
5874
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'keydown', fn: keydownProxyHandler });
5875
+ addListener(gina, $rEl, 'keyup', keyupProxyHandler);
5876
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'keyup', fn: keyupProxyHandler });
5877
+ addListener(gina, $rEl, 'focusin', focusinProxyHandler);
5878
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'focusin', fn: focusinProxyHandler });
5879
+ addListener(gina, $rEl, 'focusout', focusoutProxyHandler);
5880
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'focusout', fn: focusoutProxyHandler });
5881
+ addListener(gina, $rEl, 'change', changeProxyHandler);
5882
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'change', fn: changeProxyHandler });
5883
+ addListener(gina, $rEl, 'click', clickProxyHandler);
5884
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'click', fn: clickProxyHandler });
5885
+ }
5886
+ }
5887
+
5794
5888
 
5795
5889
 
5796
5890
 
@@ -5904,7 +5998,9 @@ function ValidatorPlugin(rules, data, formId) {
5904
5998
  , linkId = null
5905
5999
  , buttonId = null
5906
6000
  ;
5907
- $buttonsTMP = $target.getElementsByTagName('button');
6001
+ // Owner-aware so reassociated submit buttons (<button form="X" type="submit">
6002
+ // outside $target's subtree) are bound to the correct form.
6003
+ $buttonsTMP = getOwnedElements($target, 'button');
5908
6004
  if ( $buttonsTMP.length > 0 ) {
5909
6005
  for (let b = 0, len = $buttonsTMP.length; b < len; ++b) {
5910
6006
  if ($buttonsTMP[b].type == 'submit') {
@@ -5913,7 +6009,7 @@ function ValidatorPlugin(rules, data, formId) {
5913
6009
  }
5914
6010
  }
5915
6011
 
5916
- // binding links
6012
+ // binding links — DOM-tree only; <a> doesn't participate in HTMLFormControlsCollection
5917
6013
  $buttonsTMP = $target.getElementsByTagName('a');
5918
6014
  if ( $buttonsTMP.length > 0 ) {
5919
6015
  for (let b = 0, len = $buttonsTMP.length; b < len; ++b) {