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.
- package/CHANGELOG.md +48 -0
- package/README.md +76 -59
- package/ROADMAP.md +12 -2
- package/framework/v0.6.33/VERSION +1 -0
- package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.js +686 -247
- package/framework/v0.6.33/core/asset/plugin/dist/vendor/gina/js/gina.min.js +721 -0
- package/framework/v0.6.33/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.33/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.6.32 → v0.6.33}/core/config.js +61 -7
- package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/index.js +223 -61
- package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/connector.v3.js +97 -81
- package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/connector.v4.js +107 -91
- package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/session-store.v3.js +36 -2
- package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/session-store.v4.js +36 -2
- package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.js +430 -56
- package/framework/{v0.6.32 → v0.6.33}/core/gna.js +121 -18
- package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/src/form-validator.js +318 -97
- package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/src/main.js +145 -67
- package/framework/{v0.6.32 → v0.6.33}/core/server.isaac.js +136 -50
- package/framework/v0.6.33/core/server.isaac.rapid-reset.js +274 -0
- package/framework/{v0.6.32 → v0.6.33}/core/server.js +135 -35
- package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/settings.server.json +2 -2
- package/framework/{v0.6.32 → v0.6.33}/core/template/conf/settings.json +3 -2
- package/framework/{v0.6.32 → v0.6.33}/helpers/data/src/main.js +148 -70
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/infer.js +9 -5
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/models.js +9 -5
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/test.js +9 -1
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/add.js +12 -1
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/help.txt +7 -6
- package/framework/v0.6.33/lib/cmd/env/inc/name.js +93 -0
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/link-dev.js +22 -12
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/add.js +69 -22
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/add.js +13 -1
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/help.txt +6 -3
- package/framework/v0.6.33/lib/cmd/scope/inc/name.js +131 -0
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/link-local.js +22 -12
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/link-production.js +22 -12
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/check.js +41 -7
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/help.txt +5 -0
- package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/scan.js +38 -10
- package/framework/{v0.6.32 → v0.6.33}/lib/collection/src/main.js +34 -10
- package/framework/{v0.6.32 → v0.6.33}/lib/model.js +71 -7
- package/framework/{v0.6.32 → v0.6.33}/lib/routing/src/main.js +42 -4
- package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/main.js +155 -20
- package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/sources.js +62 -22
- package/framework/{v0.6.32 → v0.6.33}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +50 -23
- package/package.json +4 -4
- package/schema/settings.json +7 -0
- package/script/check_no_local_leak.js +18 -10
- package/script/retry_lockfile_sync.js +1 -1
- package/types/globals.d.ts +3 -3
- package/types/gna.d.ts +4 -1
- package/framework/v0.6.32/VERSION +0 -1
- package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -716
- package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/test-results/validator-upload-popin-con-a5268-n-change-fires-RED-pre-fix--chromium/error-context.md +0 -172
- package/test-results/validator-upload-popin-con-cf673--the-page-form-RED-pre-fix--chromium/error-context.md +0 -212
- /package/framework/{v0.6.32 → v0.6.33}/AUTHORS +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/LICENSE +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/html/static.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/couchbase/lib/storage-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/duckdb/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/duckdb/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/param-redact.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/kv-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/settle-once.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/kv-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/content.encoding +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/controller.render-xml.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/inline-script.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/dev/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/locales/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/locales/currency.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/locales/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/mime.types +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/model/entity.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/model/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/model/template/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/router.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/server.express.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/status.codes +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/_gitignore +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/env.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/console.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/context.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/data/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/data/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/json/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/json/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/path.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/prototypes.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/task.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/helpers/text.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/admin/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/build.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/async/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/async/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/audit/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/audit-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/authn/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/authn/src/lockout.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/authn/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/authn/src/totp.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cache/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cache/build.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cache/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/audit/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/audit/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/audit/verify.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/arguments.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/gc.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/help.txt +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/stats.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/storage/verify.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/collection/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/collection/build.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/collection/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/conf-view/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/conf-view/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/config.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cron/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cron/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/domain/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/domain/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/dto/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/duration/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/duration/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/generator/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/i18n/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/idempotency/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/idempotency/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/image-build/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/instrument/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/job/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/job/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/job-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/kv/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/kv/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/kv-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/loading-state/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/loading-state/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/logger/src/redact.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/maintenance/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/maintenance/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/math/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/merge/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/merge/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/message-validator/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/message-validator/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/metrics/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/money/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/money/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/multipart/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/multipart/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/net-locality/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/net-locality/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/priority/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/priority/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/proc.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/push/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/push/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/rate-limit/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/rate-limit/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/routing/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/routing/build.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/routing/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/backends/exec.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/backends/file.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/declaration.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/secrets/src/env-file.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/security-headers-emitter/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/security-headers-emitter/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/session-lifetime/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/session-lifetime/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/session-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/shell.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/sqlite-driver.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/sri/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/sri/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/state.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/local-cas.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/local-stream.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/local.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/meta-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/s3.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage/src/util.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/storage-store.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/url/README.md +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/url/index.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/url/routing.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/uuid/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/validator.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/watcher/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.6.32 → v0.6.33}/lib/ws-session/package.json +0 -0
- /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
|
-
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
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(
|
|
3836
|
+
value = getElementByName(_queryForm, key).value;
|
|
3687
3837
|
}
|
|
3688
|
-
|
|
3689
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
|
|
4436
|
-
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4442
|
-
|
|
4443
|
-
|
|
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
|
-
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
|
|
4467
|
-
|
|
4468
|
-
|
|
4469
|
-
|
|
4470
|
-
|
|
4471
|
-
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
|
|
4477
|
-
|
|
4478
|
-
|
|
4479
|
-
|
|
4480
|
-
|
|
4481
|
-
|
|
4482
|
-
|
|
4483
|
-
|
|
4484
|
-
|
|
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
|
-
|
|
4487
|
-
|
|
4488
|
-
|
|
4489
|
-
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
4493
|
-
//
|
|
4494
|
-
//
|
|
4495
|
-
//
|
|
4496
|
-
|
|
4497
|
-
|
|
4498
|
-
|
|
4499
|
-
|
|
4500
|
-
|
|
4501
|
-
|
|
4502
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6806
|
-
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
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
|
-
|
|
12278
|
-
|
|
12279
|
-
|
|
12280
|
-
|
|
12281
|
-
|
|
12282
|
-
|
|
12283
|
-
// false & true case
|
|
12284
|
-
if ( /(\"false\"|\"true\"|\"on\")/.test(bodyStr) ) {
|
|
12285
|
-
|
|
12286
|
-
}
|
|
12287
|
-
if ( /(\"null\")/i.test(bodyStr) ) {
|
|
12288
|
-
|
|
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
|
-
|
|
12341
|
-
|
|
12342
|
-
|
|
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
|
-
|
|
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
|
|
12705
|
+
var idx = -1
|
|
12706
|
+
, key = null
|
|
12364
12707
|
, value = null
|
|
12365
|
-
,
|
|
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
|
-
|
|
12371
|
-
|
|
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
|
-
|
|
12377
|
-
|
|
12378
|
-
|
|
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
|
-
|
|
12389
|
-
|
|
12390
|
-
|
|
12391
|
-
|
|
12392
|
-
|
|
12393
|
-
|
|
12394
|
-
|
|
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
|
-
|
|
12402
|
-
|
|
12403
|
-
|
|
12404
|
-
|
|
12405
|
-
|
|
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
|
-
|
|
12501
|
-
|
|
12502
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
15465
|
-
|
|
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
|
-
|
|
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
|
|
24117
|
-
|
|
24118
|
-
|
|
24119
|
-
|
|
24120
|
-
|
|
24121
|
-
|
|
24122
|
-
|
|
24123
|
-
|
|
24124
|
-
// default field value
|
|
24125
|
-
let fieldValue =
|
|
24126
|
-
|
|
24127
|
-
|
|
24128
|
-
|
|
24129
|
-
|
|
24130
|
-
|
|
24131
|
-
|
|
24132
|
-
|
|
24133
|
-
|
|
24134
|
-
|
|
24135
|
-
// #
|
|
24136
|
-
//
|
|
24137
|
-
//
|
|
24138
|
-
//
|
|
24139
|
-
|
|
24140
|
-
|
|
24141
|
-
|
|
24142
|
-
|
|
24143
|
-
|
|
24144
|
-
|
|
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: [...]`)
|
|
24223
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
30809
|
-
|
|
30810
|
-
|
|
30811
|
-
|
|
30812
|
-
|
|
30813
|
-
//
|
|
30814
|
-
|
|
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;
|