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
@@ -13681,6 +13681,26 @@ function ValidatorPlugin(rules, data, formId) {
13681
13681
  } //EO for $els
13682
13682
 
13683
13683
  $els = null; $el = null; $elTMP = null; evt = null;
13684
+
13685
+ // [HTML5 form-reassociation support] Drain per-control listeners attached to
13686
+ // reassociated controls during bindForm. The element-by-tagName loops above
13687
+ // walk $form.target's descendant tree only, so reassociated controls (which
13688
+ // live outside that subtree) are invisible to them. We hold a side-table of
13689
+ // {el, evt, fn} triples and remove each listener directly from its element.
13690
+ // Direct removeEventListener (not the gina removeListener helper) avoids
13691
+ // touching gina.events bookkeeping that the form-level proxies still rely on.
13692
+ if ( Array.isArray($form.reassociatedListeners) ) {
13693
+ for (let i = 0, len = $form.reassociatedListeners.length; i < len; i++) {
13694
+ let entry = $form.reassociatedListeners[i];
13695
+ if (entry && entry.el && entry.el.removeEventListener) {
13696
+ entry.el.removeEventListener(entry.evt, entry.fn, false);
13697
+ } else if (entry && entry.el && entry.el.detachEvent) {
13698
+ entry.el.detachEvent('on' + entry.evt, entry.fn);
13699
+ }
13700
+ }
13701
+ $form.reassociatedListeners = [];
13702
+ }
13703
+
13684
13704
  // reset error display
13685
13705
  //resetErrorsDisplay($form);
13686
13706
  // or
@@ -13812,18 +13832,54 @@ function ValidatorPlugin(rules, data, formId) {
13812
13832
  if (!$form.fieldsSet)
13813
13833
  $form.fieldsSet = {};
13814
13834
 
13835
+ // Side-table for per-control listeners attached on form-reassociated controls
13836
+ // (controls whose form="X" attribute points at $target but which live OUTSIDE
13837
+ // $target's DOM subtree). Drained by unbindForm.
13838
+ if (!Array.isArray($form.reassociatedListeners))
13839
+ $form.reassociatedListeners = [];
13840
+
13841
+ // Helper: collect controls owned by $form, including HTML5 form-reassociated
13842
+ // controls (those carrying `form="X"` outside the form's DOM subtree). Walks
13843
+ // $form.elements (HTMLFormControlsCollection — owner-aware) for the primary set,
13844
+ // then a secondary in-tree sweep filtered by `.form === $form` to catch elements
13845
+ // HTMLFormControlsCollection skips (type=image, nameless+idless). The `.form`
13846
+ // filter also excludes in-tree descendants whose `form="..."` points at a different
13847
+ // form (parent-form contamination guard).
13848
+ var getOwnedElements = function($form, tag) {
13849
+ var arr = []
13850
+ , seen = {}
13851
+ , tagUpper = tag.toUpperCase()
13852
+ ;
13853
+ for (let i = 0, len = $form.elements.length; i < len; i++) {
13854
+ let $el = $form.elements[i];
13855
+ if ($el.tagName === tagUpper) {
13856
+ arr.push($el);
13857
+ if ($el.id) seen[$el.id] = true;
13858
+ }
13859
+ }
13860
+ var inTree = $form.getElementsByTagName(tag);
13861
+ for (let i = 0, len = inTree.length; i < len; i++) {
13862
+ let $el = inTree[i];
13863
+ if ($el.form === $form && (!$el.id || !seen[$el.id])) {
13864
+ arr.push($el);
13865
+ }
13866
+ }
13867
+ return arr;
13868
+ };
13869
+
13815
13870
  // binding form elements
13816
13871
  var type = null
13817
13872
  , id = null
13818
13873
 
13819
- // a|links
13874
+ // a|links — DOM-tree only (anchor elements don't carry the HTMLFormControlsCollection
13875
+ // owner relationship; reassociated <a data-gina-form-submit> is not a documented pattern)
13820
13876
  , $a = $target.getElementsByTagName('a')
13821
13877
  // input type: checkbox, radio, hidden, text, files, number, date ...
13822
- , $inputs = $target.getElementsByTagName('input')
13878
+ , $inputs = getOwnedElements($target, 'input')
13823
13879
  // textarea
13824
- , $textareas = $target.getElementsByTagName('textarea')
13880
+ , $textareas = getOwnedElements($target, 'textarea')
13825
13881
  // select
13826
- , $select = $target.getElementsByTagName('select')
13882
+ , $select = getOwnedElements($target, 'select')
13827
13883
  , allFormGroupedElements = {}
13828
13884
  , allFormGroupNames = []
13829
13885
  , formElementGroup = {}
@@ -13919,9 +13975,15 @@ function ValidatorPlugin(rules, data, formId) {
13919
13975
 
13920
13976
  if ( /^(checkbox|radio)$/i.test($inputs[f].type) && typeof($form.fieldsSet[elId].defaultChecked) == 'undefined' ) {
13921
13977
 
13922
-
13978
+ // Read the IDL `defaultChecked` (which mirrors the HTML `checked`
13979
+ // attribute) instead of the live `.checked`. For form-reassociated
13980
+ // radios hit by Chromium's parse-time IDL/attribute desync — sister
13981
+ // bug to the updateRadio reconciliation at commit 80dd89f9 — `.checked`
13982
+ // reads FALSE at bind time despite the attribute being present, so
13983
+ // caching from `.checked` would hold the wrong default and a subsequent
13984
+ // form-reset would clear the originally-checked option.
13923
13985
  $form.fieldsSet[elId].defaultChecked = (
13924
- /^(true|on)$/i.test($inputs[f].checked)
13986
+ $inputs[f].defaultChecked
13925
13987
  ||
13926
13988
  /^(true|on)$/.test(defaultValue)
13927
13989
  && /^(checkbox)$/i.test($inputs[f].type)
@@ -14809,9 +14871,32 @@ function ValidatorPlugin(rules, data, formId) {
14809
14871
  isInit = ( typeof(isInit) == 'undefined' || !isInit ) ? false : true;
14810
14872
  isTriggedByUser = ( typeof(isTriggedByUser) == 'undefined' || !isTriggedByUser ) ? false : true;
14811
14873
 
14874
+ // [HTML5 form-reassociation] Reconcile the IDL `.checked` property with the
14875
+ // `checked` HTML attribute on init when they disagree. Background: when
14876
+ // multiple form-reassociated radios share a `name` AND are DOM descendants of
14877
+ // a common ancestor `<form>`, Chromium-based browsers uncheck the earlier ones
14878
+ // at parse time even though each radio belongs to a distinct form-owner per
14879
+ // the HTML5 spec — leaving `.checked = false` while the `checked` HTML
14880
+ // attribute is still present. Aligning the IDL state with the attribute
14881
+ // matches the author's intent and is a no-op for the normal (non-reassociated)
14882
+ // shape where the two already agree.
14883
+ if ( isInit && !$el.checked && $el.hasAttribute('checked') ) {
14884
+ $el.checked = true;
14885
+ }
14886
+
14812
14887
  var checked = $el.checked, evt = null;
14813
14888
  var isBoolean = /^(true|false)$/i.test($el.value);
14814
- radioGroup = document.getElementsByName($el.name);
14889
+
14890
+ // [HTML5 form-reassociation] Scope the mutual-exclusion peer set by form-owner
14891
+ // per HTML5 spec ("the radio button group that contains a radio button a also
14892
+ // contains all the other input elements b that fulfill ... b's form owner is
14893
+ // a's form owner"). `getElementsByName` returns same-name radios across the
14894
+ // whole document regardless of owner — without this filter, unchecking peers
14895
+ // cross-fires into other forms whose radios happen to share the name.
14896
+ var rawRadioGroup = document.getElementsByName($el.name);
14897
+ radioGroup = Array.prototype.filter.call(rawRadioGroup, function(_r) {
14898
+ return _r.form === $el.form;
14899
+ });
14815
14900
 
14816
14901
  // loop if radio group
14817
14902
  for (let r = 0, rLen = radioGroup.length; r < rLen; ++r) {
@@ -14947,338 +15032,347 @@ function ValidatorPlugin(rules, data, formId) {
14947
15032
 
14948
15033
  evt = 'click';
14949
15034
 
14950
- proceed = function () {
14951
- var subEvent = null;
14952
- // handle form reset
14953
- subEvent = 'reset.'+$target.id;
14954
- if ( typeof(gina.events[subEvent]) == 'undefined' ) {
14955
- addListener(gina, $target, subEvent, function(e) {
14956
- e.preventDefault();
15035
+ // [HTML5 form-reassociation support] Form-level proxy handler bodies extracted as
15036
+ // named expressions so the same handlers can be attached on $target (form-level —
15037
+ // captures bubbled events from in-tree controls) AND on each reassociated control
15038
+ // (per-control — events on reassociated controls bubble through THEIR ancestors,
15039
+ // not through $target, so the form-level listener never fires for them). Handler
15040
+ // bodies read event.target.id and dispatch via gina.events; they don't depend on
15041
+ // event.currentTarget being the form (the few places that reference currentTarget
15042
+ // are guarded fallbacks that no-op on a control).
15043
+ var resetProxyHandler = function(event) {
15044
+ var $el = event.target;
15045
+ if (
15046
+ typeof(event.defaultPrevented) != 'undefined'
15047
+ && event.defaultPrevented
15048
+ ) {
15049
+ return false;
15050
+ }
15051
+ event.preventDefault();
15052
+ var _evt = $el.id;
15053
+ if (!_evt) return false;
15054
+ if ( !/^reset\./.test(_evt) ) {
15055
+ _evt = 'reset.'+$el.id
15056
+ }
15057
+ if (gina.events[_evt]) {
15058
+ triggerEvent(gina, $el, _evt, event.detail);
15059
+ }
15060
+ };
15061
+ var keydownProxyHandler = function(event) {
15062
+ var $el = event.target;
15063
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15064
+ return false;
14957
15065
 
14958
- var _id = e.currentTarget.id || e.target.id
14959
- var $form = instance.$forms[_id];
14960
- $form.target.dataset.ginaFormIsResetting = true;
14961
- resetFields($form);
14962
- // forcing it
14963
- var validationInfo = getFormValidationInfos($form.target, $form.rules, true);
14964
- var fields = validationInfo.fields;
14965
- var $fields = validationInfo.$fields;
15066
+ keyboardMapping[event.keyCode] = event.type == 'keydown';
14966
15067
 
14967
- validate($form.target, fields, $fields, $form.rules, function onSilentResetValidation(result){
14968
- var isFormValid = result.isValid();
14969
- console.debug('silent reset validation result[isValid:'+isFormValid+']: ', result);
14970
- //resetting error display
14971
- handleErrorsDisplay($form.target, {});
15068
+ var _evt = $el.id;
15069
+ if (!_evt) return false;
14972
15070
 
14973
- updateSubmitTriggerState( $form.target , isFormValid );
14974
- $form.target.dataset.ginaFormIsResetting = false;
14975
- });
14976
- })
15071
+ if ( !/^keydown\./.test(_evt) ) {
15072
+ _evt = 'keydown.'+$el.id
14977
15073
  }
14978
- // reset proxy
14979
- addListener(gina, $target, 'reset', function(event) {
14980
- var $el = event.target;
14981
- // prevent event to be triggered twice
14982
- if (
14983
- typeof(event.defaultPrevented) != 'undefined'
14984
- && event.defaultPrevented
14985
- ) {
14986
- return false;
14987
- }
14988
- // Fixed on 2021/06/08 - because of radio reset
14989
- event.preventDefault();
15074
+ if (gina.events[_evt]) {
15075
+ cancelEvent(event);
15076
+ triggerEvent(gina, $el, _evt, event.detail, event);
15077
+ }
15078
+ };
15079
+ var keyupProxyHandler = function(event) {
15080
+ var $el = event.target;
15081
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15082
+ return false;
14990
15083
 
14991
- var _evt = $el.id;
14992
- if (!_evt) return false;
15084
+ if (keyboardMapping[event.keyCode]) {
15085
+ delete keyboardMapping[event.keyCode]
15086
+ }
14993
15087
 
14994
- if ( !/^reset\./.test(_evt) ) {
14995
- _evt = 'reset.'+$el.id
14996
- }
14997
- if (gina.events[_evt]) {
14998
- triggerEvent(gina, $el, _evt, event.detail);
14999
- }
15000
- });
15001
- // keydown proxy
15002
- addListener(gina, $target, 'keydown', function(event) {
15003
- var $el = event.target;
15004
- // prevent event to be triggered twice
15005
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15006
- return false;
15088
+ var _evt = $el.id;
15089
+ if (!_evt) return false;
15090
+ if ( !/^keyup\./.test(_evt) ) {
15091
+ _evt = 'keyup.'+$el.id
15092
+ }
15093
+ if (gina.events[_evt]) {
15094
+ cancelEvent(event);
15095
+ triggerEvent(gina, $el, _evt, event.detail, event);
15096
+ }
15097
+ };
15098
+ var focusinProxyHandler = function(event) {
15099
+ var $el = event.target;
15100
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15101
+ return false;
15007
15102
 
15008
- keyboardMapping[event.keyCode] = event.type == 'keydown';
15103
+ var _evt = $el.id;
15104
+ if (!_evt) return false;
15009
15105
 
15010
- var _evt = $el.id;
15011
- if (!_evt) return false;
15106
+ if ( !/^focusin\./.test(_evt) ) {
15107
+ _evt = 'focusin.'+$el.id
15108
+ }
15109
+ if (gina.events[_evt]) {
15110
+ cancelEvent(event);
15012
15111
 
15013
- if ( !/^keydown\./.test(_evt) ) {
15014
- _evt = 'keydown.'+$el.id
15015
- }
15016
- if (gina.events[_evt]) {
15017
- cancelEvent(event);
15018
- triggerEvent(gina, $el, _evt, event.detail, event);
15112
+ // event.target.form works for both in-tree and reassociated controls
15113
+ // (form-association is owner-relationship-aware); event.currentTarget
15114
+ // is the form when attached form-level, the control when per-control.
15115
+ var formId = event.target.form.getAttribute('id') || ((event.currentTarget && event.currentTarget.getAttribute) ? event.currentTarget.getAttribute('id') : null);
15116
+ var lastFocused = {
15117
+ id : $el.id,
15118
+ name: $el.name
15119
+ };
15120
+ if (!instance.$forms[formId].lastFocused.length) {
15121
+ instance.$forms[formId].lastFocused[0] = lastFocused;
15122
+ } else {
15123
+ instance.$forms[formId].lastFocused.splice(0,0,lastFocused);
15019
15124
  }
15020
- });
15021
- // keyup proxy - updating keyboardMapping
15022
- addListener(gina, $target, 'keyup', function(event) {
15023
- var $el = event.target;
15024
- // prevent event to be triggered twice
15025
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15026
- return false;
15125
+ lastFocused = ( typeof(instance.$forms[formId].lastFocused[1]) != 'undefined' ) ? instance.$forms[formId].lastFocused[1].id : null;
15027
15126
 
15028
- if (keyboardMapping[event.keyCode]) {
15029
- delete keyboardMapping[event.keyCode]
15030
- }
15127
+ instance.$forms[formId].lastFocused.splice(2);
15031
15128
 
15032
- var _evt = $el.id;
15033
- if (!_evt) return false;
15034
- if ( !/^keyup\./.test(_evt) ) {
15035
- _evt = 'keyup.'+$el.id
15036
- }
15037
- if (gina.events[_evt]) {
15038
- cancelEvent(event);
15039
- triggerEvent(gina, $el, _evt, event.detail, event);
15040
- }
15041
- });
15042
-
15043
- // focusin proxy
15044
- addListener(gina, $target, 'focusin', function(event) {
15045
- var $el = event.target;
15046
- // prevent event to be triggered twice
15047
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15129
+ triggerEvent(gina, $el, _evt, event.detail);
15130
+ }
15131
+ };
15132
+ var focusoutProxyHandler = function(event) {
15133
+ var $el = event.target;
15134
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15048
15135
  return false;
15049
15136
 
15050
- var _evt = $el.id;
15051
- if (!_evt) return false;
15137
+ var _evt = $el.id;
15138
+ if (!_evt) return false;
15052
15139
 
15053
- if ( !/^focusin\./.test(_evt) ) {
15054
- _evt = 'focusin.'+$el.id
15055
- }
15056
- if (gina.events[_evt]) {
15057
- cancelEvent(event);
15140
+ if ( !/^focusout\./.test(_evt) ) {
15141
+ _evt = 'focusout.'+$el.id
15142
+ }
15143
+ if (gina.events[_evt]) {
15144
+ cancelEvent(event);
15058
15145
 
15059
- // Fixed on 2025-03-05 - "last focus" vs "current focus"
15060
- // To get active element: document.activeElement
15061
- var formId = event.target.form.getAttribute('id') || event.currentTarget.getAttribute('id');
15062
- var lastFocused = {
15063
- id : $el.id,
15064
- name: $el.name
15065
- };
15066
- if (!instance.$forms[formId].lastFocused.length) {
15067
- instance.$forms[formId].lastFocused[0] = lastFocused;
15068
- } else {
15069
- instance.$forms[formId].lastFocused.splice(0,0,lastFocused);
15070
- }
15071
- lastFocused = ( typeof(instance.$forms[formId].lastFocused[1]) != 'undefined' ) ? instance.$forms[formId].lastFocused[1].id : null;
15146
+ triggerEvent(gina, $el, _evt, event.detail);
15147
+ }
15148
+ };
15149
+ var changeProxyHandler = function(event) {
15150
+ var $el = event.target;
15151
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15152
+ return false;
15072
15153
 
15073
- // cleanup
15074
- instance.$forms[formId].lastFocused.splice(2);
15154
+ var _evt = $el.id;
15155
+ if (!_evt) return false;
15075
15156
 
15076
- // console.debug('lastFocused: ', lastFocused, ' VS current: ', $el.id);
15157
+ if ( !/^change\./.test(_evt) ) {
15158
+ _evt = 'change.'+$el.id
15159
+ }
15160
+ if (gina.events[_evt]) {
15161
+ cancelEvent(event);
15162
+ triggerEvent(gina, $el, _evt, event.detail);
15163
+ }
15164
+ };
15165
+ var clickProxyHandler = function(event) {
15166
+ var $el = event.target;
15077
15167
 
15078
- triggerEvent(gina, $el, _evt, event.detail);
15079
- }
15080
- });
15081
- // focusout proxy
15082
- addListener(gina, $target, 'focusout', function(event) {
15083
- // Never preventDefault from a proxy listner
15084
- var $el = event.target;
15085
- // prevent event to be triggered twice
15086
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15087
- return false;
15168
+ var isCustomSubmit = false, isCaseIgnored = false;
15088
15169
 
15089
- var _evt = $el.id;
15090
- if (!_evt) return false;
15170
+ if (
15171
+ /(label)/i.test(event.target.tagName)
15172
+ && typeof(event.target.control) != 'undefined'
15173
+ && event.target.control != null
15174
+ && /(checkbox|radio)/i.test(event.target.control.type)
15175
+ ||
15176
+ /(label)/i.test(event.target.parentNode.tagName)
15177
+ && typeof(event.target.parentNode.control) != 'undefined'
15178
+ && event.target.parentNode.control != null
15179
+ && /(checkbox|radio)/i.test(event.target.parentNode.control.type)
15180
+ ) {
15181
+ var isCaseIgnored = (
15182
+ event.target.getAttribute('for')
15183
+ ||
15184
+ event.target.parentNode.getAttribute('for')
15185
+ ) ? true : false
15186
+ ;
15187
+ $el = event.target.control || event.target.parentNode.control;
15091
15188
 
15092
- if ( !/^focusout\./.test(_evt) ) {
15093
- _evt = 'focusout.'+$el.id
15189
+ }
15190
+ if (
15191
+ !$el.disabled
15192
+ && /(checkbox|radio)/i.test($el.type)
15193
+ && !isCaseIgnored
15194
+ ) {
15195
+ if ( /checkbox/i.test($el.type) ) {
15196
+ return updateCheckBox($el);
15197
+ } else if ( /radio/i.test($el.type) ) {
15198
+ return updateRadio($el, false, true);
15094
15199
  }
15095
- if (gina.events[_evt]) {
15096
- cancelEvent(event);
15200
+ }
15201
+
15097
15202
 
15098
- triggerEvent(gina, $el, _evt, event.detail);
15203
+ if (
15204
+ /(button|input)/i.test($el.tagName) && /(submit|checkbox|radio)/i.test($el.type)
15205
+ || /a/i.test($el.tagName) && $el.attributes.getNamedItem('data-gina-form-submit')
15206
+ || /a/i.test($el.parentNode.tagName) && $el.parentNode.attributes.getNamedItem('data-gina-form-submit')
15207
+ ) {
15208
+ var namedItem = $el.attributes.getNamedItem('data-gina-form-submit');
15209
+ var parentNamedItem = $el.parentNode.attributes.getNamedItem('data-gina-form-submit');
15210
+ if (
15211
+ namedItem
15212
+ ||
15213
+ parentNamedItem
15214
+ ) {
15215
+ isCustomSubmit = true;
15216
+ // For form-level (event.currentTarget == form), reads the form's
15217
+ // method attribute. For per-control on a reassociated submit, the
15218
+ // currentTarget fallback yields null and the if(newFormMethod) below
15219
+ // skips the override block — typical reassociated submits don't need it.
15220
+ var newFormMethod = null;
15221
+ var $methodSrc = (event.currentTarget && event.currentTarget.getAttribute) ? event.currentTarget : ($el.form || null);
15222
+ if (namedItem) {
15223
+ newFormMethod = $el.getAttribute('data-gina-form-submit-method') || ($methodSrc ? $methodSrc.getAttribute('method') : null);
15224
+ } else {
15225
+ newFormMethod = $el.parentNode.getAttribute('data-gina-form-submit-method') || ($methodSrc ? $methodSrc.getAttribute('method') : null);
15226
+ }
15227
+ if (newFormMethod) {
15228
+ if (namedItem && $el.form) {
15229
+ if ($el.form.setAttribute) {
15230
+ $el.form.setAttribute('method', newFormMethod);
15231
+ } else if (event.currentTarget && event.currentTarget.setAttribute) {
15232
+ event.currentTarget.setAttribute('method', newFormMethod);
15233
+ }
15234
+ } else if ($el.parentNode.form) {
15235
+ if ($el.parentNode.form.setAttribute) {
15236
+ $el.parentNode.form.setAttribute('method', newFormMethod);
15237
+ } else if (event.currentTarget && event.currentTarget.setAttribute) {
15238
+ event.currentTarget.setAttribute('method', newFormMethod);
15239
+ }
15240
+ }
15241
+ }
15242
+ }
15243
+ if ( typeof($el.id) == 'undefined' || !$el.getAttribute('id') ) {
15244
+ $el.setAttribute('id', 'click.' + uuid() );
15245
+ $el.id = $el.getAttribute('id')
15246
+ } else {
15247
+ $el.id = $el.getAttribute('id')
15099
15248
  }
15100
- });
15101
15249
 
15102
- // change proxy
15103
- addListener(gina, $target, 'change', function(event) {
15104
- // Never preventDefault from a proxy listner
15105
- var $el = event.target;
15106
- // prevent event to be triggered twice
15107
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15108
- return false;
15109
15250
 
15110
- var _evt = $el.id;
15111
- if (!_evt) return false;
15251
+ if (/^click\./.test($el.id) || withRules) {
15112
15252
 
15113
- if ( !/^change\./.test(_evt) ) {
15114
- _evt = 'change.'+$el.id
15115
- }
15116
- if (gina.events[_evt]) {
15117
- cancelEvent(event);
15118
- triggerEvent(gina, $el, _evt, event.detail);
15119
- }
15120
- });
15121
- // click proxy
15122
- addListener(gina, $target, 'click', function(event) {
15123
- // Never preventDefault from a proxy listner
15124
- var $el = event.target;
15125
- // prevent event to be triggered twice
15126
- // if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15127
- // return false;
15253
+ var _evt = $el.id;
15128
15254
 
15129
- var isCustomSubmit = false, isCaseIgnored = false;
15255
+ if (!_evt) return false;
15130
15256
 
15131
- if (
15132
- /(label)/i.test(event.target.tagName)
15133
- && typeof(event.target.control) != 'undefined'
15134
- && event.target.control != null
15135
- && /(checkbox|radio)/i.test(event.target.control.type)
15136
- ||
15137
- /(label)/i.test(event.target.parentNode.tagName)
15138
- && typeof(event.target.parentNode.control) != 'undefined'
15139
- && event.target.parentNode.control != null
15140
- && /(checkbox|radio)/i.test(event.target.parentNode.control.type)
15141
- ) {
15142
- var isCaseIgnored = (
15143
- event.target.getAttribute('for')
15144
- ||
15145
- event.target.parentNode.getAttribute('for')
15146
- ) ? true : false
15147
- ;
15148
- // if `event.target.control` not working on all browser,
15149
- // try to detect `for` attribute OR check if on of the label's event.target.children is an input & type == (checkbox|radio)
15150
- $el = event.target.control || event.target.parentNode.control;
15257
+ if ( !/^click\./.test(_evt) ) {
15258
+ _evt = $el.id
15259
+ }
15151
15260
 
15152
- }
15153
- if (
15154
- !$el.disabled
15155
- && /(checkbox|radio)/i.test($el.type)
15156
- && !isCaseIgnored
15157
- ) {
15158
- // apply checked choice : if true -> set to false, and if false -> set to true
15159
- if ( /checkbox/i.test($el.type) ) {
15160
- return updateCheckBox($el);
15161
- } else if ( /radio/i.test($el.type) ) {
15162
- return updateRadio($el, false, true);
15261
+ if (
15262
+ !$el.disabled
15263
+ && /(checkbox|radio)/i.test($el.type)
15264
+ ) {
15265
+ if ( /checkbox/i.test($el.type) ) {
15266
+ return updateCheckBox($el);
15267
+ } else if ( /radio/i.test($el.type) ) {
15268
+ return updateRadio($el, false, true);
15269
+ }
15163
15270
  }
15164
- }
15165
15271
 
15272
+ if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15273
+ return false;
15166
15274
 
15167
- // include only these elements for the binding
15168
- if (
15169
- /(button|input)/i.test($el.tagName) && /(submit|checkbox|radio)/i.test($el.type)
15170
- || /a/i.test($el.tagName) && $el.attributes.getNamedItem('data-gina-form-submit')
15171
- // You could also have a click on a child element like <a href="#"><span>click me</span></a>
15172
- || /a/i.test($el.parentNode.tagName) && $el.parentNode.attributes.getNamedItem('data-gina-form-submit')
15173
- ) {
15174
- var namedItem = $el.attributes.getNamedItem('data-gina-form-submit');
15175
- var parentNamedItem = $el.parentNode.attributes.getNamedItem('data-gina-form-submit');
15176
15275
  if (
15177
- namedItem
15276
+ $el.type == 'submit' && !/^submit\./i.test(_evt)
15178
15277
  ||
15179
- parentNamedItem
15278
+ isCustomSubmit && !/^submit\./i.test(_evt)
15180
15279
  ) {
15181
- isCustomSubmit = true;
15182
- // Get others attribute and override current form attribute
15183
- var newFormMethod = null;
15184
- if (namedItem) {
15185
- newFormMethod = $el.getAttribute('data-gina-form-submit-method') || event.currentTarget.getAttribute('method');
15186
- } else {
15187
- newFormMethod = $el.parentNode.getAttribute('data-gina-form-submit-method') || event.currentTarget.getAttribute('method');
15188
- }
15189
- if (newFormMethod) {
15190
- // Backup originalMethod
15191
-
15192
- // Rewrite current method
15193
- if (namedItem && $el.form) {
15194
- if ($el.form.setAttribute) {
15195
- $el.form.setAttribute('method', newFormMethod);
15196
- } else {
15197
- event.currentTarget.setAttribute('method', newFormMethod);
15198
- }
15199
- } else if ($el.parentNode.form) {
15200
- if ($el.parentNode.form.setAttribute) {
15201
- $el.parentNode.form.setAttribute('method', newFormMethod);
15202
- } else {
15203
- event.currentTarget.setAttribute('method', newFormMethod);
15204
- }
15205
- }
15206
- }
15280
+ _evt = 'submit.'+_evt;
15281
+ instance.$forms[$form.id].submitTrigger = $form.submitTrigger = $el.id;
15207
15282
  }
15208
- // safety checking
15209
- if ( typeof($el.id) == 'undefined' || !$el.getAttribute('id') ) {
15210
- $el.setAttribute('id', 'click.' + uuid() );
15211
- $el.id = $el.getAttribute('id')
15212
- } else {
15213
- $el.id = $el.getAttribute('id')
15283
+ if ( $el.type == 'reset' && !/^reset\./i.test(_evt) ) {
15284
+ _evt = 'reset.'+_evt
15214
15285
  }
15215
15286
 
15287
+ if (gina.events[_evt]) {
15288
+ cancelEvent(event);
15216
15289
 
15217
- if (/^click\./.test($el.id) || withRules) {
15218
-
15219
- var _evt = $el.id;
15220
-
15221
- if (!_evt) return false;
15222
-
15223
- if ( !/^click\./.test(_evt) ) {
15224
- _evt = $el.id
15225
- }
15226
-
15227
- // normal case
15228
- if (
15229
- !$el.disabled
15230
- && /(checkbox|radio)/i.test($el.type)
15231
- ) {
15232
- //event.stopPropagation();
15233
- // apply checked choice : if true -> set to false, and if false -> set to true
15234
- if ( /checkbox/i.test($el.type) ) {
15235
- return updateCheckBox($el);
15236
- } else if ( /radio/i.test($el.type) ) {
15237
- return updateRadio($el, false, true);
15238
- }
15239
- }
15240
-
15241
- // prevent event to be triggered twice
15242
- if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
15243
- return false;
15290
+ triggerEvent(gina, $el, _evt, event.detail);
15291
+ } else if (
15292
+ isCustomSubmit
15293
+ && typeof(this.id) != 'undefined'
15294
+ && this.id != ''
15295
+ && typeof(gina.validator.$forms[this.id]) != 'undefined'
15296
+ ) {
15297
+ gina.validator.getFormById(this.id).submit();
15298
+ cancelEvent(event);
15299
+ }
15244
15300
 
15245
- // in case we have multiple submit type buttons
15246
- if (
15247
- $el.type == 'submit' && !/^submit\./i.test(_evt)
15248
- ||
15249
- isCustomSubmit && !/^submit\./i.test(_evt)
15250
- ) {
15251
- _evt = 'submit.'+_evt;
15252
- // Updating submitTrigger in case it has been changed on the fly
15253
- instance.$forms[$form.id].submitTrigger = $form.submitTrigger = $el.id;
15254
- }
15255
- // in case we have multiple reset type buttons
15256
- if ( $el.type == 'reset' && !/^reset\./i.test(_evt) ) {
15257
- _evt = 'reset.'+_evt
15258
- }
15301
+ }
15302
+ }
15303
+ };
15259
15304
 
15260
- if (gina.events[_evt]) {
15261
- cancelEvent(event);
15305
+ proceed = function () {
15306
+ var subEvent = null;
15307
+ // handle form reset
15308
+ subEvent = 'reset.'+$target.id;
15309
+ if ( typeof(gina.events[subEvent]) == 'undefined' ) {
15310
+ addListener(gina, $target, subEvent, function(e) {
15311
+ e.preventDefault();
15262
15312
 
15263
- triggerEvent(gina, $el, _evt, event.detail);
15264
- } else if (
15265
- isCustomSubmit
15266
- && typeof(this.id) != 'undefined'
15267
- && this.id != ''
15268
- && typeof(gina.validator.$forms[this.id]) != 'undefined'
15269
- ) {
15270
- gina.validator.getFormById(this.id).submit();
15271
- cancelEvent(event); // stop #navigation
15272
- }
15313
+ var _id = e.currentTarget.id || e.target.id
15314
+ var $form = instance.$forms[_id];
15315
+ $form.target.dataset.ginaFormIsResetting = true;
15316
+ resetFields($form);
15317
+ // forcing it
15318
+ var validationInfo = getFormValidationInfos($form.target, $form.rules, true);
15319
+ var fields = validationInfo.fields;
15320
+ var $fields = validationInfo.$fields;
15273
15321
 
15274
- }
15275
- }
15322
+ validate($form.target, fields, $fields, $form.rules, function onSilentResetValidation(result){
15323
+ var isFormValid = result.isValid();
15324
+ console.debug('silent reset validation result[isValid:'+isFormValid+']: ', result);
15325
+ //resetting error display
15326
+ handleErrorsDisplay($form.target, {});
15276
15327
 
15277
- })
15328
+ updateSubmitTriggerState( $form.target , isFormValid );
15329
+ $form.target.dataset.ginaFormIsResetting = false;
15330
+ });
15331
+ })
15332
+ }
15333
+ // Form-level proxies: capture bubbled events from in-tree controls.
15334
+ addListener(gina, $target, 'reset', resetProxyHandler);
15335
+ addListener(gina, $target, 'keydown', keydownProxyHandler);
15336
+ addListener(gina, $target, 'keyup', keyupProxyHandler);
15337
+ addListener(gina, $target, 'focusin', focusinProxyHandler);
15338
+ addListener(gina, $target, 'focusout', focusoutProxyHandler);
15339
+ addListener(gina, $target, 'change', changeProxyHandler);
15340
+ addListener(gina, $target, 'click', clickProxyHandler);
15278
15341
  }
15279
15342
 
15280
15343
  proceed();
15281
15344
 
15345
+ // [HTML5 form-reassociation support] Per-control listener attachment for
15346
+ // reassociated controls (form="X" pointing at $target but living outside
15347
+ // $target's DOM subtree). Native events on these controls bubble through
15348
+ // their actual ancestors, not through $target, so the form-level proxies
15349
+ // above never see them. Per-control listeners ensure the proxy logic runs.
15350
+ // Tracked on $form.reassociatedListeners for unbindForm cleanup.
15351
+ //
15352
+ // Skipped events:
15353
+ // - 'reset': fires on the form directly when reset() is called or a reset
15354
+ // button submits to the form, regardless of where the button lives. The
15355
+ // form-level reset listener above captures this for both cases.
15356
+ // - 'submit': fires on the form directly when submit() is called or a submit
15357
+ // button submits. Same reasoning as reset.
15358
+ for (let _rIdx = 0, _rLen = $target.elements.length; _rIdx < _rLen; _rIdx++) {
15359
+ let $rEl = $target.elements[_rIdx];
15360
+ if (!$target.contains($rEl)) {
15361
+ addListener(gina, $rEl, 'keydown', keydownProxyHandler);
15362
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'keydown', fn: keydownProxyHandler });
15363
+ addListener(gina, $rEl, 'keyup', keyupProxyHandler);
15364
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'keyup', fn: keyupProxyHandler });
15365
+ addListener(gina, $rEl, 'focusin', focusinProxyHandler);
15366
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'focusin', fn: focusinProxyHandler });
15367
+ addListener(gina, $rEl, 'focusout', focusoutProxyHandler);
15368
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'focusout', fn: focusoutProxyHandler });
15369
+ addListener(gina, $rEl, 'change', changeProxyHandler);
15370
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'change', fn: changeProxyHandler });
15371
+ addListener(gina, $rEl, 'click', clickProxyHandler);
15372
+ $form.reassociatedListeners.push({ el: $rEl, evt: 'click', fn: clickProxyHandler });
15373
+ }
15374
+ }
15375
+
15282
15376
 
15283
15377
 
15284
15378
 
@@ -15392,7 +15486,9 @@ function ValidatorPlugin(rules, data, formId) {
15392
15486
  , linkId = null
15393
15487
  , buttonId = null
15394
15488
  ;
15395
- $buttonsTMP = $target.getElementsByTagName('button');
15489
+ // Owner-aware so reassociated submit buttons (<button form="X" type="submit">
15490
+ // outside $target's subtree) are bound to the correct form.
15491
+ $buttonsTMP = getOwnedElements($target, 'button');
15396
15492
  if ( $buttonsTMP.length > 0 ) {
15397
15493
  for (let b = 0, len = $buttonsTMP.length; b < len; ++b) {
15398
15494
  if ($buttonsTMP[b].type == 'submit') {
@@ -15401,7 +15497,7 @@ function ValidatorPlugin(rules, data, formId) {
15401
15497
  }
15402
15498
  }
15403
15499
 
15404
- // binding links
15500
+ // binding links — DOM-tree only; <a> doesn't participate in HTMLFormControlsCollection
15405
15501
  $buttonsTMP = $target.getElementsByTagName('a');
15406
15502
  if ( $buttonsTMP.length > 0 ) {
15407
15503
  for (let b = 0, len = $buttonsTMP.length; b < len; ++b) {
@@ -19624,7 +19720,12 @@ function Collection(content, options) {
19624
19720
  if ( typeof(content[entry]._uuid) != 'undefined' ) {
19625
19721
  content[entry]._hasItsOwnUuid = true;
19626
19722
  } else {
19627
- content[entry]._uuid = uuid();
19723
+ // 16-char base-62 (~4.77e28 space) — at the default 4-char (~14.78M) the
19724
+ // birthday-paradox collision rate at N=917 is ~2.84%, and `notIn()`'s
19725
+ // _uuid-keyed splice removes the wrong record on collision. 16 keeps the
19726
+ // collision rate below 1e-13 up to N=100M, future-proof for any practical
19727
+ // collection size.
19728
+ content[entry]._uuid = uuid(16);
19628
19729
  }
19629
19730
 
19630
19731
  // To avoid duplicate entries
@@ -20407,8 +20508,8 @@ function Collection(content, options) {
20407
20508
 
20408
20509
  var tmpContent = Array.isArray(this) ? this : content;
20409
20510
 
20410
- // Indexing;
20411
- set._uuid = uuid();
20511
+ // Indexing; 16-char to match the constructor's collision-safe size.
20512
+ set._uuid = uuid(16);
20412
20513
  tmpContent.push(set);
20413
20514
 
20414
20515
  result = tmpContent;