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