gina 0.6.11-alpha.2 → 0.6.11
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 +10 -0
- package/README.md +22 -18
- package/ROADMAP.md +3 -2
- package/framework/v0.6.11/VERSION +1 -0
- package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/js/gina.js +212 -9
- package/framework/v0.6.11/core/asset/plugin/dist/vendor/gina/js/gina.min.js +648 -0
- package/framework/v0.6.11/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.11/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/model/entity.js +50 -14
- package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/validator/src/main.js +129 -4
- package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/collection/src/main.js +83 -5
- package/framework/{v0.6.11-alpha.2 → v0.6.11}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +15 -11
- package/package.json +3 -3
- package/script/perf/analyze-cpuprofile.js +132 -6
- package/script/perf/profile-baseline.js +184 -46
- package/script/perf/ws-codec-server.js +8 -5
- package/framework/v0.6.11-alpha.2/VERSION +0 -1
- package/framework/v0.6.11-alpha.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -647
- package/framework/v0.6.11-alpha.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.11-alpha.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/AUTHORS +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/LICENSE +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/html/static.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/config.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/couchbase/lib/storage-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/duckdb/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/duckdb/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/param-redact.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/content.encoding +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/dev/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/gna.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/locales/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/locales/currency.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/locales/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/mime.types +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/model/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/model/template/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/router.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/server.express.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/server.isaac.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/server.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/status.codes +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/_gitignore +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/conf/env.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/conf/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/console.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/context.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/data/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/data/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/json/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/json/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/path.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/prototypes.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/task.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/helpers/text.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/admin/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/archiver/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/archiver/build.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/archiver/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/async/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/async/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/audit/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/audit-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/authn/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/authn/src/lockout.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/authn/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/authn/src/totp.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cache/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cache/build.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cache/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/audit/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/audit/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/audit/verify.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/storage/arguments.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/storage/gc.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/storage/help.txt +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/storage/stats.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/storage/verify.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/collection/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/collection/build.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/collection/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/config.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cron/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cron/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/domain/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/domain/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/dto/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/generator/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/i18n/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/image-build/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inherits/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inherits/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/instrument/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/job/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/job/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/job-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/loading-state/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/loading-state/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/maintenance/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/maintenance/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/math/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/merge/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/merge/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/metrics/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/model.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/net-locality/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/net-locality/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/proc.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/push/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/push/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/routing/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/routing/build.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/routing/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/secrets/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/secrets/src/backends/file.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/secrets/src/env-file.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/session-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/shell.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/sqlite-driver.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/state.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/src/local-cas.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/src/local-stream.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/src/local.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/src/meta-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/src/s3.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage/src/util.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/storage-store.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/url/README.md +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/url/index.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/url/routing.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/uuid/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/validator.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/watcher/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.6.11-alpha.2 → v0.6.11}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,16 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
|
|
6
6
|
and is generated by [Changie](https://github.com/miniscruff/changie).
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
## 0.6.11 - 2026-08-19
|
|
10
|
+
### Fixed
|
|
11
|
+
* The Inspector's View tab could show two badges instead of three, dropping the page-weight badge until the Inspector was refreshed, and its Flow tab could be missing the template-compile, execute, response-write and total bars (#B386). Both came from one cause: the dev statusbar hands the page payload to the Inspector before the render delegates append their late-bind patch script above `</body>`, and that patch only mutated the in-memory object. Every channel the Inspector can read therefore kept the emit-time payload for the life of the page, with the page weight left null (it is unknown at emit, since the response body length is not final until the render completes) and the late timeline entries absent. The asymmetry is what made it look intermittent rather than broken: the server-side processing time IS known at emit, so the load badge always rendered while the weight badge silently did not. Both of the Inspector's data channels are now refreshed at the end of that patch, after the values are written: the localStorage fallback mirror, and the per-tab broadcast channel a statusbar-launched Inspector actually binds to. The broadcast channel is keyed from per-tab session storage rather than the shared cross-tab advert, so one tab can never publish onto another tab's channel. The nunjucks delegate additionally now injects its patch through a function replacer rather than a string one, so a timeline entry containing a dollar-sequence can no longer corrupt the emitted script. Development-mode only; no configuration change is required.
|
|
12
|
+
* FormValidator: on Safari, fast typing into a live-checked `autocomplete="off"` text input no longer scrambles the text (gh issue #63). The keydown interception restored the caret only two timer hops after each programmatic value rebuild — and a value assignment parks the caret at the end of the field — so a quick second keystroke read a stale position and characters landed at the end instead of at the caret. Every rebuild now commits the caret synchronously and records the intended position on the element; while a deferred restore is still in flight the interception trusts that recorded position, and the restore re-asserts the latest committed position instead of a stale per-keystroke capture. The transient-readonly autofill suppression is mechanism-unchanged. Browser-bundled: rebuild your bundles to pick it up.
|
|
13
|
+
* FormValidator: three position-0 edge defects in the same Safari `autocomplete="off"` keydown interception now match native field behavior — Backspace at the start of the field deleted the first character (native is a no-op), Delete with a selection starting at position 0 removed one character more than the selection, and ArrowLeft at position 0 teleported the caret to the end of the field (`setSelectionRange(-1)` wraps to the unsigned maximum). Browser-bundled: rebuild your bundles to pick it up.
|
|
14
|
+
* FormValidator: on a form with an async `query` rule and a committed error, a refused submit's answer could render, take focus, and then be hidden again milliseconds later when the click landed while a previous validation round was still settling — the late completion's display refresh read the answered field as "being typed in" (it was the active element) and re-hid the very message the answer had just rendered. The error message and its field focus now stay put: the framework records that the focus was placed by the answer rather than by the user, both display-refresh paths honour that record however late they run, and the first genuine user interaction (typing, clicking, tabbing away) releases it so the deliberate hide-while-typing behaviour is unchanged (#B387). Browser-bundled: rebuild your bundles to pick it up.
|
|
15
|
+
* FormValidator: on a form whose async `query` rule rides a field that is not declared last, the display-only validation pass answering a refused submit click could silently never complete — its result matched no completion route — so the stale not-ready marker on the submit trigger was never re-synced and a fully valid form kept refusing every click until reload. The reveal pass now carries its own completion identity and always completes: the refused click renders the current validation state, the trigger state re-syncs from the fresh result, and the next click on a valid form goes through. Field declaration order no longer decides whether a stale marker can heal (#B348). Browser-bundled: rebuild your bundles to pick it up.
|
|
16
|
+
* `Collection.replace()` no longer silently discards the write when the stored entry carries an internal `_uuid` and the caller's `set` object does not (#B393, gh issue #64). The comparison key was resolved by inspecting the stored entry alone, so in that one combination neither the `id` fallback nor the "no comparison key" refusal applied and the comparison became `<storedUuid> == undefined` — never true. Nothing matched, nothing was replaced, no error was raised, and the call returned a result that looked successful: a silent, lossy write. A stored `_uuid` is present exactly when the caller re-loaded an array a previous chained call had returned, which is why the failure looked intermittent rather than constant. The key is now resolved from BOTH sides — the stored entry and the `set` — falling back to `id` when both carry one, and the call now refuses loudly when the two sides share no usable key at all, so the one unmatchable combination is no longer the only one that stays quiet. An explicitly named comparison key is still honoured exactly as given, and the resolved key is scoped per entry rather than shared, so a fallback taken for one entry can no longer apply to the entries examined after it. Every previously-working call is unaffected. Browser-bundled: rebuild your bundles to pick it up.
|
|
17
|
+
* Concurrent `util.promisify(entity.method)` calls on the same entity method no longer cross-deliver results or leave a caller hanging (#B394). The promisify fast-path kept a single scalar callback slot: a second in-flight call overwrote the first, so the first result to arrive was delivered to the last caller to register (one caller receiving another's record), and the displaced caller's promise never settled at all — a request left hanging with nothing logged, and a read-modify-write variant that could persist one key's document under another. The entity-context path already used a FIFO queue with a single persistent dispatch listener; the fast-path now uses the same shape, so every concurrent caller settles and, when the underlying operations complete in the order they were called, each caller receives its own result. When operations can complete out of call order, results are still paired by arrival order — give such a method true per-call identity by returning a Promise instead of emitting its trigger (see the Models guide's concurrency note). Server-side only; pick it up with a bundle restart.
|
|
18
|
+
|
|
9
19
|
## 0.6.10 - 2026-08-16
|
|
10
20
|
|
|
11
21
|
### Added
|
package/README.md
CHANGED
|
@@ -61,28 +61,32 @@ open https://localhost:3100
|
|
|
61
61
|
|
|
62
62
|
> **npm 12+** blocks install scripts by default, and gina's post-install bootstraps `~/.gina` and the framework dependencies. Install with `npm install -g gina@latest --allow-scripts=gina`, or allow it once for all global installs with `npm config set allow-scripts=gina --location=user`. (Not needed on npm ≤ 11.)
|
|
63
63
|
|
|
64
|
-
## What's in 0.6.
|
|
64
|
+
## What's in 0.6.11
|
|
65
65
|
|
|
66
|
-
> **Restart your bundles
|
|
67
|
-
> `
|
|
68
|
-
>
|
|
66
|
+
> **Restart your bundles AND rebuild them.** The browser bundle changed in this
|
|
67
|
+
> release (`Collection.replace()` and the four FormValidator fixes are bundled),
|
|
68
|
+
> so a restart alone keeps serving the old client code — run `gina bundle:build`
|
|
69
|
+
> for each bundle as well as `gina bundle:restart`.
|
|
69
70
|
|
|
70
|
-
> **No settings reset.** `0.6.
|
|
71
|
+
> **No settings reset.** `0.6.11` is a patch — the `shortVersion` stays `0.6`, so
|
|
71
72
|
> your `~/.gina/0.6/settings.json` is untouched. (`0.6.0` was the reset.)
|
|
72
73
|
|
|
73
|
-
**This
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- **
|
|
84
|
-
- **Fixed —
|
|
85
|
-
- **
|
|
74
|
+
**This is a fixes-only release: seven fixes, two of them reported through GitHub
|
|
75
|
+
issues (#63, #64).** It closes a silent lossy write in `Collection.replace()`, a
|
|
76
|
+
cross-delivery / hang defect for concurrent `util.promisify(entity.method)`
|
|
77
|
+
calls, four FormValidator defects (Safari caret scrambling plus three caret edge
|
|
78
|
+
cases, and two submit-time display races on async-`query` forms), and a
|
|
79
|
+
development-mode Inspector data-channel staleness. **One behaviour change to
|
|
80
|
+
check before you upgrade** — `Collection.replace()` now throws where it
|
|
81
|
+
previously failed silently, when neither side of the comparison carries a usable
|
|
82
|
+
key. Details are in the [migration guide](https://gina.io/docs/migration).
|
|
83
|
+
|
|
84
|
+
- **Fixed — `Collection.replace()` no longer silently discards the write (#B393, issue #64).** When the stored entry carried an internal `_uuid` and the caller's `set` object did not, the comparison key was resolved from the stored entry alone, so the comparison became `<storedUuid> == undefined` — never true: nothing matched, nothing was replaced, no error was raised, and the call returned a result that looked successful. A stored `_uuid` is present exactly when you re-load an array a previous chained call returned, which is why the failure looked intermittent. The key is now resolved from **both** sides — the stored entry and the `set` — falling back to `id` when both carry one, and the call now **throws `No comparison key defined !`** when the two sides share no usable key, so the one unmatchable combination is no longer the only one that stays quiet. An explicitly supplied key argument is honoured exactly as before, and the resolved key is scoped per entry, so a fallback taken for one entry can no longer apply to the entries examined after it. Every previously-working call is unaffected. Browser-bundled.
|
|
85
|
+
- **Fixed — concurrent `util.promisify(entity.method)` calls no longer cross-deliver results or leave a caller hanging (#B394).** The promisify fast-path kept a single scalar callback slot: a second in-flight call on the same method overwrote the first, so the first result to arrive was delivered to the last caller to register (one caller receiving another's record), and the displaced caller's promise never settled — a request left hanging with nothing logged, and a read-modify-write variant that could persist one key's document under another. The fast-path now uses the same FIFO queue and single persistent dispatcher as the entity-context path: every concurrent caller settles, and when the underlying operations complete in the order they were called, each caller receives its own result. When operations can complete out of call order, results are still paired by arrival order — give such a method true per-call identity by returning a Promise instead of emitting its trigger (see the [Models guide](https://gina.io/docs/guides/models)). Server-side.
|
|
86
|
+
- **Fixed — FormValidator: fast typing into a Safari `autocomplete="off"` field no longer scrambles the text (#B389, issue #63), plus three position-0 edge cases in the same interception (#B390, #B391, #B392).** The keydown interception restored the caret two timer hops after each programmatic value rebuild — and a value assignment parks the caret at the end of the field — so a quick second keystroke read a stale position and characters landed at the end instead of at the caret. Every rebuild now commits the caret synchronously and records the intended position; while a deferred restore is in flight the interception trusts that record, and the restore re-asserts the latest committed position instead of a stale capture. In the same switch, Backspace at position 0 no longer deletes the first character (native is a no-op), Delete with a selection starting at position 0 no longer removes one character more than the selection, and ArrowLeft at position 0 no longer teleports the caret to the end of the field. Browser-bundled.
|
|
87
|
+
- **Fixed — FormValidator: a refused submit's answer stays visible and focused on async-`query` forms (#B387).** On a form with an async `query` rule and a committed error, a refused submit's answer could render, take focus, and then be hidden again milliseconds later when the click landed while a previous validation round was still settling — the late completion's display refresh read the answered field as "being typed in" (it was the active element, because the answer had just focused it) and re-hid the very message the answer had rendered. The framework now records that the focus was placed by the answer rather than by the user, both display-refresh paths honour that record however late they run, and the first genuine user interaction (typing, clicking, tabbing away) releases it — so the deliberate hide-while-typing behaviour is unchanged. Browser-bundled.
|
|
88
|
+
- **Fixed — FormValidator: a stale not-ready submit marker can no longer refuse every click until reload (#B348).** On a form whose async `query` rule rides a field that is not declared last, the display-only validation pass answering a refused submit click could silently never complete — its result matched no completion route — so the stale not-ready marker on the submit trigger was never re-synced and a fully valid form kept refusing every click. That pass now carries its own completion identity and always completes: the refused click renders the current validation state, the trigger state re-syncs from the fresh result, and the next click on a valid form goes through. Field declaration order no longer decides whether a stale marker can heal. Browser-bundled.
|
|
89
|
+
- **Fixed — Inspector (development mode): the View tab's page-weight badge and the Flow tab's late timeline bars no longer go missing until the Inspector is refreshed (#B386).** The dev statusbar hands the page payload to the Inspector before the render delegates append their late-bind patch script above `</body>`, and that patch only mutated the in-memory object — so every channel the Inspector can read kept the emit-time payload for the life of the page, with the page weight left null (it is unknown at emit) and the template-compile, execute, response-write and total bars absent. Both of the Inspector's data channels — the localStorage fallback mirror and the per-tab broadcast channel a statusbar-launched Inspector actually binds to — are now refreshed at the end of that patch, after the values are written; the broadcast channel is keyed from per-tab session storage rather than the shared cross-tab advert, so one tab can never publish onto another tab's channel. The nunjucks delegate additionally injects its patch through a function replacer rather than a string one, so a timeline entry containing a dollar sequence can no longer corrupt the emitted script. Server-side; development mode only; no configuration change is required.
|
|
86
90
|
|
|
87
91
|
## Documentation
|
|
88
92
|
|
package/ROADMAP.md
CHANGED
|
@@ -60,8 +60,9 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
60
60
|
| **Q4 2026** | `0.6.6` ✅ | **Fixed**: the logging-transport release. A slow boot no longer silences a bundle's logging for the life of the process — a two-second connect deadline added in `0.6.5` read a socket flag Node clears one event-loop phase later, so any boot that blocked the loop past it destroyed a connection the kernel had already established (every container start and network-filesystem mount was exposed, and the transport never redialled). The MQ and file log transports also stopped dialling `host_v4`, which on a `~/.gina` shared across hosts silently shipped every log line off-host while all connection lines read healthy. Plus: the popin `success` event fires again instead of raising a 422 carrying the successful response body; a link request belongs to the anchor you clicked rather than the first anchor sharing its url; and constructing the link handler twice no longer corrupts the first instance · **Added**: the log transport reconnects — exponential backoff to a 30-second ceiling, one report per outage, frames dropped rather than queued while down so an outage cannot grow memory |
|
|
61
61
|
| **Q4 2026** | `0.6.7` ✅ | **Added**: the object-storage release — a `storage` block declares named drivers (an adapter crossed with a strategy) reachable as `gina.storage()`, publishing objects atomically under opaque keys with their metadata written through a pluggable store seam; a content-addressed `cas` strategy deduplicates identical bytes behind a reference count, reclaiming them only after a grace-gated sweep; size tiering keeps sub-`64KB` objects inline in the metadata store, measurably faster than per-file writes; `storage:stats` / `storage:gc` / `storage:verify` operate a bundle's drivers whether it is running or stopped, through always-on admin-gated endpoints; and an upload group can route its `self.store()` step straight into a driver · **Security**: bound query parameter values no longer reach dev consoles or the Inspector query log — count and type markers replace them, with `inspector.queries.captureValues` to opt back in · **Fixed**: the `is` rule compiles regex literals as authored instead of stripping their parentheses (stricter — review patterns containing parens), forms with an async `query` rule complete correctly across a cluster of interacting defects (a submit leaving before the verdict landed, a completion carrying only the query field's slice, a re-click clearing later fields' errors, a clean form whose query field was not declared last never submitting at all, replayed submits from stale listeners, and an id-less trigger bound twice), `getConfig().settings` resolves path placeholders, `req.files[].group` reports the resolved group instead of `undefined`, and the Inspector's Data and Forms tabs stop putting framework-internal keys and the bundle catalog above your own data · **Changed**: framework default looks ship inside a `@layer gina` cascade layer, so any un-layered project rule overrides them without `!important` |
|
|
62
62
|
| **Q4 2026** | `0.6.8` ✅ | **Security**: `self.push()` decides its recipient server-side instead of reading it from the request, where a supplied session id aimed the push at any session and an absent one broadcast to every connected client (ACTION REQUIRED — a bare worker push over an HTTP hop that carried the recipient IN THE REQUEST stops delivering; where the hop is authenticated the controller can pass `{ sessionID }` explicitly and keep working, and a worker with no request context at all polls `GET /_gina/jobs/:id`) · forwarded headers (`X-Forwarded-Host`, `-Proto`, `-Prefix` and the request's own `Host`) are validated where they are read, closing a reflected-XSS path that spliced them unescaped into the client bootstrap script emitted on every rendered page · **Added**: storage metadata can live on Couchbase, which is what makes a driver root shareable across bundles and replicas; a `stream` strategy for large sequential media brings resumable, out-of-order, restart-surviving uploads whose finalise verifies coverage as an interval union and refuses to publish a gap; HTTP Range serving through `self.serveFromStorage()` on both engines, with conditional GET and a fail-closed content-type downgrade; the `s3` adapter completes the pluggable object-storage layer, storeless by design and able to offload GET/HEAD to a presigned URL; `getRange()` on every local strategy; machine-readable `err.code` on storage read verbs; and the Couchbase soak probes ship in the package · **Changed**: `renderStream()` is byte-serving-capable — `Buffer` chunks pass through verbatim on non-SSE content types (binary payloads previously arrived corrupted), HEAD answers headers-only without consuming the iterable, and caller-set headers are no longer clobbered · **Fixed**: `renderStream()` honours a caller-set status on both engines and stops throwing a swallowed error at the end of every streamed response, a redirect treats `HEAD` as the safe method it is and keeps the caller's query string under `keep-params: true`, and a local storage driver reclaims the temp files left behind by a crashed or refused `put()` |
|
|
63
|
-
| **Q4 2026** | `0.6.10` ✅ | **Added**: maintenance mode — a bundle can be closed to the public without being stopped. When it is active every request except the framework's own built-in endpoints is answered `503` with a `Retry-After` header and a self-contained maintenance page, and the response is marked never to be stored so a cached copy cannot outlive the window. The gate runs on both engines ahead of static assets, the output cache and routing, so it also covers files and URLs that a route middleware never sees. The liveness endpoint deliberately keeps answering normally, so an orchestrator does not restart healthy instances over a declared window. Chosen visitors can still browse: a shared bypass key presented as a header or once in the address bar (which then sets a short-lived cookie and redirects without the secret) works under any deployment, while the supplementary IP allowlist applies only to requests that did not arrive through a reverse proxy — behind one, every address is the proxy's, so an unconditioned list would let either everybody or nobody through. Maintenance can be flipped at runtime through an administrator-gated endpoint with an optional expiry; a runtime flip is not persisted, and an expiry reverts to the configured state rather than to off, so a forgotten timer cannot re-open a site that configuration says is closed. **Fixed**: boot-time bundle mounts are idempotent, atomic and concurrency-safe — a mount symlink that already resolves to its source is left untouched (so the steady-state boot writes nothing), a wrong or missing one is published atomically through a temp sibling and a rename, and a process that loses the race to another publishing the identical link treats that as success instead of refusing to boot. Previously every boot re-created every declared bundle's link in two non-atomic steps with no mutual exclusion, so several processes sharing one project tree raced the same directory entries and a contended link could fail a boot or abort the shared configuration load for every bundle in the project. The same race is closed on the directory creation that accompanies a mount. Behaviour change: a real directory occupying a mount path is now refused by name instead of silently deleted. **Security**: cross-origin writes to the administrator-gated built-in endpoints are refused. Those endpoints authorise callers by network address alone — a credential a browser attaches automatically — so an operator browsing from an allowed machine could be lured to a page that silently issued writes to them; and because several of them read their whole input from the address rather than from a request body, the attack needed no scripting and no cross-origin negotiation at all. Such a write is now refused on both engines, using the browser's own request-context signal where it is sent, and otherwise comparing the stated origin against the address the client actually connected to — never against a forwarded header, which an attacker controls. Clients that send no browser origin signal, such as command-line tooling and deployment scripts, are deliberately unaffected, as are safe methods, so existing cross-origin read channels keep working. | `0.6.10` | 2026-08-16 |
|
|
64
63
|
| **Q4 2026** | `0.6.9` ✅ | **Security**: an engine.io socket's session identity is derived server-side from the upgrade request's own cookie instead of a field the browser asserts on every message — any client could previously claim another user's session and receive the pushes addressed to it, which took strictly less than stealing the cookie, since a rendered page carries the bare session id while the cookie carries the signed form; the binding replays the bundle's own session middleware (same secret, store and cookie name, no new configuration) and fails closed, so an id-less socket receives only deliberate broadcasts · **Added**: `gina.pushToSession()` gives code with no request context — a job handler, a cron tick, a boot hook — a sanctioned route to a user's socket, with a required recipient, no reachable broadcast, and delivery reported rather than assumed; and a bundle can declare which scopes it is deployed in through a `scopes` allow-list on its manifest entry, so one still under development stays out of every other scope · **Fixed**: `engine: "express"` bundles boot and serve on Express 5, with the supported range declared for the first time (`>= 4 < 6`, both majors verified live) · `project:add`/`project:import` no longer empty a project's `bundles` block on a declared-count mismatch, no longer adopt a bundle's invalid `server.protocol`/`server.scheme` into the project's registry lists, and no longer resolve one project's bundles against another project's path · `project:add` writes the `.gitignore` the shipped template's underscore prefix has always implied · the path helper's copier stages to a temp sibling and publishes with an atomic rename, so a failed copy can no longer destroy the destination it was replacing · the secrets resolver reads its two environment tiers independently, so a swept boolean no longer lets a plaintext file shadow `process.env`, and three malformed `settings.secrets.file` shapes that used to pass in silence are caught (ACTION REQUIRED — two of them now refuse to boot) · a bundle whose release tree cannot be linked refuses by name instead of dying as an opaque TypeError · `self.push()` refuses by name when the server instance has no engine.io channel |
|
|
64
|
+
| **Q4 2026** | `0.6.10` ✅ | **Added**: maintenance mode — a bundle can be closed to the public without being stopped. When it is active every request except the framework's own built-in endpoints is answered `503` with a `Retry-After` header and a self-contained maintenance page, and the response is marked never to be stored so a cached copy cannot outlive the window. The gate runs on both engines ahead of static assets, the output cache and routing, so it also covers files and URLs that a route middleware never sees. The liveness endpoint deliberately keeps answering normally, so an orchestrator does not restart healthy instances over a declared window. Chosen visitors can still browse: a shared bypass key presented as a header or once in the address bar (which then sets a short-lived cookie and redirects without the secret) works under any deployment, while the supplementary IP allowlist applies only to requests that did not arrive through a reverse proxy — behind one, every address is the proxy's, so an unconditioned list would let either everybody or nobody through. Maintenance can be flipped at runtime through an administrator-gated endpoint with an optional expiry; a runtime flip is not persisted, and an expiry reverts to the configured state rather than to off, so a forgotten timer cannot re-open a site that configuration says is closed. **Fixed**: boot-time bundle mounts are idempotent, atomic and concurrency-safe — a mount symlink that already resolves to its source is left untouched (so the steady-state boot writes nothing), a wrong or missing one is published atomically through a temp sibling and a rename, and a process that loses the race to another publishing the identical link treats that as success instead of refusing to boot. Previously every boot re-created every declared bundle's link in two non-atomic steps with no mutual exclusion, so several processes sharing one project tree raced the same directory entries and a contended link could fail a boot or abort the shared configuration load for every bundle in the project. The same race is closed on the directory creation that accompanies a mount. Behaviour change: a real directory occupying a mount path is now refused by name instead of silently deleted. **Security**: cross-origin writes to the administrator-gated built-in endpoints are refused. Those endpoints authorise callers by network address alone — a credential a browser attaches automatically — so an operator browsing from an allowed machine could be lured to a page that silently issued writes to them; and because several of them read their whole input from the address rather than from a request body, the attack needed no scripting and no cross-origin negotiation at all. Such a write is now refused on both engines, using the browser's own request-context signal where it is sent, and otherwise comparing the stated origin against the address the client actually connected to — never against a forwarded header, which an attacker controls. Clients that send no browser origin signal, such as command-line tooling and deployment scripts, are deliberately unaffected, as are safe methods, so existing cross-origin read channels keep working. | `0.6.10` | 2026-08-16 |
|
|
65
|
+
| **Q4 2026** | `0.6.11` ✅ | **Fixed**: `Collection.replace()` no longer silently discards the write when the stored entry carries an internal `_uuid` and the caller's `set` does not — the comparison key is now resolved from both sides (falling back to `id` when both carry one) and the call throws instead of returning quietly when the two sides share no usable key; an explicitly supplied key is honoured exactly as before (issue #64). Concurrent `util.promisify(entity.method)` calls on the same method no longer cross-deliver results or leave a caller hanging — the promisify fast-path now uses the same FIFO queue and single persistent dispatcher as the entity-context path, so every caller settles and in-order completion gives each its own result; out-of-order completion still pairs by arrival order, for which the per-call-identity path is a Promise-returning method. FormValidator: fast typing into a Safari `autocomplete="off"` field no longer scrambles the text (the caret is committed synchronously on every rebuild and the deferred restore re-asserts the latest committed position; issue #63), with three position-0 edge cases in the same interception corrected to native behaviour (Backspace, Delete with a selection, ArrowLeft); a refused submit's answer on an async-`query` form stays visible and focused instead of being re-hidden by a late completion (answer-placed focus is told from user-placed focus until the first genuine interaction); and a stale not-ready submit marker can no longer refuse every click until reload on a form whose async `query` field is not declared last (the reveal pass now carries its own completion identity and always completes). Inspector (development mode): the View tab's page-weight badge and the Flow tab's late timeline bars no longer go missing until a refresh — both data channels are refreshed at the end of the late-bind patch, keyed per tab. Pickup: restart **and** rebuild your bundles (the browser bundle changed). |
|
|
65
66
|
| **Q1 2027** | `0.6.x` | HTTP/2 priorities (blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
|
|
66
67
|
| **2027** | `0.7.0` | Performance — remaining measure-gated candidates: multipart & WebSocket fast paths, render/log cleanups, SIMD scanner (the render-path deep-clone & id-mint reduction shipped early in `0.6.2` with a measured 4.4× render-throughput gain; the profiling baseline itself also shipped in `0.6.2`) |
|
|
67
68
|
| **2027** | `0.8.0` | Financial-messaging foundations — XML request/response handling · pluggable message-schema validation · IBAN/BIC validation rules · money & ISO 4217 minor-unit utilities · idempotency keys · sequence primitive · OAuth2 client-credentials egress |
|
|
@@ -442,7 +443,7 @@ A cold audit of the Couchbase connector identified two critical security vulnera
|
|
|
442
443
|
| ✅ | **V8 pointer compression support** | `0.2.0` | Q2 2026 | Node.js built with `--experimental-enable-pointer-compression` (e.g. [node-caged](https://github.com/platformatic/node-caged) or a custom build) delivers ~50% heap memory reduction across all pointer-heavy structures. Gina is pure JS — compatible out of the box. Adds: startup detection + `GINA_V8_POINTER_COMPRESSED` env var, Dockerfile guide with custom build recipe (full-icu + pointer compression), 4 GB ceiling documentation, N-API-only connector policy. |
|
|
443
444
|
| ✅ | **Runtime CPU profiling baseline** | `0.6.2` | 2026-07-31 | Shipped — a three-arm baseline (HTTP/2 render, concurrent multipart upload, WebSocket echo) profiled a production-built bundle under load. Outcome: the multipart-scan, WebSocket-unmask, and render/log-cleanup candidates below all measured small under their own arms and moved to measure-gated deferral, while the dominant cost found is per-request deep-clone traffic — half of render-arm CPU — plus per-item random-id minting (~1 ms per render), now planned as its own row below. "No further acceleration needed" was an accepted verdict shape, and for the byte-loop candidates it is the verdict. |
|
|
444
445
|
| ⏸ | **Multipart boundary-scan fast path** | — | on demand | **Deferred — acquitted by the profiling baseline (2026-07):** the boundary scan measured 7.2% of upload-arm CPU (0.73 ms per MB, ~47 µs per 64 KB chunk) with the event loop far from saturated — the loop-relief win does not materialize at these magnitudes. Re-armed by a profiled workload where the scan is a leading loop consumer. Original scope, unchanged when re-armed: the multipart parser's boundary search is the one unbounded byte-by-byte JS loop on a request path; delegating the in-chunk needle search to the runtime's native `Buffer.indexOf` (JS keeps only the chunk-boundary carry) relieves the event loop under large concurrent uploads; wire and event contract unchanged; validated by differential tests against the current matcher. |
|
|
445
|
-
| ⏸ | **WebSocket unmask fast path** | — | on demand | **Deferred — acquitted by the profiling baseline (2026-07):** the built-in codec measured 8% of an echo arm deliberately isolated to maximize its visibility (~3.4 µs per 4 KB frame)
|
|
446
|
+
| ⏸ | **WebSocket unmask fast path** | — | on demand | **Deferred — acquitted by the profiling baseline (2026-07), re-verified in-bundle (2026-08):** the built-in codec measured 8% of an echo arm deliberately isolated to maximize its visibility (~3.4 µs per 4 KB frame), and the same echo load driven through a real bundle's declarative WebSocket route confirmed the acquittal — ~10% of an idle-dominated in-bundle profile (~22% of non-idle CPU, ~3.2 µs per 4 KB frame), outranked two-to-one by the runtime's own native buffer/UTF-8 internals, with all other framework work under 2% combined. Re-armed by a WebSocket-heavy or binary-streaming profile showing the codec as a leading consumer. Original scope, unchanged when re-armed: every inbound client frame must be unmasked, and that XOR currently runs byte-by-byte in JS; word-at-a-time unmasking in the built-in RFC 6455 codec, with the `ws` engine path picking up `bufferutil` acceleration where it is installed — optional only; the pure-JS behaviour remains the permanent fallback. |
|
|
446
447
|
| ⏸ | **Render & logging hot-path cleanups** | — | on demand | **Deferred — acquitted by the profiling baseline (2026-07):** the asset-scan, logger-regex, and render-splice candidates each measured at or under about 1% of render CPU under the arm built for them (the broken asset-scan memo guard remains real, but as a correctness fix that can ride any future work on that surface). Re-armed if any of them turns leading in a future profile. Original scope, unchanged when re-armed: repair the per-render asset-scan memoization (the cache guard can never hit as written, so the full document is re-scanned every HTTP/2 render), precompile the logger's per-line token regexes, and consolidate whole-document render passes where a profile convicts them. |
|
|
447
448
|
| ⏸ | **SIMD boundary scanner (Rust → WebAssembly)** | — | on demand | **Deferred — measure-gated, doubly dormant since the 2026-07 baseline.** Built only if a profile still convicts the multipart scan after the JS fast path lands — and the JS fast path is itself deferred-acquitted, so this trigger cannot fire today. WebAssembly first: sandboxed, a single artifact for every platform including Bun, no process crash surface. Native N-API prebuilds — published as separate per-platform packages so the framework tarball never carries a compiled binary — only if WASM leaves measured headroom. No install scripts ever; the JS implementation remains the permanent fallback. *Interim:* the JS fast path above. |
|
|
448
449
|
| ✅ | **Render-path deep-clone & id-mint reduction** | `0.6.2` | 2026-08-01 | **Convicted by the profiling baseline, shipped ahead of schedule:** half of render-arm CPU was per-request deep-clone traffic, concentrated in three framework call sites (the template-filter configuration was re-cloned on every render; the render delegate cloned its envelope; the options collection deep-cloned its content and minted a random id per collected item — about 1 ms per render of entropy alone), with GC time consistent with the clone garbage. Shipped JS-side only: the filter configuration is now passed and stashed by reference (its write surface was measured empty before the change), the per-request locale lookups are memoized with the per-request copy materialized lazily on first read, and the id generator right-sizes its entropy batch to the requested length. Measured on the profiling harness with fresh runs on both sides: **4.4× render throughput** on the baseline workload (10.7 → 2.4 ms per render), deep-clone share 50.31% → 1.81%, GC down ~18×, and entropy out of the top profile frames on both arms. The remaining clone sites on this surface stay measure-gated for a future profile. Porting the object-graph work to native code remains an anti-candidate. |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.6.11
|
|
@@ -11841,6 +11841,69 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
11841
11841
|
*/
|
|
11842
11842
|
var isAnswerFocusInProgress = false;
|
|
11843
11843
|
|
|
11844
|
+
/**
|
|
11845
|
+
* #B387 — the asynchronous continuation of the #B319 exemption above.
|
|
11846
|
+
*
|
|
11847
|
+
* The answer's own focus move makes the answered field the active element,
|
|
11848
|
+
* and BOTH display refreshers read "active element" as "the user is editing
|
|
11849
|
+
* this field" and soften/hide the committed message:
|
|
11850
|
+
* - `refreshWarning`'s error->warning downgrade appends `hidden`;
|
|
11851
|
+
* - `handleErrorsDisplay`'s refresh branch re-creates the message born-hidden.
|
|
11852
|
+
* The one-shot flag above only covers the SYNCHRONOUS focusin dispatched
|
|
11853
|
+
* inside `.focus()`; a validation completion firing LATER in the same
|
|
11854
|
+
* cascade (a live-check waiter woken by the reveal pass's deferred release,
|
|
11855
|
+
* or the trailing silent global re-validation) runs after the `finally`
|
|
11856
|
+
* cleared it — and re-hid the very message the answer had just rendered.
|
|
11857
|
+
*
|
|
11858
|
+
* This slot records WHICH field currently holds an answer-placed focus, so
|
|
11859
|
+
* the two hide sites can tell answer-placed focus from user-placed focus,
|
|
11860
|
+
* for ANY caller, however late. A single slot is exact: only one active
|
|
11861
|
+
* element exists. Released on the first genuine user interaction (any
|
|
11862
|
+
* trusted native event reaching a form proxy while the one-shot flag is
|
|
11863
|
+
* down), so the deliberate mid-typing suppression re-engages the moment
|
|
11864
|
+
* the user actually edits.
|
|
11865
|
+
*
|
|
11866
|
+
* @private
|
|
11867
|
+
* @type {object|null} `{ formId, elName }` while an answer-placed focus is live, else `null`
|
|
11868
|
+
*/
|
|
11869
|
+
var answerFocusHold = null;
|
|
11870
|
+
|
|
11871
|
+
/**
|
|
11872
|
+
* #B387 — does `answerFocusHold` name this exact field?
|
|
11873
|
+
*
|
|
11874
|
+
* @private
|
|
11875
|
+
* @param {string} formId - owning form id
|
|
11876
|
+
* @param {string} elName - field name
|
|
11877
|
+
* @returns {boolean} true while the answer-placed focus is live on this field
|
|
11878
|
+
*/
|
|
11879
|
+
var isAnswerFocusHeldFor = function(formId, elName) {
|
|
11880
|
+
return ( answerFocusHold
|
|
11881
|
+
&& answerFocusHold.formId === formId
|
|
11882
|
+
&& answerFocusHold.elName === elName ) ? true : false;
|
|
11883
|
+
};
|
|
11884
|
+
|
|
11885
|
+
/**
|
|
11886
|
+
* #B387 — release the hold on the first genuine user interaction.
|
|
11887
|
+
*
|
|
11888
|
+
* Trusted-only: framework-internal `triggerEvent` dispatches are untrusted
|
|
11889
|
+
* CustomEvents and must not release it. The `isAnswerFocusInProgress`
|
|
11890
|
+
* guard keeps the answer's OWN synchronous focusin (trusted — the UA
|
|
11891
|
+
* generates it inside `.focus()`) from releasing the hold it is part of
|
|
11892
|
+
* delivering.
|
|
11893
|
+
*
|
|
11894
|
+
* @private
|
|
11895
|
+
* @param {object} event - the native event reaching a form proxy handler
|
|
11896
|
+
* @returns {void}
|
|
11897
|
+
*/
|
|
11898
|
+
var releaseAnswerFocusHold = function(event) {
|
|
11899
|
+
if ( !answerFocusHold ) {
|
|
11900
|
+
return;
|
|
11901
|
+
}
|
|
11902
|
+
if ( event && event.isTrusted && !isAnswerFocusInProgress ) {
|
|
11903
|
+
answerFocusHold = null;
|
|
11904
|
+
}
|
|
11905
|
+
};
|
|
11906
|
+
|
|
11844
11907
|
var refreshWarning = function($el) {
|
|
11845
11908
|
var formId = $el.form.id || $el.form.getAttribute('id');
|
|
11846
11909
|
var elName = $el.name || $el.form.getAttribute('name');
|
|
@@ -11857,7 +11920,19 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
11857
11920
|
if ( /form\-item\-warning/.test($parent.className) && currentElName != elName ) {
|
|
11858
11921
|
$parent.className = $parent.className.replace(/form\-item\-warning/, 'form-item-error');
|
|
11859
11922
|
|
|
11860
|
-
}
|
|
11923
|
+
}
|
|
11924
|
+
// #B387 — `currentElName == elName` reads "the user is editing this
|
|
11925
|
+
// field", but the ANSWER's own focus move (#B319) also makes the field
|
|
11926
|
+
// the active element — and unlike the synchronous focusin, the async
|
|
11927
|
+
// completion callers arrive after the one-shot flag is already down.
|
|
11928
|
+
// While the answer-focus hold names this field the focus is
|
|
11929
|
+
// answer-placed, not user-placed: keep the message the answer just
|
|
11930
|
+
// rendered.
|
|
11931
|
+
// was: else if (/form\-item\-error/.test($parent.className) && currentElName == elName ) {
|
|
11932
|
+
else if (
|
|
11933
|
+
/form\-item\-error/.test($parent.className) && currentElName == elName
|
|
11934
|
+
&& !isAnswerFocusHeldFor(formId, elName)
|
|
11935
|
+
) {
|
|
11861
11936
|
$parent.className = $parent.className.replace(/form\-item\-error/, 'form-item-warning');
|
|
11862
11937
|
isErrorMessageHidden = true;
|
|
11863
11938
|
}
|
|
@@ -12477,7 +12552,11 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
12477
12552
|
// blur. This "refresh" re-create runs AFTER refreshWarning in the live-check
|
|
12478
12553
|
// global pass, so without this focus guard it re-shows the message mid-typing.
|
|
12479
12554
|
// On blur (field no longer active) the message is created shown (focusout commits).
|
|
12480
|
-
|
|
12555
|
+
// #B387 — same provenance refinement as refreshWarning's downgrade:
|
|
12556
|
+
// an answer-placed focus (#B319) must not read as "being typed in",
|
|
12557
|
+
// or this re-create clips the very message the answer delivered.
|
|
12558
|
+
// was: ( document.activeElement && document.activeElement.name == name ) ?
|
|
12559
|
+
$err.setAttribute('class', ( document.activeElement && document.activeElement.name == name && !isAnswerFocusHeldFor(id, name) ) ? 'form-item-error-message hidden' : 'form-item-error-message');
|
|
12481
12560
|
// #A11Y5 — the branch below re-asserts aria-invalid="true" on this same
|
|
12482
12561
|
// field, so when the message is hidden it must stay resolvable: clip it
|
|
12483
12562
|
// out of view rather than out of the accessibility tree. Reads the class
|
|
@@ -18971,6 +19050,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
18971
19050
|
// are guarded fallbacks that no-op on a control).
|
|
18972
19051
|
var resetProxyHandler = function(event) {
|
|
18973
19052
|
var $el = event.target;
|
|
19053
|
+
releaseAnswerFocusHold(event); // #B387
|
|
18974
19054
|
if (
|
|
18975
19055
|
typeof(event.defaultPrevented) != 'undefined'
|
|
18976
19056
|
&& event.defaultPrevented
|
|
@@ -18989,6 +19069,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
18989
19069
|
};
|
|
18990
19070
|
var keydownProxyHandler = function(event) {
|
|
18991
19071
|
var $el = event.target;
|
|
19072
|
+
releaseAnswerFocusHold(event); // #B387
|
|
18992
19073
|
if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
|
|
18993
19074
|
return false;
|
|
18994
19075
|
|
|
@@ -19007,6 +19088,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
19007
19088
|
};
|
|
19008
19089
|
var keyupProxyHandler = function(event) {
|
|
19009
19090
|
var $el = event.target;
|
|
19091
|
+
releaseAnswerFocusHold(event); // #B387
|
|
19010
19092
|
if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
|
|
19011
19093
|
return false;
|
|
19012
19094
|
|
|
@@ -19026,6 +19108,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
19026
19108
|
};
|
|
19027
19109
|
var focusinProxyHandler = function(event) {
|
|
19028
19110
|
var $el = event.target;
|
|
19111
|
+
releaseAnswerFocusHold(event); // #B387
|
|
19029
19112
|
if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
|
|
19030
19113
|
return false;
|
|
19031
19114
|
|
|
@@ -19060,6 +19143,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
19060
19143
|
};
|
|
19061
19144
|
var focusoutProxyHandler = function(event) {
|
|
19062
19145
|
var $el = event.target;
|
|
19146
|
+
releaseAnswerFocusHold(event); // #B387
|
|
19063
19147
|
if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
|
|
19064
19148
|
return false;
|
|
19065
19149
|
|
|
@@ -19077,6 +19161,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
19077
19161
|
};
|
|
19078
19162
|
var changeProxyHandler = function(event) {
|
|
19079
19163
|
var $el = event.target;
|
|
19164
|
+
releaseAnswerFocusHold(event); // #B387
|
|
19080
19165
|
if ( typeof(event.defaultPrevented) != 'undefined' && event.defaultPrevented )
|
|
19081
19166
|
return false;
|
|
19082
19167
|
|
|
@@ -19093,6 +19178,7 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
19093
19178
|
};
|
|
19094
19179
|
var clickProxyHandler = function(event) {
|
|
19095
19180
|
var $el = event.target;
|
|
19181
|
+
releaseAnswerFocusHold(event); // #B387
|
|
19096
19182
|
|
|
19097
19183
|
// a click target removed from the DOM during its own dispatch
|
|
19098
19184
|
// (e.g. an upload preview's reset/delete link) has no parent by
|
|
@@ -19464,6 +19550,8 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
19464
19550
|
// no-op on an unfocusable host that still passes the
|
|
19465
19551
|
// typeof-function gate above.
|
|
19466
19552
|
if ( typeof(document) === 'undefined' || !document || document.activeElement === _aField ) {
|
|
19553
|
+
// #B387 — same provenance record as focusFirstInvalidField.
|
|
19554
|
+
answerFocusHold = { formId: $a11yForm.getAttribute('id'), elName: _aName };
|
|
19467
19555
|
break;
|
|
19468
19556
|
}
|
|
19469
19557
|
}
|
|
@@ -20306,6 +20394,10 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
20306
20394
|
// so a failed submit announced nothing. Confirming it is also what makes the
|
|
20307
20395
|
// "skips unfocusable controls" contract above true rather than aspirational.
|
|
20308
20396
|
if ( typeof(document) === 'undefined' || !document || document.activeElement === $field ) {
|
|
20397
|
+
// #B387 — record the answer-placed focus so display
|
|
20398
|
+
// refreshes firing after the one-shot window (async
|
|
20399
|
+
// completion callers) can tell it from user focus.
|
|
20400
|
+
answerFocusHold = { formId: $form.getAttribute('id'), elName: name };
|
|
20309
20401
|
return true;
|
|
20310
20402
|
}
|
|
20311
20403
|
}
|
|
@@ -20345,12 +20437,22 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
20345
20437
|
var $target = $formInstance.target;
|
|
20346
20438
|
var validationInfo = getFormValidationInfos($target, $formInstance.rules);
|
|
20347
20439
|
|
|
20348
|
-
|
|
20440
|
+
var onDisabledTriggerReveal = function(result) {
|
|
20349
20441
|
var errors = result['fields'] || result['error'];
|
|
20350
20442
|
handleErrorsDisplay($target, errors, result['data']);
|
|
20351
20443
|
focusFirstInvalidField($target, errors);
|
|
20352
20444
|
updateSubmitTriggerState($formInstance, result.isValid());
|
|
20353
|
-
}
|
|
20445
|
+
};
|
|
20446
|
+
// #B348 — completion identity. A reveal pass is un-latched, writes
|
|
20447
|
+
// neither `isSubmitting` nor `isValidating`, and on a VALID form its
|
|
20448
|
+
// verdict is clean — so with the async `query` field not declared
|
|
20449
|
+
// last its waiter completion matched NO dispatch branch and this
|
|
20450
|
+
// callback silently never ran: the documented self-heal + gate
|
|
20451
|
+
// re-sync were dead on those forms. The marker rides the exact cb of
|
|
20452
|
+
// the exact pass (the engine's own `cb._data`/`cb._errors` property
|
|
20453
|
+
// idiom); the waiter's terminal-gated rescue branch consults it.
|
|
20454
|
+
onDisabledTriggerReveal.isRevealCompletion = true;
|
|
20455
|
+
validate($target, validationInfo.fields, validationInfo.$fields, $formInstance.rules, onDisabledTriggerReveal);
|
|
20354
20456
|
};
|
|
20355
20457
|
|
|
20356
20458
|
/**
|
|
@@ -21156,6 +21258,29 @@ function ValidatorPlugin(rules, data, formId, culture) {
|
|
|
21156
21258
|
//console.debug(field +' is NOT the last element to be validated for formId: '+ formId);
|
|
21157
21259
|
needsGlobalReValidation = true;
|
|
21158
21260
|
}
|
|
21261
|
+
// #B348 — the reveal's rescue: a TERMINAL completion
|
|
21262
|
+
// (same condition as the errors>0 block above — the
|
|
21263
|
+
// guard is what stops a multi-query-field early wake,
|
|
21264
|
+
// where the first waiter fires at asyncCount 1)
|
|
21265
|
+
// carrying the reveal's completion identity, that
|
|
21266
|
+
// matched none of the branches above, must dispatch
|
|
21267
|
+
// its own pass or `onDisabledTriggerReveal` starves:
|
|
21268
|
+
// clean verdict + un-latched + not live-check +
|
|
21269
|
+
// query-not-last fell through EVERY branch, the gate
|
|
21270
|
+
// marker never re-synced, and a fully valid form ate
|
|
21271
|
+
// every later click. Chained LAST so every
|
|
21272
|
+
// previously-working shape (terminal errors>0, #B342
|
|
21273
|
+
// latch, last-field, live-check display-only) stays
|
|
21274
|
+
// byte-identical; an un-latched programmatic submit
|
|
21275
|
+
// (#B347) carries no marker and is deliberately
|
|
21276
|
+
// unaffected — its fix is gated on its own repro.
|
|
21277
|
+
else if (
|
|
21278
|
+
hasParsedAllRules
|
|
21279
|
+
&& asyncCount <= 0
|
|
21280
|
+
&& cb && cb.isRevealCompletion
|
|
21281
|
+
) {
|
|
21282
|
+
triggerEvent(gina, $formOrElement, 'validated.' + formId, cb);
|
|
21283
|
+
}
|
|
21159
21284
|
|
|
21160
21285
|
if (needsGlobalReValidation) {
|
|
21161
21286
|
validate($currentForm, allFields, $allFields, rules, function onSilentQueryGlobalLiveValidation(gResult){
|
|
@@ -27791,8 +27916,48 @@ function Collection(content, options) {
|
|
|
27791
27916
|
}
|
|
27792
27917
|
|
|
27793
27918
|
|
|
27919
|
+
/**
|
|
27920
|
+
* Replaces each matched entry with `set`, wholesale — unlike `.update()`,
|
|
27921
|
+
* which merges. Matching is done in two stages: `filter` selects the entries
|
|
27922
|
+
* (same syntax as `.find()`), then each selected entry is located in the
|
|
27923
|
+
* result by comparing a single key against the same key on `set`.
|
|
27924
|
+
*
|
|
27925
|
+
* That comparison key is resolved per entry, from BOTH sides:
|
|
27926
|
+
*
|
|
27927
|
+
* 1. the internal `_uuid` when the stored entry AND `set` both carry one;
|
|
27928
|
+
* 2. otherwise `id`, when both carry one;
|
|
27929
|
+
* 3. otherwise the call throws — a `set` sharing no key with the stored
|
|
27930
|
+
* entry cannot be matched, and refusing is preferable to returning a
|
|
27931
|
+
* result that silently replaced nothing.
|
|
27932
|
+
*
|
|
27933
|
+
* Pass `key` to name the comparison key explicitly; it is then used as given,
|
|
27934
|
+
* with no fallback and no refusal.
|
|
27935
|
+
*
|
|
27936
|
+
* N.B. a chained result carries the internal `_uuid` on every entry the call
|
|
27937
|
+
* did not replace. Persist `.toRaw()` rather than the chained array if the
|
|
27938
|
+
* data is going to be re-loaded into a new Collection later.
|
|
27939
|
+
*
|
|
27940
|
+
* @param {object|Array} filter - Entry selector, as `.find()` — or an already-found result array
|
|
27941
|
+
* @param {object} set - The replacement entry (replaces the match wholesale)
|
|
27942
|
+
* @param {string} [key] - Explicit comparison key; skips the resolution above
|
|
27943
|
+
* @returns {Array} the chainable result set
|
|
27944
|
+
*
|
|
27945
|
+
* @throws {Error} `No comparison key defined !` when neither side shares a usable key
|
|
27946
|
+
*
|
|
27947
|
+
* @example
|
|
27948
|
+
* // matched by the internal _uuid when both sides carry it, else by id
|
|
27949
|
+
* col.replace({ id: 1 }, { id: 1, name: 'Alicia' });
|
|
27950
|
+
*
|
|
27951
|
+
* @example
|
|
27952
|
+
* // explicit comparison key
|
|
27953
|
+
* col.replace({ ref: 'r1' }, { ref: 'r1', name: 'Alicia' }, 'ref');
|
|
27954
|
+
*/
|
|
27794
27955
|
instance['replace'] = function() {
|
|
27795
27956
|
var key = '_uuid' // comparison key
|
|
27957
|
+
// #B393 — whether the caller named the comparison key explicitly. An
|
|
27958
|
+
// explicit key is honoured as given (no fallback, no refusal), exactly
|
|
27959
|
+
// as before; only the DEFAULT `_uuid` path resolves a key below.
|
|
27960
|
+
, keyExplicit = false
|
|
27796
27961
|
, result = null
|
|
27797
27962
|
, filters = null
|
|
27798
27963
|
, set = null
|
|
@@ -27802,6 +27967,7 @@ function Collection(content, options) {
|
|
|
27802
27967
|
|
|
27803
27968
|
if ( typeof(arguments[arguments.length-1]) == 'string' ) {
|
|
27804
27969
|
key = arguments[arguments.length - 1];
|
|
27970
|
+
keyExplicit = true;
|
|
27805
27971
|
delete arguments[arguments.length - 1];
|
|
27806
27972
|
--arguments.length;
|
|
27807
27973
|
}
|
|
@@ -27847,13 +28013,50 @@ function Collection(content, options) {
|
|
|
27847
28013
|
for (var a = 0, aLen = arr.length; a < aLen; ++a) {
|
|
27848
28014
|
arr[a] = JSON.clone(set);
|
|
27849
28015
|
for (var r = 0, rLen = result.length; r < rLen; ++r) {
|
|
27850
|
-
|
|
27851
|
-
|
|
27852
|
-
|
|
27853
|
-
|
|
28016
|
+
// #B393 — resolve the comparison key from BOTH sides, per entry.
|
|
28017
|
+
//
|
|
28018
|
+
// Previously the key was chosen by inspecting the STORED entry
|
|
28019
|
+
// only, and was mutated in place. Two consequences, both fixed
|
|
28020
|
+
// here:
|
|
28021
|
+
//
|
|
28022
|
+
// (a) When the stored entry carried a `_uuid` and the caller's
|
|
28023
|
+
// `set` did not, neither the `id` fallback nor the refusal
|
|
28024
|
+
// fired (both were gated on the STORED entry lacking the
|
|
28025
|
+
// key), so the comparison was `<storedUuid> == undefined` —
|
|
28026
|
+
// never true. Nothing matched, nothing was replaced, and the
|
|
28027
|
+
// call returned a successful-looking result: a silent, lossy
|
|
28028
|
+
// write. A stored `_uuid` is present exactly when the caller
|
|
28029
|
+
// re-loaded an array a previous chained call had returned.
|
|
28030
|
+
// (b) `key` was assigned rather than shadowed, so once any entry
|
|
28031
|
+
// flipped it to `id` it stayed `id` for every later entry in
|
|
28032
|
+
// the same call.
|
|
28033
|
+
//
|
|
28034
|
+
// `cmpKey` is derived per (a, r) pair and the outer `key` is never
|
|
28035
|
+
// written, so a fallback can no longer leak across iterations.
|
|
28036
|
+
var cmpKey = key;
|
|
28037
|
+
if ( !keyExplicit ) {
|
|
28038
|
+
if (
|
|
28039
|
+
typeof(result[r][cmpKey]) == 'undefined'
|
|
28040
|
+
|| typeof(arr[a][cmpKey]) == 'undefined'
|
|
28041
|
+
) {
|
|
28042
|
+
if (
|
|
28043
|
+
typeof(result[r]['id']) != 'undefined'
|
|
28044
|
+
&& typeof(arr[a]['id']) != 'undefined'
|
|
28045
|
+
) {
|
|
28046
|
+
cmpKey = 'id';
|
|
28047
|
+
}
|
|
28048
|
+
}
|
|
28049
|
+
// No key both sides carry: refuse loudly rather than return a
|
|
28050
|
+
// result that silently replaced nothing.
|
|
28051
|
+
if (
|
|
28052
|
+
typeof(result[r][cmpKey]) == 'undefined'
|
|
28053
|
+
|| typeof(arr[a][cmpKey]) == 'undefined'
|
|
28054
|
+
) {
|
|
28055
|
+
throw new Error('No comparison key defined !')
|
|
28056
|
+
}
|
|
27854
28057
|
}
|
|
27855
28058
|
|
|
27856
|
-
if ( result[r][
|
|
28059
|
+
if ( result[r][cmpKey] == arr[a][cmpKey] ) {
|
|
27857
28060
|
result[r] = arr[a];
|
|
27858
28061
|
break;
|
|
27859
28062
|
}
|