gina 0.6.32 → 0.6.33

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 (623) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +76 -59
  3. package/ROADMAP.md +12 -2
  4. package/framework/v0.6.33/VERSION +1 -0
  5. package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.js +686 -247
  6. package/framework/v0.6.33/core/asset/plugin/dist/vendor/gina/js/gina.min.js +721 -0
  7. package/framework/v0.6.33/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  8. package/framework/v0.6.33/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  9. package/framework/{v0.6.32 → v0.6.33}/core/config.js +61 -7
  10. package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/index.js +223 -61
  11. package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/connector.v3.js +97 -81
  12. package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/connector.v4.js +107 -91
  13. package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/session-store.v3.js +36 -2
  14. package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/session-store.v4.js +36 -2
  15. package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.js +430 -56
  16. package/framework/{v0.6.32 → v0.6.33}/core/gna.js +121 -18
  17. package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/src/form-validator.js +318 -97
  18. package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/src/main.js +145 -67
  19. package/framework/{v0.6.32 → v0.6.33}/core/server.isaac.js +136 -50
  20. package/framework/v0.6.33/core/server.isaac.rapid-reset.js +274 -0
  21. package/framework/{v0.6.32 → v0.6.33}/core/server.js +135 -35
  22. package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/settings.server.json +2 -2
  23. package/framework/{v0.6.32 → v0.6.33}/core/template/conf/settings.json +3 -2
  24. package/framework/{v0.6.32 → v0.6.33}/helpers/data/src/main.js +148 -70
  25. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/infer.js +9 -5
  26. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/models.js +9 -5
  27. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/test.js +9 -1
  28. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/add.js +12 -1
  29. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/help.txt +7 -6
  30. package/framework/v0.6.33/lib/cmd/env/inc/name.js +93 -0
  31. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/link-dev.js +22 -12
  32. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/add.js +69 -22
  33. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/add.js +13 -1
  34. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/help.txt +6 -3
  35. package/framework/v0.6.33/lib/cmd/scope/inc/name.js +131 -0
  36. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/link-local.js +22 -12
  37. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/link-production.js +22 -12
  38. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/check.js +41 -7
  39. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/help.txt +5 -0
  40. package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/scan.js +38 -10
  41. package/framework/{v0.6.32 → v0.6.33}/lib/collection/src/main.js +34 -10
  42. package/framework/{v0.6.32 → v0.6.33}/lib/model.js +71 -7
  43. package/framework/{v0.6.32 → v0.6.33}/lib/routing/src/main.js +42 -4
  44. package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/main.js +155 -20
  45. package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/sources.js +62 -22
  46. package/framework/{v0.6.32 → v0.6.33}/package.json +1 -1
  47. package/gna.js +4 -4
  48. package/llms.txt +50 -23
  49. package/package.json +4 -4
  50. package/schema/settings.json +7 -0
  51. package/script/check_no_local_leak.js +18 -10
  52. package/script/retry_lockfile_sync.js +1 -1
  53. package/types/globals.d.ts +3 -3
  54. package/types/gna.d.ts +4 -1
  55. package/framework/v0.6.32/VERSION +0 -1
  56. package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -716
  57. package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  58. package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  59. package/test-results/validator-upload-popin-con-a5268-n-change-fires-RED-pre-fix--chromium/error-context.md +0 -172
  60. package/test-results/validator-upload-popin-con-cf673--the-page-form-RED-pre-fix--chromium/error-context.md +0 -212
  61. /package/framework/{v0.6.32 → v0.6.33}/AUTHORS +0 -0
  62. /package/framework/{v0.6.32 → v0.6.33}/LICENSE +0 -0
  63. /package/framework/{v0.6.32 → v0.6.33}/core/asset/html/nolayout.html +0 -0
  64. /package/framework/{v0.6.32 → v0.6.33}/core/asset/html/static.html +0 -0
  65. /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/android-chrome-192x192.png +0 -0
  66. /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/android-chrome-512x512.png +0 -0
  67. /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/apple-touch-icon.png +0 -0
  68. /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/favicon-16x16.png +0 -0
  69. /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/favicon-32x32.png +0 -0
  70. /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/favicon.ico +0 -0
  71. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/README.md +0 -0
  72. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  73. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  74. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  75. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  76. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  77. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  78. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  79. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  80. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  81. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  82. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  83. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  84. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  85. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  86. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  87. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  88. /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  89. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/ai/index.js +0 -0
  90. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/ai/lib/connector.js +0 -0
  91. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/connector.js +0 -0
  92. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/n1ql.js +0 -0
  93. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/session-store.js +0 -0
  94. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/storage-store.js +0 -0
  95. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/duckdb/index.js +0 -0
  96. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/duckdb/lib/connector.js +0 -0
  97. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/index.js +0 -0
  98. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/connector.js +0 -0
  99. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/job-store.js +0 -0
  100. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  101. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/session-store.js +0 -0
  102. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mysql/index.js +0 -0
  103. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mysql/lib/connector.js +0 -0
  104. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/param-redact.js +0 -0
  105. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/postgresql/index.js +0 -0
  106. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/postgresql/lib/connector.js +0 -0
  107. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/index.js +0 -0
  108. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/connector.js +0 -0
  109. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/job-store.js +0 -0
  110. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/kv-store.js +0 -0
  111. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/render-cache-store.js +0 -0
  112. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/session-store.js +0 -0
  113. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/scylladb/index.js +0 -0
  114. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/scylladb/lib/connector.js +0 -0
  115. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/scylladb/lib/session-store.js +0 -0
  116. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/settle-once.js +0 -0
  117. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sql-parser.js +0 -0
  118. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/index.js +0 -0
  119. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/connector.js +0 -0
  120. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/job-store.js +0 -0
  121. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/kv-store.js +0 -0
  122. /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/session-store.js +0 -0
  123. /package/framework/{v0.6.32 → v0.6.33}/core/content.encoding +0 -0
  124. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.framework.js +0 -0
  125. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-json.js +0 -0
  126. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-nunjucks-async.js +0 -0
  127. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-nunjucks.js +0 -0
  128. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-stream.js +0 -0
  129. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-swig-async.js +0 -0
  130. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-swig.js +0 -0
  131. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-v1.js +0 -0
  132. /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-xml.js +0 -0
  133. /package/framework/{v0.6.32 → v0.6.33}/core/controller/index.js +0 -0
  134. /package/framework/{v0.6.32 → v0.6.33}/core/controller/inline-script.js +0 -0
  135. /package/framework/{v0.6.32 → v0.6.33}/core/controller/inspector-window-emit.js +0 -0
  136. /package/framework/{v0.6.32 → v0.6.33}/core/controller/release-banner.js +0 -0
  137. /package/framework/{v0.6.32 → v0.6.33}/core/dev/index.js +0 -0
  138. /package/framework/{v0.6.32 → v0.6.33}/core/dev/lib/class.js +0 -0
  139. /package/framework/{v0.6.32 → v0.6.33}/core/dev/lib/factory.js +0 -0
  140. /package/framework/{v0.6.32 → v0.6.33}/core/dev/lib/tools.js +0 -0
  141. /package/framework/{v0.6.32 → v0.6.33}/core/locales/README.md +0 -0
  142. /package/framework/{v0.6.32 → v0.6.33}/core/locales/currency.json +0 -0
  143. /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/language/en.json +0 -0
  144. /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/language/fr.json +0 -0
  145. /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/region/en.json +0 -0
  146. /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/region/fr.json +0 -0
  147. /package/framework/{v0.6.32 → v0.6.33}/core/locales/index.js +0 -0
  148. /package/framework/{v0.6.32 → v0.6.33}/core/mime.types +0 -0
  149. /package/framework/{v0.6.32 → v0.6.33}/core/model/entity.js +0 -0
  150. /package/framework/{v0.6.32 → v0.6.33}/core/model/index.js +0 -0
  151. /package/framework/{v0.6.32 → v0.6.33}/core/model/template/entityFactory.js +0 -0
  152. /package/framework/{v0.6.32 → v0.6.33}/core/model/template/index.js +0 -0
  153. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/README.md +0 -0
  154. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/index.js +0 -0
  155. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/csrf/README.md +0 -0
  156. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/csrf/package.json +0 -0
  157. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/csrf/src/main.js +0 -0
  158. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/README.md +0 -0
  159. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coep/README.md +0 -0
  160. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coep/package.json +0 -0
  161. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  162. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coop/README.md +0 -0
  163. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coop/package.json +0 -0
  164. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  165. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/corp/README.md +0 -0
  166. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/corp/package.json +0 -0
  167. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  168. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/csp/README.md +0 -0
  169. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/csp/package.json +0 -0
  170. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  171. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  172. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  173. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  174. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  175. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  176. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  177. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  178. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  179. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  180. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/package.json +0 -0
  181. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  182. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  183. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  184. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/src/main.js +0 -0
  185. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  186. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  187. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  188. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  189. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  190. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  191. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  192. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  193. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  194. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  195. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  196. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  197. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  198. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  199. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  200. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  201. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  202. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  203. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/session/README.md +0 -0
  204. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/session/package.json +0 -0
  205. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/session/src/main.js +0 -0
  206. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/README.md +0 -0
  207. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/build.json +0 -0
  208. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/package.json +0 -0
  209. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/src/main.js +0 -0
  210. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/README.md +0 -0
  211. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/build.json +0 -0
  212. /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/package.json +0 -0
  213. /package/framework/{v0.6.32 → v0.6.33}/core/router.js +0 -0
  214. /package/framework/{v0.6.32 → v0.6.33}/core/server.express.js +0 -0
  215. /package/framework/{v0.6.32 → v0.6.33}/core/status.codes +0 -0
  216. /package/framework/{v0.6.32 → v0.6.33}/core/template/_gitignore +0 -0
  217. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/app.json +0 -0
  218. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  219. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/routing.json +0 -0
  220. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/settings.json +0 -0
  221. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/templates.json +0 -0
  222. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  223. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  224. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  225. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  226. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/index.js +0 -0
  227. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/locales/en.json +0 -0
  228. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  229. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  230. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  231. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  232. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  233. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  234. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  235. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  236. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/readme.md +0 -0
  237. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/sw.js +0 -0
  238. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  239. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  240. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  241. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  242. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  243. /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  244. /package/framework/{v0.6.32 → v0.6.33}/core/template/command/gina.bat.tpl +0 -0
  245. /package/framework/{v0.6.32 → v0.6.33}/core/template/command/gina.tpl +0 -0
  246. /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/env.json +0 -0
  247. /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/manifest.json +0 -0
  248. /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/package.json +0 -0
  249. /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/statics.json +0 -0
  250. /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/templates.json +0 -0
  251. /package/framework/{v0.6.32 → v0.6.33}/core/template/error/client/json/401.json +0 -0
  252. /package/framework/{v0.6.32 → v0.6.33}/core/template/error/client/json/403.json +0 -0
  253. /package/framework/{v0.6.32 → v0.6.33}/core/template/error/client/json/404.json +0 -0
  254. /package/framework/{v0.6.32 → v0.6.33}/core/template/error/server/html/50x.html +0 -0
  255. /package/framework/{v0.6.32 → v0.6.33}/core/template/error/server/json/500.json +0 -0
  256. /package/framework/{v0.6.32 → v0.6.33}/core/template/error/server/json/503.json +0 -0
  257. /package/framework/{v0.6.32 → v0.6.33}/core/template/extensions/logger/config.json +0 -0
  258. /package/framework/{v0.6.32 → v0.6.33}/helpers/console.js +0 -0
  259. /package/framework/{v0.6.32 → v0.6.33}/helpers/context.js +0 -0
  260. /package/framework/{v0.6.32 → v0.6.33}/helpers/data/LICENSE +0 -0
  261. /package/framework/{v0.6.32 → v0.6.33}/helpers/data/README.md +0 -0
  262. /package/framework/{v0.6.32 → v0.6.33}/helpers/data/package.json +0 -0
  263. /package/framework/{v0.6.32 → v0.6.33}/helpers/dateFormat.js +0 -0
  264. /package/framework/{v0.6.32 → v0.6.33}/helpers/index.js +0 -0
  265. /package/framework/{v0.6.32 → v0.6.33}/helpers/json/LICENSE +0 -0
  266. /package/framework/{v0.6.32 → v0.6.33}/helpers/json/README.md +0 -0
  267. /package/framework/{v0.6.32 → v0.6.33}/helpers/json/package.json +0 -0
  268. /package/framework/{v0.6.32 → v0.6.33}/helpers/json/src/main.js +0 -0
  269. /package/framework/{v0.6.32 → v0.6.33}/helpers/path.js +0 -0
  270. /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/README.md +0 -0
  271. /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/package.json +0 -0
  272. /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/src/api-error.js +0 -0
  273. /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/src/main.js +0 -0
  274. /package/framework/{v0.6.32 → v0.6.33}/helpers/prototypes.js +0 -0
  275. /package/framework/{v0.6.32 → v0.6.33}/helpers/task.js +0 -0
  276. /package/framework/{v0.6.32 → v0.6.33}/helpers/text.js +0 -0
  277. /package/framework/{v0.6.32 → v0.6.33}/lib/admin/package.json +0 -0
  278. /package/framework/{v0.6.32 → v0.6.33}/lib/admin/src/main.js +0 -0
  279. /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/README.md +0 -0
  280. /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/build.json +0 -0
  281. /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/package.json +0 -0
  282. /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/src/dep/jszip.min.js +0 -0
  283. /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/src/main.js +0 -0
  284. /package/framework/{v0.6.32 → v0.6.33}/lib/async/package.json +0 -0
  285. /package/framework/{v0.6.32 → v0.6.33}/lib/async/src/main.js +0 -0
  286. /package/framework/{v0.6.32 → v0.6.33}/lib/audit/package.json +0 -0
  287. /package/framework/{v0.6.32 → v0.6.33}/lib/audit/src/main.js +0 -0
  288. /package/framework/{v0.6.32 → v0.6.33}/lib/audit-store.js +0 -0
  289. /package/framework/{v0.6.32 → v0.6.33}/lib/authn/package.json +0 -0
  290. /package/framework/{v0.6.32 → v0.6.33}/lib/authn/src/lockout.js +0 -0
  291. /package/framework/{v0.6.32 → v0.6.33}/lib/authn/src/main.js +0 -0
  292. /package/framework/{v0.6.32 → v0.6.33}/lib/authn/src/totp.js +0 -0
  293. /package/framework/{v0.6.32 → v0.6.33}/lib/authz-gate/package.json +0 -0
  294. /package/framework/{v0.6.32 → v0.6.33}/lib/authz-gate/src/main.js +0 -0
  295. /package/framework/{v0.6.32 → v0.6.33}/lib/cache/README.md +0 -0
  296. /package/framework/{v0.6.32 → v0.6.33}/lib/cache/build.json +0 -0
  297. /package/framework/{v0.6.32 → v0.6.33}/lib/cache/package.json +0 -0
  298. /package/framework/{v0.6.32 → v0.6.33}/lib/cache/src/main.js +0 -0
  299. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/aliases.json +0 -0
  300. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/audit/arguments.json +0 -0
  301. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/audit/help.txt +0 -0
  302. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/audit/verify.js +0 -0
  303. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/add.js +0 -0
  304. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/arguments.json +0 -0
  305. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/build.js +0 -0
  306. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/copy.js +0 -0
  307. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/cp.js +0 -0
  308. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/help.js +0 -0
  309. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/help.txt +0 -0
  310. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  311. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/list.js +0 -0
  312. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/man.js +0 -0
  313. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/mcp-start.js +0 -0
  314. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/mcp.js +0 -0
  315. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/oas.js +0 -0
  316. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/openapi.js +0 -0
  317. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/remove.js +0 -0
  318. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/rename.js +0 -0
  319. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/restart.js +0 -0
  320. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/rm.js +0 -0
  321. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/start.js +0 -0
  322. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/status.js +0 -0
  323. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/stop.js +0 -0
  324. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/types.js +0 -0
  325. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/arguments.json +0 -0
  326. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/clear.js +0 -0
  327. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/help.txt +0 -0
  328. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/stats.js +0 -0
  329. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/add.js +0 -0
  330. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/arguments.json +0 -0
  331. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/help.js +0 -0
  332. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/help.txt +0 -0
  333. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/list.js +0 -0
  334. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/migrate.js +0 -0
  335. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/remove.js +0 -0
  336. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/rm.js +0 -0
  337. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/arguments.json +0 -0
  338. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/help.js +0 -0
  339. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/help.txt +0 -0
  340. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/man.js +0 -0
  341. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/ps.js +0 -0
  342. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/stop.js +0 -0
  343. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/add.js +0 -0
  344. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/arguments.json +0 -0
  345. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/help.txt +0 -0
  346. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/args.js +0 -0
  347. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/namespace.js +0 -0
  348. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  349. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/reference-scan.js +0 -0
  350. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/scaffold.js +0 -0
  351. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/remove.js +0 -0
  352. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/rename.js +0 -0
  353. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/rm.js +0 -0
  354. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/get.js +0 -0
  355. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/help.js +0 -0
  356. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/list.js +0 -0
  357. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/remove.js +0 -0
  358. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/rm.js +0 -0
  359. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/set.js +0 -0
  360. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/unset.js +0 -0
  361. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/use.js +0 -0
  362. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/add.js +0 -0
  363. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/arguments.json +0 -0
  364. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/build.js +0 -0
  365. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/dot.js +0 -0
  366. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/get.js +0 -0
  367. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/help.js +0 -0
  368. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/help.txt +0 -0
  369. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/init.js +0 -0
  370. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/link-node-modules.js +0 -0
  371. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/link.js +0 -0
  372. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/list.js +0 -0
  373. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/man.js +0 -0
  374. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/msg.json +0 -0
  375. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/open.js +0 -0
  376. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/remove.js +0 -0
  377. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/reset.js +0 -0
  378. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/restart.js +0 -0
  379. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/set.js +0 -0
  380. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/start.js +0 -0
  381. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/status.js +0 -0
  382. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/stop.js +0 -0
  383. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/tail.js +0 -0
  384. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/update.js +0 -0
  385. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/version.js +0 -0
  386. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/gina-dev.1.md +0 -0
  387. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/gina-framework.1.md +0 -0
  388. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/gina.1.md +0 -0
  389. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/helper.js +0 -0
  390. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/add.js +0 -0
  391. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/arguments.json +0 -0
  392. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/export.js +0 -0
  393. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/help.js +0 -0
  394. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/help.txt +0 -0
  395. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/import.js +0 -0
  396. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/scan.js +0 -0
  397. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/_host.js +0 -0
  398. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/arguments.json +0 -0
  399. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/build.js +0 -0
  400. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/help.js +0 -0
  401. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/help.txt +0 -0
  402. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/list.js +0 -0
  403. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/man.js +0 -0
  404. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/rm.js +0 -0
  405. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/run.js +0 -0
  406. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/index.js +0 -0
  407. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/inspector/help.js +0 -0
  408. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/inspector/help.txt +0 -0
  409. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/inspector/open.js +0 -0
  410. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/man-render.js +0 -0
  411. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/arguments.json +0 -0
  412. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/help.js +0 -0
  413. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/help.txt +0 -0
  414. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/kill.js +0 -0
  415. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/list.js +0 -0
  416. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/msg.json +0 -0
  417. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/help.js +0 -0
  418. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/help.txt +0 -0
  419. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/inc/scan.js +0 -0
  420. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/list.js +0 -0
  421. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/reset.js +0 -0
  422. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/set.js +0 -0
  423. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/arguments.json +0 -0
  424. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/backup.js +0 -0
  425. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/build.js +0 -0
  426. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/help.js +0 -0
  427. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/help.txt +0 -0
  428. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/import.js +0 -0
  429. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/list.js +0 -0
  430. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/man.js +0 -0
  431. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/move.js +0 -0
  432. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/remove.js +0 -0
  433. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/rename.js +0 -0
  434. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/restart.js +0 -0
  435. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/restore.js +0 -0
  436. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/rm.js +0 -0
  437. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/start.js +0 -0
  438. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/status.js +0 -0
  439. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/stop.js +0 -0
  440. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/arguments.json +0 -0
  441. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/help.js +0 -0
  442. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/help.txt +0 -0
  443. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/list.js +0 -0
  444. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/remove.js +0 -0
  445. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/set.js +0 -0
  446. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/help.js +0 -0
  447. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/list.js +0 -0
  448. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/remove.js +0 -0
  449. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/rm.js +0 -0
  450. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/use.js +0 -0
  451. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/arguments.json +0 -0
  452. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/help.js +0 -0
  453. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/help.js +0 -0
  454. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/help.txt +0 -0
  455. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/list.js +0 -0
  456. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/man.js +0 -0
  457. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/start.js +0 -0
  458. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/arguments.json +0 -0
  459. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/gc.js +0 -0
  460. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/help.txt +0 -0
  461. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/stats.js +0 -0
  462. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/verify.js +0 -0
  463. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/view/add.js +0 -0
  464. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd-status-format/package.json +0 -0
  465. /package/framework/{v0.6.32 → v0.6.33}/lib/cmd-status-format/src/main.js +0 -0
  466. /package/framework/{v0.6.32 → v0.6.33}/lib/collection/README.md +0 -0
  467. /package/framework/{v0.6.32 → v0.6.33}/lib/collection/build.json +0 -0
  468. /package/framework/{v0.6.32 → v0.6.33}/lib/collection/package.json +0 -0
  469. /package/framework/{v0.6.32 → v0.6.33}/lib/conf-view/package.json +0 -0
  470. /package/framework/{v0.6.32 → v0.6.33}/lib/conf-view/src/main.js +0 -0
  471. /package/framework/{v0.6.32 → v0.6.33}/lib/config.js +0 -0
  472. /package/framework/{v0.6.32 → v0.6.33}/lib/connector-config/package.json +0 -0
  473. /package/framework/{v0.6.32 → v0.6.33}/lib/connector-config/src/main.js +0 -0
  474. /package/framework/{v0.6.32 → v0.6.33}/lib/connector-error/package.json +0 -0
  475. /package/framework/{v0.6.32 → v0.6.33}/lib/connector-error/src/main.js +0 -0
  476. /package/framework/{v0.6.32 → v0.6.33}/lib/connector-registry/package.json +0 -0
  477. /package/framework/{v0.6.32 → v0.6.33}/lib/connector-registry/src/main.js +0 -0
  478. /package/framework/{v0.6.32 → v0.6.33}/lib/cron/README.md +0 -0
  479. /package/framework/{v0.6.32 → v0.6.33}/lib/cron/package.json +0 -0
  480. /package/framework/{v0.6.32 → v0.6.33}/lib/cron/src/main.js +0 -0
  481. /package/framework/{v0.6.32 → v0.6.33}/lib/domain/LICENSE +0 -0
  482. /package/framework/{v0.6.32 → v0.6.33}/lib/domain/README.md +0 -0
  483. /package/framework/{v0.6.32 → v0.6.33}/lib/domain/package.json +0 -0
  484. /package/framework/{v0.6.32 → v0.6.33}/lib/domain/src/main.js +0 -0
  485. /package/framework/{v0.6.32 → v0.6.33}/lib/dto/package.json +0 -0
  486. /package/framework/{v0.6.32 → v0.6.33}/lib/dto/src/main.js +0 -0
  487. /package/framework/{v0.6.32 → v0.6.33}/lib/dto-pipe/package.json +0 -0
  488. /package/framework/{v0.6.32 → v0.6.33}/lib/dto-pipe/src/main.js +0 -0
  489. /package/framework/{v0.6.32 → v0.6.33}/lib/dto-types/package.json +0 -0
  490. /package/framework/{v0.6.32 → v0.6.33}/lib/dto-types/src/main.js +0 -0
  491. /package/framework/{v0.6.32 → v0.6.33}/lib/duration/package.json +0 -0
  492. /package/framework/{v0.6.32 → v0.6.33}/lib/duration/src/main.js +0 -0
  493. /package/framework/{v0.6.32 → v0.6.33}/lib/generator/index.js +0 -0
  494. /package/framework/{v0.6.32 → v0.6.33}/lib/i18n/package.json +0 -0
  495. /package/framework/{v0.6.32 → v0.6.33}/lib/i18n/src/main.js +0 -0
  496. /package/framework/{v0.6.32 → v0.6.33}/lib/idempotency/package.json +0 -0
  497. /package/framework/{v0.6.32 → v0.6.33}/lib/idempotency/src/main.js +0 -0
  498. /package/framework/{v0.6.32 → v0.6.33}/lib/image-build/package.json +0 -0
  499. /package/framework/{v0.6.32 → v0.6.33}/lib/image-build/src/main.js +0 -0
  500. /package/framework/{v0.6.32 → v0.6.33}/lib/index.js +0 -0
  501. /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/LICENSE +0 -0
  502. /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/README.md +0 -0
  503. /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/package.json +0 -0
  504. /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/src/main.js +0 -0
  505. /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-events/package.json +0 -0
  506. /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-events/src/main.js +0 -0
  507. /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-redact/package.json +0 -0
  508. /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-redact/src/main.js +0 -0
  509. /package/framework/{v0.6.32 → v0.6.33}/lib/instrument/package.json +0 -0
  510. /package/framework/{v0.6.32 → v0.6.33}/lib/instrument/src/main.js +0 -0
  511. /package/framework/{v0.6.32 → v0.6.33}/lib/job/package.json +0 -0
  512. /package/framework/{v0.6.32 → v0.6.33}/lib/job/src/main.js +0 -0
  513. /package/framework/{v0.6.32 → v0.6.33}/lib/job-store.js +0 -0
  514. /package/framework/{v0.6.32 → v0.6.33}/lib/json-config-header/package.json +0 -0
  515. /package/framework/{v0.6.32 → v0.6.33}/lib/json-config-header/src/main.js +0 -0
  516. /package/framework/{v0.6.32 → v0.6.33}/lib/kv/package.json +0 -0
  517. /package/framework/{v0.6.32 → v0.6.33}/lib/kv/src/main.js +0 -0
  518. /package/framework/{v0.6.32 → v0.6.33}/lib/kv-store.js +0 -0
  519. /package/framework/{v0.6.32 → v0.6.33}/lib/loading-state/package.json +0 -0
  520. /package/framework/{v0.6.32 → v0.6.33}/lib/loading-state/src/main.js +0 -0
  521. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/README.md +0 -0
  522. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/package.json +0 -0
  523. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/default/index.js +0 -0
  524. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/file/index.js +0 -0
  525. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/mq/index.js +0 -0
  526. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/mq/listener.js +0 -0
  527. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/mq/speaker.js +0 -0
  528. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/helper.js +0 -0
  529. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/main.js +0 -0
  530. /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/redact.js +0 -0
  531. /package/framework/{v0.6.32 → v0.6.33}/lib/maintenance/package.json +0 -0
  532. /package/framework/{v0.6.32 → v0.6.33}/lib/maintenance/src/main.js +0 -0
  533. /package/framework/{v0.6.32 → v0.6.33}/lib/math/index.js +0 -0
  534. /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-dispatch/package.json +0 -0
  535. /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-dispatch/src/main.js +0 -0
  536. /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-http/package.json +0 -0
  537. /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-http/src/main.js +0 -0
  538. /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-server/package.json +0 -0
  539. /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-server/src/main.js +0 -0
  540. /package/framework/{v0.6.32 → v0.6.33}/lib/merge/README.md +0 -0
  541. /package/framework/{v0.6.32 → v0.6.33}/lib/merge/package.json +0 -0
  542. /package/framework/{v0.6.32 → v0.6.33}/lib/merge/src/main.js +0 -0
  543. /package/framework/{v0.6.32 → v0.6.33}/lib/message-validator/package.json +0 -0
  544. /package/framework/{v0.6.32 → v0.6.33}/lib/message-validator/src/main.js +0 -0
  545. /package/framework/{v0.6.32 → v0.6.33}/lib/metrics/package.json +0 -0
  546. /package/framework/{v0.6.32 → v0.6.33}/lib/metrics/src/main.js +0 -0
  547. /package/framework/{v0.6.32 → v0.6.33}/lib/money/package.json +0 -0
  548. /package/framework/{v0.6.32 → v0.6.33}/lib/money/src/main.js +0 -0
  549. /package/framework/{v0.6.32 → v0.6.33}/lib/multipart/package.json +0 -0
  550. /package/framework/{v0.6.32 → v0.6.33}/lib/multipart/src/main.js +0 -0
  551. /package/framework/{v0.6.32 → v0.6.33}/lib/net-locality/package.json +0 -0
  552. /package/framework/{v0.6.32 → v0.6.33}/lib/net-locality/src/main.js +0 -0
  553. /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-filters/README.md +0 -0
  554. /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-filters/package.json +0 -0
  555. /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-filters/src/main.js +0 -0
  556. /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-resolver/package.json +0 -0
  557. /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-resolver/src/main.js +0 -0
  558. /package/framework/{v0.6.32 → v0.6.33}/lib/priority/package.json +0 -0
  559. /package/framework/{v0.6.32 → v0.6.33}/lib/priority/src/main.js +0 -0
  560. /package/framework/{v0.6.32 → v0.6.33}/lib/proc.js +0 -0
  561. /package/framework/{v0.6.32 → v0.6.33}/lib/push/package.json +0 -0
  562. /package/framework/{v0.6.32 → v0.6.33}/lib/push/src/main.js +0 -0
  563. /package/framework/{v0.6.32 → v0.6.33}/lib/rate-limit/package.json +0 -0
  564. /package/framework/{v0.6.32 → v0.6.33}/lib/rate-limit/src/main.js +0 -0
  565. /package/framework/{v0.6.32 → v0.6.33}/lib/release-watch/package.json +0 -0
  566. /package/framework/{v0.6.32 → v0.6.33}/lib/release-watch/src/main.js +0 -0
  567. /package/framework/{v0.6.32 → v0.6.33}/lib/render-cache/package.json +0 -0
  568. /package/framework/{v0.6.32 → v0.6.33}/lib/render-cache/src/main.js +0 -0
  569. /package/framework/{v0.6.32 → v0.6.33}/lib/render-cache-store.js +0 -0
  570. /package/framework/{v0.6.32 → v0.6.33}/lib/routing/README.md +0 -0
  571. /package/framework/{v0.6.32 → v0.6.33}/lib/routing/build.json +0 -0
  572. /package/framework/{v0.6.32 → v0.6.33}/lib/routing/package.json +0 -0
  573. /package/framework/{v0.6.32 → v0.6.33}/lib/routing/src/radix.js +0 -0
  574. /package/framework/{v0.6.32 → v0.6.33}/lib/routing-introspect/package.json +0 -0
  575. /package/framework/{v0.6.32 → v0.6.33}/lib/routing-introspect/src/main.js +0 -0
  576. /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/package.json +0 -0
  577. /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/backends/env.js +0 -0
  578. /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/backends/exec.js +0 -0
  579. /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/backends/file.js +0 -0
  580. /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/declaration.js +0 -0
  581. /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/env-file.js +0 -0
  582. /package/framework/{v0.6.32 → v0.6.33}/lib/security-headers-emitter/package.json +0 -0
  583. /package/framework/{v0.6.32 → v0.6.33}/lib/security-headers-emitter/src/main.js +0 -0
  584. /package/framework/{v0.6.32 → v0.6.33}/lib/session-lifetime/package.json +0 -0
  585. /package/framework/{v0.6.32 → v0.6.33}/lib/session-lifetime/src/main.js +0 -0
  586. /package/framework/{v0.6.32 → v0.6.33}/lib/session-store.js +0 -0
  587. /package/framework/{v0.6.32 → v0.6.33}/lib/shell.js +0 -0
  588. /package/framework/{v0.6.32 → v0.6.33}/lib/sqlite-driver.js +0 -0
  589. /package/framework/{v0.6.32 → v0.6.33}/lib/sri/package.json +0 -0
  590. /package/framework/{v0.6.32 → v0.6.33}/lib/sri/src/main.js +0 -0
  591. /package/framework/{v0.6.32 → v0.6.33}/lib/state.js +0 -0
  592. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/package.json +0 -0
  593. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/local-cas.js +0 -0
  594. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/local-stream.js +0 -0
  595. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/local.js +0 -0
  596. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/main.js +0 -0
  597. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/meta-store.js +0 -0
  598. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/s3.js +0 -0
  599. /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/util.js +0 -0
  600. /package/framework/{v0.6.32 → v0.6.33}/lib/storage-store.js +0 -0
  601. /package/framework/{v0.6.32 → v0.6.33}/lib/swig-filters/README.md +0 -0
  602. /package/framework/{v0.6.32 → v0.6.33}/lib/swig-filters/package.json +0 -0
  603. /package/framework/{v0.6.32 → v0.6.33}/lib/swig-filters/src/main.js +0 -0
  604. /package/framework/{v0.6.32 → v0.6.33}/lib/swig-resolver/package.json +0 -0
  605. /package/framework/{v0.6.32 → v0.6.33}/lib/swig-resolver/src/main.js +0 -0
  606. /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/package.json +0 -0
  607. /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/src/loaders/http.js +0 -0
  608. /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/src/loaders/memory.js +0 -0
  609. /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/src/main.js +0 -0
  610. /package/framework/{v0.6.32 → v0.6.33}/lib/url/README.md +0 -0
  611. /package/framework/{v0.6.32 → v0.6.33}/lib/url/index.js +0 -0
  612. /package/framework/{v0.6.32 → v0.6.33}/lib/url/routing.json +0 -0
  613. /package/framework/{v0.6.32 → v0.6.33}/lib/uuid/package.json +0 -0
  614. /package/framework/{v0.6.32 → v0.6.33}/lib/uuid/src/main.js +0 -0
  615. /package/framework/{v0.6.32 → v0.6.33}/lib/validator.js +0 -0
  616. /package/framework/{v0.6.32 → v0.6.33}/lib/watcher/package.json +0 -0
  617. /package/framework/{v0.6.32 → v0.6.33}/lib/watcher/src/main.js +0 -0
  618. /package/framework/{v0.6.32 → v0.6.33}/lib/ws-framing/package.json +0 -0
  619. /package/framework/{v0.6.32 → v0.6.33}/lib/ws-framing/src/main.js +0 -0
  620. /package/framework/{v0.6.32 → v0.6.33}/lib/ws-query/package.json +0 -0
  621. /package/framework/{v0.6.32 → v0.6.33}/lib/ws-query/src/main.js +0 -0
  622. /package/framework/{v0.6.32 → v0.6.33}/lib/ws-session/package.json +0 -0
  623. /package/framework/{v0.6.32 → v0.6.33}/lib/ws-session/src/main.js +0 -0
@@ -3064,6 +3064,142 @@ function ownCount(container) {
3064
3064
  return Object.prototype.count.call(container);
3065
3065
  }
3066
3066
 
3067
+ /**
3068
+ * Escapes a value for use INSIDE a JSON string literal: `"`, `\` and the control
3069
+ * characters U+0000 to U+001F, exactly what JSON requires and nothing else, so a value
3070
+ * carrying none of them comes back unchanged (#B600). A lone surrogate is left as it is
3071
+ * on purpose: it never broke a parse, so escaping it would only change bytes. The
3072
+ * validator plugin's `main.js` carries the same function for its rule-set splices.
3073
+ *
3074
+ * @param {*} value - Coerced with `String()`.
3075
+ * @returns {string} The escaped text, without surrounding quotes.
3076
+ * @inner
3077
+ *
3078
+ * @example
3079
+ * escapeForJsonString('say "hi"'); // the text: say \"hi\"
3080
+ */
3081
+ function escapeForJsonString(value) {
3082
+ return String(value).replace(/[\u0000-\u001f"\\]/g, function (ch) {
3083
+ switch (ch) {
3084
+ case '"' : return '\\"';
3085
+ case '\\' : return '\\\\';
3086
+ case '\b' : return '\\b';
3087
+ case '\f' : return '\\f';
3088
+ case '\n' : return '\\n';
3089
+ case '\r' : return '\\r';
3090
+ case '\t' : return '\\t';
3091
+ default : return '\\u' + ('000' + ch.charCodeAt(0).toString(16)).slice(-4);
3092
+ }
3093
+ });
3094
+ }
3095
+
3096
+ /**
3097
+ * Restores the field values spliced into a `query` rule's request body (#B600).
3098
+ *
3099
+ * Every spliced value arrives wrapped in quotes and escaped as a JSON string literal;
3100
+ * each one is decoded back to the value, and any other quote character is dropped, as
3101
+ * the body always had them dropped. The old cleanup deleted every escaped quote from
3102
+ * the JSON text, which was only right for values with no `"` or `\`: a quote in a
3103
+ * value came out as a backslash, and a value ending in a backslash broke the body.
3104
+ *
3105
+ * Works token by token on the JSON text, so key order and every non-string token stay
3106
+ * byte-identical; for a body whose strings carry no backslash the output is exactly
3107
+ * what the old cleanup produced. An authored quoted segment that is valid JSON is
3108
+ * decoded too, the one place the two ever differ.
3109
+ *
3110
+ * @param {string} jsonText - The request body, as JSON text.
3111
+ * @returns {string} The body with every spliced value restored, as JSON text.
3112
+ * @inner
3113
+ *
3114
+ * @example
3115
+ * // a spliced `jo"hn` sits in the body as the literal "jo\"hn"
3116
+ * decodeSplicedQuotes(JSON.stringify({ account: '"jo\\"hn"' }));
3117
+ * // the text: {"account":"jo\"hn"}, which the server reads as jo"hn
3118
+ */
3119
+ function decodeSplicedQuotes(jsonText) {
3120
+ return jsonText.replace(/"(?:[^"\\]|\\.)*"/g, function (token) {
3121
+ var text = null;
3122
+ try {
3123
+ text = JSON.parse(token);
3124
+ } catch (tokenErr) {
3125
+ return token.replace(/\\"/g, '');
3126
+ }
3127
+ return JSON.stringify(text.replace(/"(?:[^"\\]|\\.)*"|"/g, function (segment) {
3128
+ if (segment === '"') {
3129
+ return '';
3130
+ }
3131
+ try {
3132
+ return JSON.parse(segment);
3133
+ } catch (segmentErr) {
3134
+ return segment.replace(/"/g, '');
3135
+ }
3136
+ }));
3137
+ });
3138
+ }
3139
+
3140
+ /**
3141
+ * escapeRegExp
3142
+ * Escapes every RegExp metacharacter of `text`, so a field name matches
3143
+ * itself inside a pattern built from it.
3144
+ *
3145
+ * @param {string} text - a field name
3146
+ * @returns {string} the escaped text
3147
+ *
3148
+ * @example
3149
+ * new RegExp('\\$' + escapeRegExp('pw[0]')).test('$pw[0]'); // true — `[0]` is not a character class
3150
+ */
3151
+ function escapeRegExp(text) {
3152
+ return String(text).replace(/[.*+?^${}()|[\]\\\/-]/g, '\\$&');
3153
+ }
3154
+
3155
+ /**
3156
+ * substituteFieldTokens
3157
+ * Resolves every `$<field>` token of `text` in ONE pass — the one grammar
3158
+ * shared by `is()` conditions, the client `query` body and the plugin's
3159
+ * dynamised rule set (#B603 / #B604 / #B606).
3160
+ *
3161
+ * A token is `$` immediately followed by one of `names`. The longest matching
3162
+ * name wins whatever order the names were listed in, so `$password-confirm`
3163
+ * is never read as `$password` + `-confirm`; a token ends where its name ends
3164
+ * provided the next character is not a name character (`[A-Za-z0-9_-]`), so
3165
+ * `($a)`, `$a===$b` and `$a,` resolve while `$passwordX` leaves `password`
3166
+ * alone. Names are matched case-sensitively and RegExp-escaped. Whatever
3167
+ * `resolve` returns is spliced verbatim and never scanned again, so a value
3168
+ * that itself contains `$other` stays as typed. A `$` that names none of
3169
+ * `names` is not a token and is left literal.
3170
+ *
3171
+ * @param {string} text - the text carrying the tokens
3172
+ * @param {string[]} names - the field names in scope (duplicates and empty names are ignored)
3173
+ * @param {function(string, string): string} resolve - `(name, token)` -> the replacement text
3174
+ * @returns {string} `text` with every token replaced
3175
+ *
3176
+ * @example
3177
+ * substituteFieldTokens('($a) === ($a-confirm)', ['a', 'a-confirm'], function(name) {
3178
+ * return JSON.stringify(values[name]);
3179
+ * });
3180
+ * // -> ("x$a") === ("x$a") — the `$a` inside the value is not resolved again
3181
+ */
3182
+ function substituteFieldTokens(text, names, resolve) {
3183
+ var list = [], i = 0, name = null;
3184
+ for (; i < names.length; i++) {
3185
+ name = String(names[i]);
3186
+ if ( name !== '' && list.indexOf(name) < 0 ) {
3187
+ list.push(name);
3188
+ }
3189
+ }
3190
+ if ( !list.length ) {
3191
+ return text;
3192
+ }
3193
+ // longest first: a longer name always wins over a name it starts with
3194
+ list.sort(function(a, b) {
3195
+ return b.length - a.length || ( (a < b) ? -1 : ( (a > b) ? 1 : 0 ) );
3196
+ });
3197
+ var re = new RegExp('\\$(' + list.map(escapeRegExp).join('|') + ')(?![A-Za-z0-9_-])', 'g');
3198
+ return String(text).replace(re, function(token, matched) {
3199
+ return resolve(matched, token);
3200
+ });
3201
+ }
3202
+
3067
3203
  function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
3068
3204
 
3069
3205
  var isGFFCtx = ( ( typeof(module) !== 'undefined' ) && module.exports ) ? false : true;
@@ -3675,22 +3811,41 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
3675
3811
  // replace placeholders by field values
3676
3812
  strData = JSON.stringify(queryData);
3677
3813
  if ( /\$/.test(strData) ) {
3678
- var variables = strData.match(/\$[-_\[\]a-z 0-9]+/g) || [];
3679
- var value = null, key = null;
3680
- for (let i = 0, len = variables.length; i < len; i++) {
3681
- key = variables[i].replace(/\$/g, '');
3682
- re = new RegExp("\\"+ variables[i].replace(/\[|\]/g, '\\$&'), "g");
3683
- value = local.data[key] || null;
3814
+ // #B606 — one pass through the shared tokenizer: the scan
3815
+ // `/\$[-_\[\]a-z 0-9]+/g` was lowercase-only (`$passwordConfirm` resolved
3816
+ // `$password` + `Confirm` — another field's value on the wire), read a space as
3817
+ // part of the token, and each name re-scanned the body after every splice
3818
+ // (`$password` ate `$password-confirm` in body order; a spliced `x$b` was hit
3819
+ // again). The token universe is the engine's fields plus, under live-check,
3820
+ // every control of the form (a sibling not yet validated resolves from the
3821
+ // live element, as before); a `$` naming none of them is text and stays as
3822
+ // typed — it used to go out as the string `null`, and threw under live-check.
3823
+ var tokenNames = Object.keys(local.data);
3824
+ if (isInlineValidation) {
3825
+ for (let f in fieldsSet) {
3826
+ if (fieldsSet[f].name) {
3827
+ tokenNames.push(fieldsSet[f].name);
3828
+ }
3829
+ }
3830
+ }
3831
+ var _queryForm = this.target.form;
3832
+ strData = substituteFieldTokens(strData, tokenNames, function(key) {
3833
+ var value = local.data[key] || null;
3684
3834
  if (!value && isInlineValidation) {
3685
3835
  // Retrieving live value instead of using fieldsSet.value
3686
- value = getElementByName(this.target.form, key).value;
3836
+ value = getElementByName(_queryForm, key).value;
3687
3837
  }
3688
-
3689
- strData = strData.replace( re, value );
3690
- }
3838
+ // #B600 — spliced as a quoted string operand escaped twice, the form every
3839
+ // other spliced value takes, so decodeSplicedQuotes() below restores it
3840
+ // exactly; through a function replacer, so a `$&` in it stays text. It went
3841
+ // in verbatim, which corrupted the body for a value carrying a `"` or `\`.
3842
+ return '\\"' + escapeForJsonString(escapeForJsonString(value)) + '\\"';
3843
+ });
3691
3844
  }
3692
3845
  // cleanup before sending
3693
- queryData = strData.replace(/\\"/g, '');
3846
+ // #B600 — each spliced value is decoded back, instead of every escaped quote being
3847
+ // deleted from the JSON text (which turned a `"` in a value into a backslash).
3848
+ queryData = decodeSplicedQuotes(strData);
3694
3849
  // TODO - support regexp for validIf
3695
3850
  var validIf = ( typeof(options.validIf) == 'undefined' ) ? true : options.validIf;
3696
3851
 
@@ -4383,6 +4538,10 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
4383
4538
  * "/^[0-9]+$/" -> only numbers
4384
4539
  * "$field === $fieldOther" -> will be evaluated
4385
4540
  *
4541
+ * A `$<field>` token follows `substituteFieldTokens`: the longest field name
4542
+ * wins, a token ends at any character outside [A-Za-z0-9_-] (so `($field)`
4543
+ * and `$field===$other` resolve), and a `$` naming no field stays literal.
4544
+ *
4386
4545
  * @param {object|string} condition - RegExp object, or condition to eval, or eval result
4387
4546
  * @param {string} [errorMessage] - error message
4388
4547
  * @param {string} [errorStack] - error stack
@@ -4428,94 +4587,149 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
4428
4587
  var re = null, flags = null;
4429
4588
  // Fixed added on 2021-03-13: $variable now replaced with real value beafore validation
4430
4589
  if ( /[\!\=>\>\<a-z 0-9]+/i.test(condition) ) {
4431
- var variables = condition.match(/\${0}[-_,.\[\]a-z0-9]+/ig); // without space(s)
4432
- if (variables && variables.length > 0) {
4433
- var compiledCondition = condition;
4434
- for (var i = 0, len = variables.length; i < len; ++i) {
4435
- // $varibale comparison
4436
- if ( typeof(self[ variables[i] ]) != 'undefined' && variables[i]) {
4437
- re = new RegExp("\\$"+ variables[i] +"(?!\\S+)", "g");
4438
- if ( self[ variables[i] ].value == "" ) {
4439
- compiledCondition = compiledCondition.replace(re, '""');
4440
- } else if ( typeof(self[ variables[i] ].value) == 'string' ) {
4441
- compiledCondition = compiledCondition.replace(re, '"'+ self[ variables[i] ].value +'"');
4442
- } else {
4443
- compiledCondition = compiledCondition.replace(re, self[ variables[i] ].value);
4444
- }
4445
- }
4590
+ // #B602 — a condition with nothing to substitute is still evaluated: the
4591
+ // evaluation below used to run only when a scan found an ASCII letter or digit
4592
+ // run, so a comparison of values made only of symbols or non-ASCII letters
4593
+ // (`!!!`, `é€`) never reached the grammar and always read as a mismatch.
4594
+ // #B604 — one pass through the shared tokenizer (longest name first, a token
4595
+ // ends at any non-name character, names RegExp-escaped): the per-name
4596
+ // `"\$" + name + "(?!\S+)"` replace resolved a token only when whitespace or
4597
+ // the end followed it, so `($a) === ($b)` and `$a===$b` never resolved, and a
4598
+ // bracket name became a character class. The token universe is the instance's
4599
+ // FIELDS (an own object carrying `value`): an engine method name is not a token
4600
+ // and stays literal for the grammar to refuse — it used to splice `undefined`.
4601
+ var fieldNames = [];
4602
+ for (var fieldKey in self) {
4603
+ if ( self.hasOwnProperty(fieldKey) && self[fieldKey] && typeof(self[fieldKey]) == 'object' && ('value' in self[fieldKey]) ) {
4604
+ fieldNames.push(fieldKey);
4605
+ }
4606
+ }
4607
+ var resolveFieldToken = function(name) {
4608
+ var value = self[name].value;
4609
+ if ( value == "" ) {
4610
+ return '""';
4446
4611
  }
4612
+ if ( typeof(value) == 'string' ) {
4613
+ // #B600 — a JSON string literal: a `"` in the value cannot break the
4614
+ // operand, and the function replacer keeps a `$&` in it as text.
4615
+ return JSON.stringify(value);
4616
+ }
4617
+ return value;
4618
+ };
4619
+ // Tokens are resolved OUTSIDE string literals only, and never inside a
4620
+ // regex literal (compiled exactly as authored, #B345): the plugin path
4621
+ // arrives here with every value already spliced as a literal, so a value
4622
+ // holding `$other` must not be resolved a second time (#B603).
4623
+ // `_SCS_SEGMENT_RE` splits a condition into string literals and the code
4624
+ // between them; the #B601 strip below walks the same segments.
4625
+ var _SCS_SEGMENT_RE = /"(?:[^"\\]|\\.)*"|[^"]+/g;
4626
+ var compiledCondition = condition;
4627
+ if ( !/^\//.test(condition) ) {
4628
+ compiledCondition = condition.replace(_SCS_SEGMENT_RE, function(part) {
4629
+ return ( part.charAt(0) === '"' ) ? part : substituteFieldTokens(part, fieldNames, resolveFieldToken);
4630
+ });
4631
+ }
4447
4632
 
4448
- try {
4449
- // #SCS1e (2026-04-24) — replaced the two `eval(...)` calls below with
4450
- // auditable equivalents. After `$var` substitution (lines 910-920),
4451
- // `compiledCondition` is either:
4452
- // (a) a regex literal `/<body>/<flags>` (when `/^\//` matches), or
4453
- // (b) a binary comparison `<operand><op><operand>` where operand ∈
4454
- // {number, "string", true, false, null, undefined} and op ∈
4455
- // {===, !==, ==, !=, <, >, <=, >=} — paren/`return`-stripped
4456
- // inside its branch, before the grammar match.
4457
- // Old eval executed arbitrary JS; any value reaching `$var` substitution
4458
- // that contained a quote (e.g. user input `bar"; process.exit();//`)
4459
- // could escape the `"..."` wrapper at line 916 and reach eval as
4460
- // arbitrary code. Grammar-locked replacements reject any input that
4461
- // doesn't fit the two documented shapes.
4462
- // if ( /^\//.test(compiledCondition) ) {
4463
- // isValid = eval(compiledCondition + '.test("' + this.value + '")')
4464
- // } else {
4465
- // isValid = eval(compiledCondition)
4466
- // }
4467
- // #B345 — the paren/`return` strip used to run HERE, before the branch
4468
- // decision, so it also mangled every parenthesized regex literal:
4469
- // groups were destroyed (`^(a|b)$` compiled as `^a|b$`, rebinding the
4470
- // anchors and turning middle alternatives substring-permissive),
4471
- // quantified groups were requantified (`(#TAG)?` became `#TA` plus an
4472
- // optional `G`), and a literal `return` inside a pattern was deleted —
4473
- // all silently, because the stripped text still compiled as a valid
4474
- // regex. The strip protects the BINARY-COMPARISON shape only, so it
4475
- // now lives inside that branch; the regex branch never evaluates the
4476
- // condition as JS (`new RegExp(body, flags).test(value)` — no eval),
4477
- // so parentheses there are legitimate syntax and a regex literal is
4478
- // compiled exactly as authored.
4479
- if ( /^\//.test(compiledCondition) ) {
4480
- var _scsRegexMatch = compiledCondition.match(/^\/(.+)\/([a-z]*)$/);
4481
- if (!_scsRegexMatch) {
4482
- throw new Error('Invalid regex literal: `' + compiledCondition + '`');
4483
- }
4484
- isValid = new RegExp(_scsRegexMatch[1], _scsRegexMatch[2]).test(this.value);
4633
+ try {
4634
+ // #SCS1e (2026-04-24) — replaced the two `eval(...)` calls below with
4635
+ // auditable equivalents. After `$var` substitution (lines 910-920),
4636
+ // `compiledCondition` is either:
4637
+ // (a) a regex literal `/<body>/<flags>` (when `/^\//` matches), or
4638
+ // (b) a binary comparison `<operand><op><operand>` where operand ∈
4639
+ // {number, "string", true, false, null, undefined} and op ∈
4640
+ // {===, !==, ==, !=, <, >, <=, >=} — paren/`return`-stripped
4641
+ // inside its branch, before the grammar match.
4642
+ // Old eval executed arbitrary JS; any value reaching `$var` substitution
4643
+ // that contained a quote (e.g. user input `bar"; process.exit();//`)
4644
+ // could escape the `"..."` wrapper at line 916 and reach eval as
4645
+ // arbitrary code. Grammar-locked replacements reject any input that
4646
+ // doesn't fit the two documented shapes.
4647
+ // if ( /^\//.test(compiledCondition) ) {
4648
+ // isValid = eval(compiledCondition + '.test("' + this.value + '")')
4649
+ // } else {
4650
+ // isValid = eval(compiledCondition)
4651
+ // }
4652
+ // #B345 — the paren/`return` strip used to run HERE, before the branch
4653
+ // decision, so it also mangled every parenthesized regex literal:
4654
+ // groups were destroyed (`^(a|b)$` compiled as `^a|b$`, rebinding the
4655
+ // anchors and turning middle alternatives substring-permissive),
4656
+ // quantified groups were requantified (`(#TAG)?` became `#TA` plus an
4657
+ // optional `G`), and a literal `return` inside a pattern was deleted —
4658
+ // all silently, because the stripped text still compiled as a valid
4659
+ // regex. The strip protects the BINARY-COMPARISON shape only, so it
4660
+ // now lives inside that branch; the regex branch never evaluates the
4661
+ // condition as JS (`new RegExp(body, flags).test(value)` — no eval),
4662
+ // so parentheses there are legitimate syntax and a regex literal is
4663
+ // compiled exactly as authored.
4664
+ if ( /^\//.test(compiledCondition) ) {
4665
+ var _scsRegexMatch = compiledCondition.match(/^\/(.+)\/([a-z]*)$/);
4666
+ if (!_scsRegexMatch) {
4667
+ throw new Error('Invalid regex literal: `' + compiledCondition + '`');
4668
+ }
4669
+ isValid = new RegExp(_scsRegexMatch[1], _scsRegexMatch[2]).test(this.value);
4670
+ } else {
4671
+ // security checks (#SCS1e) — strip parens/`return` before the
4672
+ // grammar-locked match; authored parens in a comparison stay
4673
+ // tolerated (`("a") === ("a")` strips to `"a" === "a"`).
4674
+ // #B601 — only OUTSIDE string literals: the strip ran over the compared
4675
+ // values too, so two values differing only by a parenthesis or the word
4676
+ // `return` compared as equal.
4677
+ compiledCondition = compiledCondition.replace(_SCS_SEGMENT_RE, function(_scsPart) {
4678
+ return ( _scsPart.charAt(0) === '"' ) ? _scsPart : _scsPart.replace(/(\(|\)|return)/g, '');
4679
+ });
4680
+ // #B600 — a string operand may carry escaped quotes and backslashes
4681
+ var _SCS_BINARY_RE = /^\s*(null|undefined|true|false|"(?:[^"\\]|\\.)*"|-?\d+(?:\.\d+)?)\s*(===|!==|<=|>=|==|!=|<|>)\s*(null|undefined|true|false|"(?:[^"\\]|\\.)*"|-?\d+(?:\.\d+)?)\s*$/;
4682
+ var _scsBinMatch = (typeof(compiledCondition) == 'string') ? compiledCondition.match(_SCS_BINARY_RE) : null;
4683
+ if (!_scsBinMatch) {
4684
+ // A condition that doesn't fit the grammar (e.g. a dangling
4685
+ // operator left by an empty cross-field reference) must FAIL
4686
+ // THE FIELD, not throw: is() runs on every keystroke during
4687
+ // live-check, and an uncaught throw propagates out of the
4688
+ // whole-form validity pass (main.js checkFieldAgainstRules
4689
+ // re-wraps + re-throws it), leaving the submit trigger ungated.
4690
+ // A genuine authoring typo stays visible via the warning
4691
+ // without killing live validation. Fail-closed: the field is
4692
+ // treated as invalid on both the client and the server.
4693
+ console.warn('[FormValidator] Could not evaluate condition `' + compiledCondition + '` - treating field as invalid.\n(grammar: <operand><op><operand>; operand ∈ number | "string" | true | false | null | undefined; op ∈ === !== == != < > <= >=)');
4694
+ isValid = false;
4485
4695
  } else {
4486
- // security checks (#SCS1e) — strip parens/`return` before the
4487
- // grammar-locked match; authored parens in a comparison stay
4488
- // tolerated (`("a") === ("a")` strips to `"a" === "a"`).
4489
- compiledCondition = compiledCondition.replace(/(\(|\)|return)/g, '');
4490
- var _SCS_BINARY_RE = /^\s*(null|undefined|true|false|"[^"]*"|-?\d+(?:\.\d+)?)\s*(===|!==|<=|>=|==|!=|<|>)\s*(null|undefined|true|false|"[^"]*"|-?\d+(?:\.\d+)?)\s*$/;
4491
- var _scsBinMatch = (typeof(compiledCondition) == 'string') ? compiledCondition.match(_SCS_BINARY_RE) : null;
4492
- if (!_scsBinMatch) {
4493
- // A condition that doesn't fit the grammar (e.g. a dangling
4494
- // operator left by an empty cross-field reference) must FAIL
4495
- // THE FIELD, not throw: is() runs on every keystroke during
4496
- // live-check, and an uncaught throw propagates out of the
4497
- // whole-form validity pass (main.js checkFieldAgainstRules
4498
- // re-wraps + re-throws it), leaving the submit trigger ungated.
4499
- // A genuine authoring typo stays visible via the warning
4500
- // without killing live validation. Fail-closed: the field is
4501
- // treated as invalid on both the client and the server.
4502
- console.warn('[FormValidator] Could not evaluate condition `' + compiledCondition + '` - treating field as invalid.\n(grammar: <operand><op><operand>; operand ∈ number | "string" | true | false | null | undefined; op ∈ === !== == != < > <= >=)');
4696
+ var _scsParseOperand = function(s) {
4697
+ var _t = s.replace(/^\s+|\s+$/g, '');
4698
+ if (_t === 'null') return null;
4699
+ if (_t === 'undefined') return undefined;
4700
+ if (_t === 'true') return true;
4701
+ if (_t === 'false') return false;
4702
+ // #B600 — a string operand is decoded as the JSON string literal the
4703
+ // splice made it (every `"`, `\` and control character escaped). An
4704
+ // authored literal that is not valid JSON (`"C:\dir"`) is read verbatim
4705
+ // between its quotes, as every string operand was before.
4706
+ if (/^"(?:[^"\\]|\\.)*"$/.test(_t)) {
4707
+ try {
4708
+ return JSON.parse(_t);
4709
+ } catch (_scsLiteralErr) {
4710
+ if (/^"[^"]*"$/.test(_t)) return _t.slice(1, -1);
4711
+ throw _scsLiteralErr;
4712
+ }
4713
+ }
4714
+ var _n = Number(_t);
4715
+ if (!isNaN(_n) && _t !== '') return _n;
4716
+ throw new Error('Invalid operand: `' + s + '`');
4717
+ };
4718
+ var _scsLeft = null, _scsRight = null, _scsOperandErr = null;
4719
+ try {
4720
+ _scsLeft = _scsParseOperand(_scsBinMatch[1]);
4721
+ _scsRight = _scsParseOperand(_scsBinMatch[3]);
4722
+ } catch (_scsErr) {
4723
+ _scsOperandErr = _scsErr;
4724
+ }
4725
+ if (_scsOperandErr) {
4726
+ // #B600 — an operand that cannot be read fails the FIELD, like a
4727
+ // grammar mismatch: a throw here would leave through the catch
4728
+ // below and abort the whole validity pass.
4729
+ console.warn('[FormValidator] Could not read an operand of `' + compiledCondition + '` - treating field as invalid.\n(' + _scsOperandErr.message + ')');
4503
4730
  isValid = false;
4504
4731
  } else {
4505
- var _scsParseOperand = function(s) {
4506
- var _t = s.replace(/^\s+|\s+$/g, '');
4507
- if (_t === 'null') return null;
4508
- if (_t === 'undefined') return undefined;
4509
- if (_t === 'true') return true;
4510
- if (_t === 'false') return false;
4511
- if (/^"[^"]*"$/.test(_t)) return _t.slice(1, -1);
4512
- var _n = Number(_t);
4513
- if (!isNaN(_n) && _t !== '') return _n;
4514
- throw new Error('Invalid operand: `' + s + '`');
4515
- };
4516
- var _scsLeft = _scsParseOperand(_scsBinMatch[1]);
4517
- var _scsOp = _scsBinMatch[2];
4518
- var _scsRight = _scsParseOperand(_scsBinMatch[3]);
4732
+ var _scsOp = _scsBinMatch[2];
4519
4733
  switch (_scsOp) {
4520
4734
  case '===': isValid = _scsLeft === _scsRight; break;
4521
4735
  case '!==': isValid = _scsLeft !== _scsRight; break;
@@ -4528,10 +4742,10 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
4528
4742
  }
4529
4743
  }
4530
4744
  }
4531
-
4532
- } catch (err) {
4533
- throw new Error(err.stack||err.message)
4534
4745
  }
4746
+
4747
+ } catch (err) {
4748
+ throw new Error(err.stack||err.message)
4535
4749
  }
4536
4750
  } else if ( condition instanceof RegExp ) {
4537
4751
 
@@ -6082,6 +6296,13 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
6082
6296
  return self
6083
6297
  };
6084
6298
 
6299
+ /**
6300
+ * The one `$`-token grammar, exposed for the validator plugin's dynamised rule
6301
+ * set — see `substituteFieldTokens`.
6302
+ * @type {function(string, string[], function(string, string): string): string}
6303
+ */
6304
+ FormValidatorUtil.substituteFieldTokens = substituteFieldTokens;
6305
+
6085
6306
  if ( ( typeof(module) !== 'undefined' ) && module.exports ) {
6086
6307
  // Publish as node.js module
6087
6308
  module.exports = FormValidatorUtil
@@ -6134,6 +6355,28 @@ function Routing() {
6134
6355
  // When exceeded, the oldest entry (insertion order) is evicted first.
6135
6356
  var MAX_CACHED_ROUTES = 5000;
6136
6357
 
6358
+ /**
6359
+ * Own-property test for a lookup keyed by a name the client may choose (#B650). A plain
6360
+ * `obj[key]` read also resolves `Object.prototype` members, so a query key named
6361
+ * `toString` or `valueOf` read as a requirement the rule declares.
6362
+ *
6363
+ * `Object.prototype.hasOwnProperty.call`, not `Object.hasOwn`: this file is also bundled
6364
+ * for the browser.
6365
+ *
6366
+ * @inner
6367
+ * @private
6368
+ * @param {object} obj - the object to test (a rule's `requirements` or `param`)
6369
+ * @param {string} key - the key to look for
6370
+ * @returns {boolean} true when `obj` itself carries `key`
6371
+ *
6372
+ * @example
6373
+ * hasOwn({ id: '/^[0-9]+$/' }, 'id'); // => true
6374
+ * hasOwn({ id: '/^[0-9]+$/' }, 'toString'); // => false
6375
+ */
6376
+ var hasOwn = function(obj, key) {
6377
+ return obj !== null && typeof(obj) != 'undefined' && Object.prototype.hasOwnProperty.call(obj, key);
6378
+ };
6379
+
6137
6380
 
6138
6381
  self.allowedMethodsString = self.allowedMethods.join(',');
6139
6382
 
@@ -6492,7 +6735,9 @@ function Routing() {
6492
6735
  continue;
6493
6736
  }
6494
6737
  let _key = uRo[p].substring(1);
6495
- if ( typeof(params.requirements[_key]) == 'undefined' ) {
6738
+ // #B650 — a requirement counts only when the rule declares it itself.
6739
+ // was: if ( typeof(params.requirements[_key]) == 'undefined' ) {
6740
+ if ( !hasOwn(params.requirements, _key) || typeof(params.requirements[_key]) == 'undefined' ) {
6496
6741
  continue;
6497
6742
  }
6498
6743
  let condition = params.requirements[_key];
@@ -6532,7 +6777,13 @@ function Routing() {
6532
6777
  // console.debug('passed '+ params.rule);
6533
6778
  // }
6534
6779
  for (let p in request[method]) {
6535
- if ( typeof(params.requirements[p]) != 'undefined' && uRo.indexOf(':' + p) < 0 ) {
6780
+ // #B650 — `p` is a key the CLIENT chose, so only a requirement the rule itself
6781
+ // declares may count. A query key named like an Object.prototype member
6782
+ // (toString, valueOf, ...) read as a declared requirement, and each such key
6783
+ // replaced one leading URL segment below: a request reached a rule whose path
6784
+ // differs from its own, past any path-based control applied outside the rule.
6785
+ // was: if ( typeof(params.requirements[p]) != 'undefined' && uRo.indexOf(':' + p) < 0 ) {
6786
+ if ( hasOwn(params.requirements, p) && typeof(params.requirements[p]) != 'undefined' && uRo.indexOf(':' + p) < 0 ) {
6536
6787
  uRo[uRoCount] = ':' + p;
6537
6788
  ++uRoCount;
6538
6789
 
@@ -6802,8 +7053,12 @@ function Routing() {
6802
7053
  key = _param[matched].substring(1);
6803
7054
 
6804
7055
  // No requirements defined for this param — accept any non-empty segment
6805
- if ( typeof(params.requirements) == 'undefined' || typeof(params.requirements[key]) == 'undefined' ) {
6806
- if ( typeof(params.param[key]) != 'undefined' && typeof(request.params) != 'undefined' && urlVal ) {
7056
+ // #B650 — a requirement or a param counts only when the rule declares it itself:
7057
+ // an inherited Object.prototype member is neither.
7058
+ // was: if ( typeof(params.requirements) == 'undefined' || typeof(params.requirements[key]) == 'undefined' ) {
7059
+ // was: if ( typeof(params.param[key]) != 'undefined' && typeof(request.params) != 'undefined' && urlVal ) {
7060
+ if ( typeof(params.requirements) == 'undefined' || typeof(params.requirements[key]) == 'undefined' || !hasOwn(params.requirements, key) ) {
7061
+ if ( typeof(params.param[key]) != 'undefined' && hasOwn(params.param, key) && typeof(request.params) != 'undefined' && urlVal ) {
6807
7062
  request.params[key] = urlVal;
6808
7063
  if ( typeof(request[requestMethod][key]) == 'undefined' ) {
6809
7064
  request[requestMethod][key] = urlVal;
@@ -6872,10 +7127,14 @@ function Routing() {
6872
7127
  tested = new RegExp(params.requirements[key]).test(urlVal);
6873
7128
  }
6874
7129
 
7130
+ // #B650 — the binding also requires the rule's OWN param and requirement
7131
+ // (was: the same test without the two hasOwn() terms).
6875
7132
  if (
6876
7133
  typeof(params.param[key]) != 'undefined' &&
7134
+ hasOwn(params.param, key) &&
6877
7135
  typeof(params.requirements) != 'undefined' &&
6878
7136
  typeof(params.requirements[key]) != 'undefined' &&
7137
+ hasOwn(params.requirements, key) &&
6879
7138
  typeof(request.params) != 'undefined' &&
6880
7139
  tested
6881
7140
  ) {
@@ -12264,29 +12523,61 @@ function DataHelper(){
12264
12523
  };
12265
12524
 
12266
12525
  /**
12267
- * Convert JSON string with structured keys to object
12526
+ * Parses a request payload into a plain object. Three input shapes:
12527
+ *
12528
+ * - a urlencoded string (`key=value&…`): split on `&`, then at the FIRST `=`,
12529
+ * each key and value percent-decoded exactly ONCE after the split, bracket
12530
+ * keys (`user[name]`, `item[0][id]`) nested; a value leaning `{`/`[` is
12531
+ * parsed as JSON when it parses (JSON carries its own types, so a quoted
12532
+ * `"true"` inside it stays a string) and kept verbatim otherwise; bare
12533
+ * `true`/`false`/`on`/`null` stay strings, a value-less segment is dropped,
12534
+ * a repeated key keeps the last value;
12535
+ * - a `{`/`[`-leading JSON document: parsed VERBATIM — never percent-decoded
12536
+ * (#B589) — after the quoted-token casting on the document text
12537
+ * (`"true"`/`"false"`/`"on"` → boolean, `"null"` in any case → null);
12538
+ * - an object: stringified first, so it takes the document contract (the
12539
+ * browser validator and DTO routes hand their fields over this way).
12540
+ *
12541
+ * A document that does not parse yields `undefined` (and one metadata-only
12542
+ * error line, #B590). A top-level `__proto__`/`constructor`/`prototype` key is
12543
+ * dropped on either path (#B592, #B446).
12268
12544
  *
12269
- * @param {string} JSON string with structured keys
12270
- * */
12545
+ * @global
12546
+ * @param {string|object} bodyStr - urlencoded string, JSON document, or object
12547
+ * @returns {object|undefined} the parsed object, or `undefined` for an invalid document
12548
+ * @example
12549
+ * formatDataFromString('user[name]=Ada&tag=a%26b'); // { user: { name: 'Ada' }, tag: 'a&b' }
12550
+ * formatDataFromString('{"active":"true","n":"2"}'); // { active: true, n: '2' }
12551
+ * formatDataFromString({ q: 'a%20b' }); // { q: 'a%20b' } (never decoded)
12552
+ */
12271
12553
  formatDataFromString = function(bodyStr){
12272
12554
 
12273
- if ( typeof(bodyStr) == 'object' ) {
12555
+ if ( typeof(bodyStr) == 'object' && bodyStr !== null ) {
12274
12556
  bodyStr = JSON.stringify(bodyStr)
12557
+ } else if ( typeof(bodyStr) != 'string' ) {
12558
+ bodyStr = String(bodyStr); // undefined / null / a number: `{}` after the split, as before
12275
12559
  }
12276
12560
 
12277
- try {
12278
- bodyStr = decodeURIComponent(bodyStr);
12279
- } catch (err) {
12280
- // Already decoded - ignoring
12281
- }
12282
-
12283
- // false & true case
12284
- if ( /(\"false\"|\"true\"|\"on\")/.test(bodyStr) ) {
12285
- bodyStr = bodyStr.replace(/\"false\"/g, false).replace(/\"true\"/g, true).replace(/\"on\"/g, true);
12286
- }
12287
- if ( /(\"null\")/i.test(bodyStr) ) {
12288
- bodyStr = bodyStr.replace(/\"null\"/ig, null);
12289
- }
12561
+ // #B588 / #B589 — was:
12562
+ // try {
12563
+ // bodyStr = decodeURIComponent(bodyStr);
12564
+ // } catch (err) {
12565
+ // // Already decoded - ignoring
12566
+ // }
12567
+ // // false & true case
12568
+ // if ( /(\"false\"|\"true\"|\"on\")/.test(bodyStr) ) {
12569
+ // bodyStr = bodyStr.replace(/\"false\"/g, false).replace(/\"true\"/g, true).replace(/\"on\"/g, true);
12570
+ // }
12571
+ // if ( /(\"null\")/i.test(bodyStr) ) {
12572
+ // bodyStr = bodyStr.replace(/\"null\"/ig, null);
12573
+ // }
12574
+ // That whole-string decode ran BEFORE the urlencoded split, so an encoded `&`
12575
+ // or `=` inside one value became a separator (#B588); and on a JSON document
12576
+ // — which JSON.stringify never percent-encodes — it re-decoded value TEXT, so
12577
+ // `%22`/`%0A` produced invalid JSON and the whole input was dropped (#B589).
12578
+ // The quoted-token casting is a DOCUMENT feature and now runs inside
12579
+ // parseBody's document branch only; a urlencoded pair is never coerced (bare
12580
+ // tokens never were).
12290
12581
 
12291
12582
  return parseBody(bodyStr);
12292
12583
  }
@@ -12311,6 +12602,12 @@ function DataHelper(){
12311
12602
 
12312
12603
  for (let o in tmp) {
12313
12604
 
12605
+ // #B592 — a top-level `__proto__` (an OWN key, which JSON.parse produces),
12606
+ // `constructor` or `prototype` assigned flat below would swap the prototype
12607
+ // of the RESULT object; drop the pair. Bracket paths are guarded per segment
12608
+ // inside parseLocalObj (#B446).
12609
+ if ( o === '__proto__' || o === 'constructor' || o === 'prototype' ) continue;
12610
+
12314
12611
  el[0] = o;
12315
12612
  el[1] = tmp[o];
12316
12613
 
@@ -12325,6 +12622,29 @@ function DataHelper(){
12325
12622
  return obj
12326
12623
  }
12327
12624
 
12625
+ /**
12626
+ * The one line a parse failure may log: the input's LENGTH and the error's NAME —
12627
+ * never the input, and never `err.message` (#B590). On the server the input is a
12628
+ * request body or the whole serialized query string, i.e. credentials and tokens
12629
+ * typed by a visitor; and this helper is browser-bundled, so the same line reaches
12630
+ * the console. The message is no safer than the input: a `JSON.parse` message can
12631
+ * quote the input itself — V8's "Unexpected token" form embeds the text around the
12632
+ * offending character, and JavaScriptCore's names the offending token.
12633
+ *
12634
+ * @inner
12635
+ * @private
12636
+ * @param {*} input - the text that failed to parse
12637
+ * @param {Error} err - the parse error
12638
+ * @returns {string} e.g. `42 chars (SyntaxError)`
12639
+ * @example
12640
+ * describeParseFailure('{"a":', new SyntaxError('x')); // '5 chars (SyntaxError)'
12641
+ */
12642
+ var describeParseFailure = function(input, err) {
12643
+ var len = ( typeof(input) == 'string' ) ? input.length : -1;
12644
+ var name = ( err && err.name ) ? err.name : 'Error';
12645
+ return len + ' chars (' + name + ')';
12646
+ };
12647
+
12328
12648
  var parseBody = function(body) {
12329
12649
  var obj = null
12330
12650
  , tmp = null
@@ -12337,10 +12657,21 @@ function DataHelper(){
12337
12657
  obj = ( isArrayType ) ? [] : {};
12338
12658
 
12339
12659
  if ( /^(\%7B|\%5B)/.test(body) ) {
12340
- tmp = JSON.parse(decodeURIComponent(body))
12341
- } else {
12342
- tmp = JSON.parse(body)
12660
+ // a fully percent-encoded document (a direct caller's shape, never the
12661
+ // request pipeline's): decoded ONCE, then treated like a raw document
12662
+ body = decodeURIComponent(body)
12663
+ }
12664
+ // #B588 / #B589 — the quoted-token casting, moved here from
12665
+ // formatDataFromString: `"true"`/`"false"`/`"on"` -> boolean and `"null"`
12666
+ // (any case) -> null, on the DOCUMENT text only. An escaped occurrence
12667
+ // inside a longer value (`\"true\"`) never matches.
12668
+ if ( /(\"false\"|\"true\"|\"on\")/.test(body) ) {
12669
+ body = body.replace(/\"false\"/g, false).replace(/\"true\"/g, true).replace(/\"on\"/g, true);
12343
12670
  }
12671
+ if ( /(\"null\")/i.test(body) ) {
12672
+ body = body.replace(/\"null\"/ig, null);
12673
+ }
12674
+ tmp = JSON.parse(body)
12344
12675
 
12345
12676
  if ( Array.isArray(tmp) ) {
12346
12677
  obj = parseCollection(tmp, obj)
@@ -12350,67 +12681,62 @@ function DataHelper(){
12350
12681
 
12351
12682
  return obj
12352
12683
  } catch (err) {
12353
- console.error('[365] could not parse body:\n' + body)
12684
+ // #B590 — metadata only (see describeParseFailure); the leading character
12685
+ // is one of `{`, `[` or `%` here, by the branch's own test.
12686
+ // was: console.error('[365] could not parse body:\n' + body)
12687
+ console.error('[365] could not parse body: ' + describeParseFailure(body, err) + ', leading ' + body.charAt(0))
12354
12688
  }
12355
12689
 
12356
12690
  } else {
12691
+ // #B588 — the standard form algorithm (the WHATWG urlencoded parser): split
12692
+ // on `&`, split each pair at the FIRST `=`, then percent-decode the key and
12693
+ // the value exactly ONCE. The loop it replaces decoded each whole segment
12694
+ // BEFORE its `=` split (`field=a%3Db` lost everything after `a`), split on
12695
+ // every `=` keeping only the first two parts, decoded key and value once
12696
+ // more, let a `{`-leading segment REPLACE the accumulator and stop, dropped
12697
+ // a value that merely started with `{`/`[` when it was not JSON, skipped a
12698
+ // value containing `[object `, and probed values for a literal `{}":`. Kept
12699
+ // as before: a value-less segment is dropped, an empty value is `''`, a
12700
+ // repeated key keeps the last value, bracket keys nest through parseLocalObj,
12701
+ // and no bare-token coercion happens on this path.
12357
12702
  obj = {};
12358
12703
  arr = body.split(/&/g);
12359
- if ( /(\"false\"|\"true\"|\"on\")/.test(body) )
12360
- body = body.replace(/\"false\"/g, false).replace(/\"true\"/g, true).replace(/\"on\"/g, true);
12361
-
12362
12704
 
12363
- var el = {}
12705
+ var idx = -1
12706
+ , key = null
12364
12707
  , value = null
12365
- , key = null;
12708
+ , path = null;
12366
12709
 
12367
12710
  for (var i = 0, len = arr.length; i < len; ++i) {
12368
12711
  if (!arr[i]) continue;
12369
12712
 
12370
- // #B30: tolerate a malformed `%` escape (fall back to the raw
12371
- // segment) instead of letting decodeURIComponent throw URIError —
12372
- // an unguarded throw here propagates to processRequestData with no
12373
- // uncaughtException handler and crashes the bundle.
12374
- arr[i] = safeDecodeURIComponent(arr[i]);
12713
+ idx = arr[i].indexOf('=');
12714
+ if (idx < 0) continue; // a value-less segment: dropped, as before
12375
12715
 
12376
- if ( /^\{/.test(arr[i]) || /\=\{/.test(arr[i]) || /\=\[/.test(arr[i]) ) {
12377
- try {
12378
- if (/^\{/.test(arr[i])) {
12379
- obj = JSON.parse(arr[i]);
12380
- break;
12381
- } else {
12382
- el = arr[i].match(/\=(.*)/);
12383
- el[0] = arr[i].split(/\=/)[0];
12384
- obj[ el[0] ] = JSON.parse( el[1] );
12385
- }
12716
+ // #B30: malformed-%-safe decode (raw fallback, never a throw) — once, after the split.
12717
+ key = safeDecodeURIComponent(arr[i].substring(0, idx));
12718
+ value = safeDecodeURIComponent(arr[i].substring(idx + 1));
12386
12719
 
12720
+ // #B592 — a whole key named after the prototype accessors would swap the
12721
+ // prototype of the result (a JSON-valued `__proto__`) or shadow it: drop the
12722
+ // pair. Bracket paths are guarded per segment inside parseLocalObj (#B446).
12723
+ if ( key === '__proto__' || key === 'constructor' || key === 'prototype' ) continue;
12387
12724
 
12388
- } catch (err) {
12389
- console.error('[parseBody#1] could not parse body:\n' + arr[i])
12390
- }
12391
- } else {
12392
- el = arr[i].split(/=/);
12393
- if ( /\{\}\"\:/.test(el[1]) ) { //might be a json
12394
- try {
12395
- el[1] = JSON.parse(el[1])
12396
- } catch (err) {
12397
- console.error('[parseBody#2] could not parse body:\n' + el[1])
12398
- }
12725
+ // a JSON value (`filter={"a":1}`, `list=[1,2]`, or their encoded forms) is
12726
+ // parsed when it parses and kept VERBATIM otherwise (`note={name}` is text)
12727
+ if ( /^[\{\[]/.test(value) ) {
12728
+ try {
12729
+ value = JSON.parse(value);
12730
+ } catch (notAJsonValue) {
12731
+ // not JSON after all — keep the text
12399
12732
  }
12733
+ }
12400
12734
 
12401
- if ( typeof(el[1]) == 'string' && !/\[object /.test(el[1])) {
12402
- key = null;
12403
- // #B30: malformed-%-safe decode (see the arr[] loop above).
12404
- el[0] = safeDecodeURIComponent(el[0]);
12405
- el[1] = safeDecodeURIComponent(el[1]);
12406
-
12407
- if ( /^(.*)\[(.*)\]/.test(el[0]) ) { // some[field] ?
12408
- key = el[0].replace(/\]/g, '').split(/\[/g);
12409
- obj = parseLocalObj(obj, key, 0, el[1])
12410
- } else {
12411
- obj[ el[0] ] = el[1]
12412
- }
12413
- }
12735
+ if ( /^(.*)\[(.*)\]/.test(key) ) { // some[field] ?
12736
+ path = key.replace(/\]/g, '').split(/\[/g);
12737
+ obj = parseLocalObj(obj, path, 0, value)
12738
+ } else {
12739
+ obj[ key ] = value
12414
12740
  }
12415
12741
  }
12416
12742
 
@@ -12497,10 +12823,21 @@ function DataHelper(){
12497
12823
  }
12498
12824
  // Assinging index or key
12499
12825
  else {
12500
- if ( /^\d+$/.test(key[k]) && !Array.isArray(obj) ) {
12501
- obj = [];
12502
- // _key = (obj.length > 0) ? obj.length-1 : 0;
12503
- }
12826
+ // #B591 — was:
12827
+ // if ( /^\d+$/.test(key[k]) && !Array.isArray(obj) ) {
12828
+ // obj = [];
12829
+ // // _key = (obj.length > 0) ? obj.length-1 : 0;
12830
+ // }
12831
+ // That rebind meant "a numeric segment turns this level into an array", but
12832
+ // it only rebound the LOCAL: the parent never saw the new array, the slot
12833
+ // below was then seeded with null, and the recursion dereferenced it — every
12834
+ // path through it threw a TypeError (`0[a]=1`, `a[x]=1&a[0][b]=2`), and from
12835
+ // the GET/HEAD `inheritedData` call site that throw had no try/catch and
12836
+ // exited the bundle process. Arrays are built by the look-ahead above (the
12837
+ // slot is created as an array when the NEXT segment is numeric); a numeric
12838
+ // segment under an object now simply creates a plain object slot, so
12839
+ // `0[a]=1` nests as the key `0` holding `a`. The client twin in the
12840
+ // validator plugin carries the same removal.
12504
12841
  // Handle unstructured array from object
12505
12842
  // E.G.: design[1][id] where design is starting with `1` index instead of `0`
12506
12843
  // if ( Array.isArray(obj) ) {
@@ -15410,11 +15747,11 @@ function ValidatorPlugin(rules, data, formId, culture) {
15410
15747
  * current level an array.
15411
15748
  *
15412
15749
  * @inner
15413
- * @param {(object|Array)} obj - accumulator, mutated in place (may be replaced when the head segment is numeric — assign the return value)
15750
+ * @param {(object|Array)} obj - accumulator, mutated in place and returned
15414
15751
  * @param {Array<string>} key - the split key path, e.g. `item[0][id]` -> `['item','0','id']`
15415
15752
  * @param {number} k - current recursion depth into `key`
15416
15753
  * @param {*} value - the field value to assign at the leaf
15417
- * @returns {(object|Array)} the (possibly replaced) accumulator
15754
+ * @returns {(object|Array)} the accumulator (never a replacement — #B591 removed the rebind that pretended otherwise)
15418
15755
  *
15419
15756
  * @example
15420
15757
  * // 'item[0][id]' -> ['item','0','id']
@@ -15461,9 +15798,15 @@ function ValidatorPlugin(rules, data, formId, culture) {
15461
15798
  }
15462
15799
  // Assigning index or key
15463
15800
  else {
15464
- if ( /^\d+$/.test(key[k]) && !Array.isArray(obj) ) {
15465
- obj = [];
15466
- }
15801
+ // #B591 — was:
15802
+ // if ( /^\d+$/.test(key[k]) && !Array.isArray(obj) ) {
15803
+ // obj = [];
15804
+ // }
15805
+ // The rebind only rebound the LOCAL, the slot below was then seeded with
15806
+ // null and the recursion dereferenced it: every path through it threw, so
15807
+ // a field named `0[a]` broke the whole submission. Same removal as the
15808
+ // server helper (helpers/data `parseLocalObj`); a numeric segment under an
15809
+ // object now creates a plain object slot.
15467
15810
  // Init array or object
15468
15811
  if ( typeof(obj[ _key ]) == 'undefined' ) {
15469
15812
  obj[ _key ] = null;
@@ -23987,6 +24330,58 @@ function ValidatorPlugin(rules, data, formId, culture) {
23987
24330
  }
23988
24331
  }
23989
24332
 
24333
+ /**
24334
+ * escapeForJsonString
24335
+ * Escapes a value for use INSIDE a JSON string literal: `"`, `\` and the
24336
+ * control characters U+0000 to U+001F, exactly what JSON requires and
24337
+ * nothing else, so a value carrying none of them comes back unchanged
24338
+ * (#B600). A lone surrogate is left as it is on purpose: it never broke a
24339
+ * parse, so escaping it would only change bytes. `form-validator.js`
24340
+ * carries the same function for the query-body splice.
24341
+ *
24342
+ * @inner
24343
+ * @param {*} value - coerced with `String()`
24344
+ * @returns {string} the escaped text, without surrounding quotes
24345
+ *
24346
+ * @example
24347
+ * escapeForJsonString('say "hi"'); // the text: say \"hi\"
24348
+ */
24349
+ var escapeForJsonString = function(value) {
24350
+ return String(value).replace(/[\u0000-\u001f"\\]/g, function(ch) {
24351
+ switch (ch) {
24352
+ case '"' : return '\\"';
24353
+ case '\\' : return '\\\\';
24354
+ case '\b' : return '\\b';
24355
+ case '\f' : return '\\f';
24356
+ case '\n' : return '\\n';
24357
+ case '\r' : return '\\r';
24358
+ case '\t' : return '\\t';
24359
+ default : return '\\u' + ('000' + ch.charCodeAt(0).toString(16)).slice(-4);
24360
+ }
24361
+ });
24362
+ }
24363
+
24364
+ /**
24365
+ * quoteForDynamisedRules
24366
+ * Returns `value` as a quoted string operand, ready to splice into the
24367
+ * STRINGIFIED rule set that `getDynamisedRules` parses back (#B600). Two
24368
+ * levels of escaping: the inner one makes `"<value>"` a JSON string
24369
+ * literal, the operand `is()` decodes; the outer one embeds that literal in
24370
+ * the rule set's own JSON text. For a value with no `"`, `\` or control
24371
+ * character the result is exactly the historical `\"<value>\"` splice.
24372
+ *
24373
+ * @inner
24374
+ * @param {*} value - coerced with `String()`
24375
+ * @returns {string} the splice text
24376
+ *
24377
+ * @example
24378
+ * quoteForDynamisedRules('abc'); // the text: \"abc\" (unchanged)
24379
+ * quoteForDynamisedRules('ab"cd'); // the text: \"ab\\\"cd\" (the rule set parses it to "ab\"cd")
24380
+ */
24381
+ var quoteForDynamisedRules = function(value) {
24382
+ return '\\"' + escapeForJsonString(escapeForJsonString(value)) + '\\"';
24383
+ }
24384
+
23990
24385
  /**
23991
24386
  * getCastedValue
23992
24387
  * Returns the value to use for `fieldName` — raw for the engine to
@@ -24046,6 +24441,19 @@ function ValidatorPlugin(rules, data, formId, culture) {
24046
24441
  if ( /\,/.test(fields[fieldName]) ) {
24047
24442
  fields[fieldName] = fields[fieldName].replace(/\,/g, '.').replace(/\s+/g, '');
24048
24443
  }
24444
+ // #B600 — in dynamised mode this value is spliced into the stringified rule
24445
+ // set, so only a NUMBER goes in raw: a numeric comparison must stay numeric,
24446
+ // and the condition grammar reads the space padding around it. Anything else
24447
+ // is spliced as an escaped string operand and compares as text; it all went
24448
+ // in raw, so a `"` or `\` typed into a number field broke the closing parse.
24449
+ if (
24450
+ isOnDynamisedRules
24451
+ && typeof(fields[fieldName]) != 'number'
24452
+ && typeof(fields[fieldName]) != 'boolean'
24453
+ && !/^ *-?\d+(?:\.\d+)? *$/.test(fields[fieldName])
24454
+ ) {
24455
+ return quoteForDynamisedRules(fields[fieldName]);
24456
+ }
24049
24457
  return fields[fieldName];
24050
24458
  }
24051
24459
 
@@ -24064,7 +24472,10 @@ function ValidatorPlugin(rules, data, formId, culture) {
24064
24472
  return (/^true$/i.test(fields[fieldName])) ? true : false;
24065
24473
  }
24066
24474
 
24067
- return isOnDynamisedRules ? '\\"'+ fields[fieldName] +'\\"' : fields[fieldName];
24475
+ // #B600 — escaped inside its quotes (quoteForDynamisedRules); the value was
24476
+ // concatenated between them verbatim, so a `"`, `\` or control character in
24477
+ // it broke the closing parse of the whole rule set.
24478
+ return isOnDynamisedRules ? quoteForDynamisedRules(fields[fieldName]) : fields[fieldName];
24068
24479
  }
24069
24480
 
24070
24481
  /**
@@ -24088,6 +24499,30 @@ function ValidatorPlugin(rules, data, formId, culture) {
24088
24499
  return fields;
24089
24500
  }
24090
24501
 
24502
+ /**
24503
+ * getDynamisedRules
24504
+ * Resolves every `$<field>` token of the STRINGIFIED rule set with that
24505
+ * field's value — cast through `getCastedValue` when the field carries a
24506
+ * rule, quoted through `quoteForDynamisedRules` otherwise — and parses the
24507
+ * result back. Under a live check on a single element the whole form's
24508
+ * fields are (re)collected first, since a condition may compare the element
24509
+ * with a sibling.
24510
+ *
24511
+ * One pass through the engine's tokenizer (#B603): the per-name loop that
24512
+ * preceded it re-scanned the whole rule set after every splice, so a value
24513
+ * holding `$<otherField>` was substituted a second time whenever that field
24514
+ * came later in the descending walk — and its DOM-fallback second loop
24515
+ * (#B234) could only ever act on a `$` a spliced value had carried in.
24516
+ *
24517
+ * @inner
24518
+ * @param {string} stringifiedRules - `JSON.stringify(rules)`
24519
+ * @param {object} fields - the collected field values (name -> value)
24520
+ * @param {object|null} $fields - the DOM handles (null on the server paths)
24521
+ * @param {boolean} isLiveCheckingOnASingleElement - a live check on one element
24522
+ * @returns {object} the rule set with every token resolved — or, should the
24523
+ * result not parse, the rules as declared (the engine then resolves or
24524
+ * fails closed)
24525
+ */
24091
24526
  var getDynamisedRules = function(stringifiedRules, fields, $fields, isLiveCheckingOnASingleElement) {
24092
24527
 
24093
24528
  // Because this could also be live check, if it is the case, we need all fields
@@ -24095,7 +24530,6 @@ function ValidatorPlugin(rules, data, formId, culture) {
24095
24530
  // meant to validate one field at the time, you could fall in a case where the current
24096
24531
  // field should be compared with another field of the same form.
24097
24532
  var ruleObj = JSON.parse(stringifiedRules.replace(/\"(true|false)\"/gi, '$1'));
24098
- var stringifiedRulesTmp = JSON.stringify(ruleObj);
24099
24533
  if (isLiveCheckingOnASingleElement) {
24100
24534
  var $currentForm = $fields[Object.getOwnPropertyNames($fields)[0]].form;
24101
24535
  var vInfos = getFormValidationInfos($currentForm, ruleObj);
@@ -24105,62 +24539,37 @@ function ValidatorPlugin(rules, data, formId, culture) {
24105
24539
  $fields = vInfos.$fields;
24106
24540
  }
24107
24541
 
24108
-
24109
- var re = null, _field = null, arrFields = [], a = 0;
24110
- // avoiding conflict like ["myfield", "myfield-name"]
24111
- // where once `myfield` is replaced for exemple with `1234`, you also get 1234-name left behind
24112
- // TODO - Replace this trick with a RegExp matching only the exact word
24113
- // TODO - test this one:
24114
- // \W(\$myfield-name)(?!-)\W
24542
+ var arrFields = [], spliced = {};
24115
24543
  for (let field in fields) {
24116
- arrFields[a] = field;
24117
- a++;
24118
- }
24119
- arrFields.sort().reverse();
24120
-
24121
- for (let i = 0, len = arrFields.length; i < len; i++) {
24122
- _field = arrFields[i].replace(/\-|\_|\@|\#|\.|\[|\]/g, '\\$&');
24123
- re = new RegExp('\\$'+_field, 'g');
24124
- // default field value
24125
- let fieldValue = '\\"'+ fields[arrFields[i]] +'\\"';
24126
- let isInRule = re.test(stringifiedRulesTmp);
24127
- if ( isInRule && typeof(ruleObj[arrFields[i]]) != 'undefined' ) {
24128
- fieldValue = getCastedValue(ruleObj, fields, arrFields[i], true);
24129
- } else if ( isInRule ) {
24130
- console.warn('`'+arrFields[i]+'` is used in a dynamic rule without definition. This could lead to an evaluation error. Casting `'+arrFields[i]+'` to `string`.');
24131
- }
24132
-
24133
- stringifiedRules = stringifiedRules.replace(re, fieldValue );
24134
- }
24135
- // #B234 — this second loop is a DOM FALLBACK: it re-derives each splice
24136
- // value from the live element (`$fields[...].value` / `.checked`), and
24137
- // the server auto path (`backendInit`) passes `$fields = null`, so ANY
24138
- // `$` surviving loop 1 threw here — a regex end-anchor in an `is`
24139
- // condition, or a `$` inside a human-readable message string. Loop 1
24140
- // already replaces every KNOWN field's token, so what reaches loop 2 is
24141
- // a leftover it structurally cannot match anyway: skipping when there is
24142
- // no DOM matches what the client does when this re-scan no-ops, and
24143
- // leaves every previously-working substitution byte-identical. Same
24144
- // `$fields &&` guard shape as the #B127 precedent one function later.
24145
- // was: `if ( /\$(.*)/.test(stringifiedRules) ) {`
24146
- if ( $fields && /\$(.*)/.test(stringifiedRules) ) {
24147
- for (let i = 0, len = arrFields.length; i < len; i++) {
24148
- _field = arrFields[i].replace(/\-|\_|\@|\#|\.|\[|\]/g, '\\$&');
24149
- re = new RegExp('\\$'+_field, 'g');
24150
- // default field value
24151
- let fieldValue = ($fields[arrFields[i]].value != '' ) ? '\\"'+ $fields[arrFields[i]].value +'\\"' : '\\"\\"';
24152
- let isInRule = re.test(stringifiedRulesTmp);
24153
- if ( isInRule && typeof(ruleObj[arrFields[i]]) != 'undefined' ) {
24154
- fieldValue = getCastedValue(ruleObj, fields, arrFields[i], true);
24155
- } else if ( isInRule ) {
24156
- console.warn('`'+arrFields[i]+'` is used in a dynamic rule without definition. This could lead to an evaluation error. Casting `'+arrFields[i]+'` to `string`.');
24157
- }
24158
-
24159
- stringifiedRules = stringifiedRules.replace(re, fieldValue || $fields[arrFields[i]].checked);
24160
- }
24161
- }
24162
-
24163
- return JSON.parse(stringifiedRules)
24544
+ arrFields.push(field);
24545
+ }
24546
+ // #B603 — the tokenizer picks the longest name and never scans a replacement
24547
+ // again; the resolver runs once per NAME (cast once, warn once).
24548
+ stringifiedRules = FormValidator.substituteFieldTokens(stringifiedRules, arrFields, function(field) {
24549
+ if ( typeof(spliced[field]) != 'undefined' ) {
24550
+ return spliced[field];
24551
+ }
24552
+ // default field value (#B600 — escaped inside its quotes, see quoteForDynamisedRules)
24553
+ let fieldValue = quoteForDynamisedRules(fields[field]);
24554
+ if ( typeof(ruleObj[field]) != 'undefined' ) {
24555
+ fieldValue = getCastedValue(ruleObj, fields, field, true);
24556
+ } else {
24557
+ console.warn('`'+field+'` is used in a dynamic rule without definition. This could lead to an evaluation error. Casting `'+field+'` to `string`.');
24558
+ }
24559
+ spliced[field] = fieldValue;
24560
+ return fieldValue;
24561
+ });
24562
+
24563
+ // #B600 — a splice can no longer break this parse (every value is escaped), but
24564
+ // a failure here must never throw out of the validation pass: fall back to the
24565
+ // rules as declared, whose `$` references the engine's own is() substitution
24566
+ // then resolves or fails closed (the #B82 precedent: fail the field, never the pass).
24567
+ try {
24568
+ return JSON.parse(stringifiedRules);
24569
+ } catch (parseErr) {
24570
+ console.warn('[FormValidator] Could not parse the dynamised rules - validating against the rules as declared.\n(' + parseErr.message + ')');
24571
+ return ruleObj;
24572
+ }
24164
24573
  }
24165
24574
 
24166
24575
 
@@ -24219,13 +24628,14 @@ function ValidatorPlugin(rules, data, formId, culture) {
24219
24628
  /**
24220
24629
  * Apply every rule declared for one field to the FormValidator instance `d`.
24221
24630
  *
24222
- * Array-form rules (`isInList: [...]`) get their FIRST argument scanned for
24223
- * `$`-prefixed tokens; a token resolving to a real field (a `d` key with a
24631
+ * Array-form rules (`isInList: [...]`) — except `is` / `is<N>`, whose
24632
+ * condition the engine resolves itself (#B603) — get their FIRST argument
24633
+ * scanned for `$`-prefixed tokens; a token resolving to a real field (a `d` key with a
24224
24634
  * defined `.value`) is substituted with that value, anything else stays
24225
24635
  * LITERAL (#B239 — the blind deref crashed on unknown names and spliced
24226
24636
  * "undefined" on engine-method-name collisions). Later elements are never
24227
24637
  * scanned. Cross-field refs inside array rules are consumed upstream by
24228
- * getDynamisedRules loop 1 (quoted — #B240), so in practice only leftover
24638
+ * getDynamisedRules (quoted — #B240), so in practice only leftover
24229
24639
  * non-field tokens reach the scan here.
24230
24640
  *
24231
24641
  * @inner
@@ -24329,7 +24739,12 @@ function ValidatorPlugin(rules, data, formId, culture) {
24329
24739
  if (Array.isArray(rules[field][rule])) { // has args
24330
24740
  //convert array to arguments
24331
24741
  args = JSON.clone(rules[field][rule]);
24332
- if ( /\$[\-\w\[\]]*/.test(args[0]) ) {
24742
+ // #B603 — an `is` / `is<N>` condition is the ENGINE's to resolve
24743
+ // (getDynamisedRules has already spliced every known field as a
24744
+ // string literal, and is() resolves tokens outside literals only):
24745
+ // this raw first-occurrence replace re-hit a `$<field>` a spliced
24746
+ // VALUE carried in, so the two-argument `is` form mismatched on it.
24747
+ if ( !/^is\d*$/.test(rule) && /\$[\-\w\[\]]*/.test(args[0]) ) {
24333
24748
  var foundVariables = args[0].match(/\$[\-\w\[\]]*/g);
24334
24749
  for (var v = 0, vLen = foundVariables.length; v < vLen; ++v) {
24335
24750
  // #B239 — the deref used to be blind, throwing
@@ -24341,7 +24756,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
24341
24756
  // defined keys with no `.value`). A token that does not
24342
24757
  // resolve to a real field now stays LITERAL, so strict
24343
24758
  // comparison applies. Cross-field refs inside array
24344
- // rules remain owned by #B240 (upstream loop-1 quoting).
24759
+ // rules remain owned by #B240 (upstream getDynamisedRules quoting).
24345
24760
  // was: args[0] = args[0].replace( foundVariables[v], d[foundVariables[v].replace('$', '')].value )
24346
24761
  var _refName = foundVariables[v].replace('$', '');
24347
24762
  if (
@@ -30523,16 +30938,35 @@ function Collection(content, options) {
30523
30938
  // throw new Error('Could not evaluate condition `'+ condition +'`.\n' + err.stack );
30524
30939
  // }
30525
30940
  // }
30526
- var CONDITION_RE = /^\s*(new\s+Date\("[^"]*"\)|"[^"]*"|-?\d+(?:\.\d+)?)\s*(===|!==|<=|>=|==|!=|<|>)\s*(new\s+Date\("[^"]*"\)|"[^"]*"|-?\d+(?:\.\d+)?)\s*$/;
30941
+ // #B609 — the string operand now accepts JSON escapes (`\"`, `\\`, …) so a value
30942
+ // containing a quote or backslash cannot break the grammar. Previously the operand
30943
+ // was `"[^"]*"`, which no escaped quote could satisfy: a single row whose string
30944
+ // value held a `"` threw and poisoned the whole query.
30945
+ var CONDITION_RE = /^\s*(new\s+Date\("[^"]*"\)|"(?:\\.|[^"\\])*"|-?\d+(?:\.\d+)?)\s*(===|!==|<=|>=|==|!=|<|>)\s*(new\s+Date\("[^"]*"\)|"(?:\\.|[^"\\])*"|-?\d+(?:\.\d+)?)\s*$/;
30527
30946
  var parseOperand = function(s) {
30528
30947
  var m = s.match(/^\s*new\s+Date\("([^"]*)"\)\s*$/);
30529
30948
  if (m) return new Date(m[1]);
30530
30949
  var t = s.replace(/^\s+|\s+$/g, '');
30531
- if (/^"[^"]*"$/.test(t)) return t.slice(1, -1);
30950
+ if (/^"(?:\\.|[^"\\])*"$/.test(t)) return JSON.parse(t);
30532
30951
  var n = Number(t);
30533
30952
  if (!isNaN(n) && t !== '') return n;
30534
30953
  throw new Error('Invalid operand: `'+ s +'`');
30535
30954
  };
30955
+ // #B609 — build a safe `<left><op><right>` condition for a STRING left operand:
30956
+ // strip the full operator (every form the grammar admits, longest first), trim the
30957
+ // compared value, tolerate a pre-quoted operand, and JSON-encode both sides so a
30958
+ // quote/backslash in a value — or an operator character inside the operand — can no
30959
+ // longer corrupt the expression. The numeric and datetime paths are left untouched.
30960
+ var STRING_OP_RE = /^(===|!==|<=|>=|==|!=|<|>)/;
30961
+ var buildStringCondition = function(left, filter) {
30962
+ var fs = String(filter);
30963
+ var m = fs.match(STRING_OP_RE);
30964
+ if (!m) { return JSON.stringify(String(left)) + fs; }
30965
+ var op = m[1];
30966
+ var right = fs.slice(op.length).replace(/^\s+|\s+$/g, '');
30967
+ if (/^"(?:\\.|[^"\\])*"$/.test(right)) { right = JSON.parse(right); }
30968
+ return JSON.stringify(String(left)) + op + JSON.stringify(right);
30969
+ };
30536
30970
  var tryEval = function(condition) {
30537
30971
  var m = (typeof(condition) == 'string') ? condition.match(CONDITION_RE) : null;
30538
30972
  if (!m) {
@@ -30802,16 +31236,15 @@ function Collection(content, options) {
30802
31236
  && !/undefined|function/.test(typeof(_content))
30803
31237
  && !searchOptionRules.skipEval
30804
31238
  ) { // with operations
30805
- let originalFilter = filter;
30806
31239
  let condition = _content + filter;
30807
31240
  if ( typeof(filter) == 'string' && typeof(_content) == 'string' ) {
30808
- let comparedValue = filter.replace(/^(<=|>=|!==|!=|===|!==)/g, '');
30809
- if ( typeof(_content) == 'string' && !/^\"(.*)\"$/.test(comparedValue) ) {
30810
- filter = filter.replace(comparedValue, '\"'+ comparedValue + '\"');
30811
- }
30812
- condition = '\"'+_content+'\"' + filter;
30813
- // restoring in case of datetime eval
30814
- filter = originalFilter;
31241
+ // #B609 — was: quote `_content` and the partially-stripped filter,
31242
+ // then concat. That threw on a `"` in either operand, failed to strip
31243
+ // `==`/`>`/`<` (so the operator leaked into the operand), and kept a
31244
+ // leading space in the compared value (wrong rows). Build both operands
31245
+ // safely instead. `filter` is no longer mutated, so the datetime path
31246
+ // below still sees the original string.
31247
+ condition = buildStringCondition(_content, filter);
30815
31248
  }
30816
31249
 
30817
31250
  // looking for a datetime ?
@@ -30944,6 +31377,12 @@ function Collection(content, options) {
30944
31377
  ++matched;
30945
31378
  }
30946
31379
 
31380
+ } else if (typeof(value) == 'string') {
31381
+ // #B609 — a string value must be JSON-encoded like the find() path;
31382
+ // `value + filter` (unquoted) threw for every string comparison here.
31383
+ if (tryEval(buildStringCondition(value, filter))) {
31384
+ ++matched;
31385
+ }
30947
31386
  } else if (tryEval(value + filter)) {
30948
31387
 
30949
31388
  ++matched;