gina 0.5.20 → 0.5.21
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 +14 -0
- package/README.md +9 -6
- package/ROADMAP.md +2 -0
- package/framework/v0.5.21/VERSION +1 -0
- package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.js +251 -76
- package/framework/v0.5.21/core/asset/plugin/dist/vendor/gina/js/gina.min.js +589 -0
- package/framework/v0.5.21/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.5.21/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.5.20 → v0.5.21}/core/config.js +49 -2
- package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-json.js +6 -1
- package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-swig.js +46 -8
- package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/src/main.js +115 -47
- package/framework/{v0.5.20 → v0.5.21}/core/server.isaac.js +39 -4
- package/framework/{v0.5.20 → v0.5.21}/core/server.js +47 -3
- package/framework/{v0.5.20 → v0.5.21}/core/template/conf/env.json +7 -1
- package/framework/{v0.5.20 → v0.5.21}/lib/render-cache/src/main.js +113 -2
- package/framework/{v0.5.20 → v0.5.21}/lib/routing/src/main.js +4 -1
- package/framework/{v0.5.20 → v0.5.21}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +12 -2
- package/package.json +3 -3
- package/framework/v0.5.20/VERSION +0 -1
- package/framework/v0.5.20/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -588
- package/framework/v0.5.20/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.5.20/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/AUTHORS +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/LICENSE +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/html/static.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/content.encoding +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/dev/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/gna.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/locales/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/locales/currency.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/locales/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/mime.types +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/model/entity.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/model/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/model/template/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/router.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/server.express.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/status.codes +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/_gitignore +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/console.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/context.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/data/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/data/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/json/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/json/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/path.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/prototypes.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/task.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/helpers/text.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/admin/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/build.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/async/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/async/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/audit/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/audit-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cache/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cache/build.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cache/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/collection/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/collection/build.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/collection/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/config.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cron/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cron/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/domain/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/domain/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/dto/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/generator/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/i18n/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/image-build/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/instrument/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/job/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/job/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/job-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/math/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/merge/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/merge/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/metrics/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/model.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/proc.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/routing/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/routing/build.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/routing/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/secrets/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/session-store.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/shell.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/state.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/url/README.md +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/url/index.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/url/routing.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/uuid/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/validator.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/watcher/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.5.20 → v0.5.21}/lib/ws-session/src/main.js +0 -0
|
@@ -52,8 +52,9 @@
|
|
|
52
52
|
* renderCache.get('static:demo:/page'); // reconstructs the entry from disk + .meta
|
|
53
53
|
*/
|
|
54
54
|
|
|
55
|
-
var fs
|
|
56
|
-
var
|
|
55
|
+
var fs = require('fs');
|
|
56
|
+
var crypto = require('crypto');
|
|
57
|
+
var Cache = require('../../cache/src/main');
|
|
57
58
|
|
|
58
59
|
/**
|
|
59
60
|
* Build the on-disk paths for an `fs`-strategy entry. Single source of truth
|
|
@@ -989,4 +990,114 @@ RenderCache.validateConfig = function(serverCache, routing, bundle) {
|
|
|
989
990
|
return out;
|
|
990
991
|
};
|
|
991
992
|
|
|
993
|
+
/**
|
|
994
|
+
* #B130 — CSP-nonce re-stamp for served cache hits (pure, static).
|
|
995
|
+
*
|
|
996
|
+
* A render/output-cache hit replays the STORED response headers and the STORED
|
|
997
|
+
* body — both minted by the request that WROTE the entry. When the stored
|
|
998
|
+
* Content-Security-Policy header carries `'nonce-…'` sources, replaying the
|
|
999
|
+
* pair verbatim reuses one nonce for every client of that URL until the entry
|
|
1000
|
+
* expires (and, pre-#B130, could even replay a header/body PAIR minted by two
|
|
1001
|
+
* different requests). The serve sites (server.js `serveRenderCacheHit` + the
|
|
1002
|
+
* isaac pre-routing read — keep both in sync) call this to mint a FRESH nonce
|
|
1003
|
+
* per response and rewrite the header copy; the body is rewritten with
|
|
1004
|
+
* {@link RenderCache.swapNonces}. The Csp middleware never runs on a hit (the
|
|
1005
|
+
* hit short-circuits dispatch), so this is the only mint on that path.
|
|
1006
|
+
*
|
|
1007
|
+
* Inputs are never mutated — the cache entry keeps its original values.
|
|
1008
|
+
*
|
|
1009
|
+
* @function renonceCspHeaders
|
|
1010
|
+
* @memberof RenderCache
|
|
1011
|
+
* @static
|
|
1012
|
+
*
|
|
1013
|
+
* @param {object|null} responseHeaders - The stored headers snapshot (`res.getHeaders()` shape, lowercase keys)
|
|
1014
|
+
*
|
|
1015
|
+
* @returns {object|null} `null` when no CSP header carries a nonce (serve the stored pair verbatim);
|
|
1016
|
+
* else `{ headers, oldNonces, nonce }` — a fresh headers object with every
|
|
1017
|
+
* `'nonce-…'` value replaced, the distinct old nonce values found, and the new nonce
|
|
1018
|
+
*
|
|
1019
|
+
* @example
|
|
1020
|
+
* var rn = RenderCache.renonceCspHeaders(hit.responseHeaders);
|
|
1021
|
+
* if (rn) {
|
|
1022
|
+
* body = RenderCache.swapNonces(hit.content, rn.oldNonces, rn.nonce);
|
|
1023
|
+
* // replay rn.headers instead of hit.responseHeaders
|
|
1024
|
+
* }
|
|
1025
|
+
*/
|
|
1026
|
+
RenderCache.renonceCspHeaders = function (responseHeaders) {
|
|
1027
|
+
if ( !responseHeaders || typeof(responseHeaders) !== 'object' ) {
|
|
1028
|
+
return null;
|
|
1029
|
+
}
|
|
1030
|
+
var cspKeys = [], oldNonces = [], h = null, i = 0;
|
|
1031
|
+
for (h in responseHeaders) {
|
|
1032
|
+
if (
|
|
1033
|
+
/^content-security-policy(-report-only)?$/i.test(h)
|
|
1034
|
+
&& typeof(responseHeaders[h]) === 'string'
|
|
1035
|
+
) {
|
|
1036
|
+
cspKeys.push(h);
|
|
1037
|
+
var found = responseHeaders[h].match(/'nonce-[^']+'/g) || [];
|
|
1038
|
+
for (i = 0; i < found.length; i++) {
|
|
1039
|
+
// `'nonce-` prefix (7 chars) + trailing `'`
|
|
1040
|
+
var val = found[i].substring(7, found[i].length - 1);
|
|
1041
|
+
if (val && oldNonces.indexOf(val) === -1) {
|
|
1042
|
+
oldNonces.push(val);
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
if (oldNonces.length === 0) {
|
|
1048
|
+
return null;
|
|
1049
|
+
}
|
|
1050
|
+
// 16 bytes = 128 bits — parity with the Csp plugin's NONCE_BYTES (the W3C
|
|
1051
|
+
// CSP3 nonce-entropy floor). base64 like the middleware mint.
|
|
1052
|
+
var nonce = crypto.randomBytes(16).toString('base64');
|
|
1053
|
+
var headers = {};
|
|
1054
|
+
for (h in responseHeaders) {
|
|
1055
|
+
headers[h] = responseHeaders[h];
|
|
1056
|
+
}
|
|
1057
|
+
for (i = 0; i < cspKeys.length; i++) {
|
|
1058
|
+
headers[ cspKeys[i] ] = RenderCache.swapNonces(headers[ cspKeys[i] ], oldNonces, nonce);
|
|
1059
|
+
}
|
|
1060
|
+
return { headers: headers, oldNonces: oldNonces, nonce: nonce };
|
|
1061
|
+
};
|
|
1062
|
+
|
|
1063
|
+
/**
|
|
1064
|
+
* #B130 — replace every occurrence of each old nonce value with the fresh one.
|
|
1065
|
+
* Exact-string swap (split/join — nonce values are base64 and may carry `+/=`,
|
|
1066
|
+
* so no regex). Covers the framework bootstrap `nonce="…"` attribute AND any
|
|
1067
|
+
* app-template `{{ page.cspNonce }}` occurrence baked into the stored body.
|
|
1068
|
+
* Null-safe: a non-string `content` (or empty swap set) is returned unchanged.
|
|
1069
|
+
*
|
|
1070
|
+
* @function swapNonces
|
|
1071
|
+
* @memberof RenderCache
|
|
1072
|
+
* @static
|
|
1073
|
+
*
|
|
1074
|
+
* @param {string} content - The stored response body
|
|
1075
|
+
* @param {array} oldNonces - Distinct old nonce values (from {@link RenderCache.renonceCspHeaders})
|
|
1076
|
+
* @param {string} nonce - The fresh nonce
|
|
1077
|
+
*
|
|
1078
|
+
* @returns {string} The body with old nonce values swapped for the fresh one
|
|
1079
|
+
*
|
|
1080
|
+
* @example
|
|
1081
|
+
* RenderCache.swapNonces('<script nonce="abc+/=">', ['abc+/='], 'Zm9v');
|
|
1082
|
+
* // -> '<script nonce="Zm9v">'
|
|
1083
|
+
*/
|
|
1084
|
+
RenderCache.swapNonces = function (content, oldNonces, nonce) {
|
|
1085
|
+
if (
|
|
1086
|
+
typeof(content) !== 'string'
|
|
1087
|
+
|| !Array.isArray(oldNonces)
|
|
1088
|
+
|| oldNonces.length === 0
|
|
1089
|
+
|| typeof(nonce) !== 'string'
|
|
1090
|
+
|| !nonce
|
|
1091
|
+
) {
|
|
1092
|
+
return content;
|
|
1093
|
+
}
|
|
1094
|
+
for (var i = 0; i < oldNonces.length; i++) {
|
|
1095
|
+
if (oldNonces[i] === nonce) {
|
|
1096
|
+
continue;
|
|
1097
|
+
}
|
|
1098
|
+
content = content.split(oldNonces[i]).join(nonce);
|
|
1099
|
+
}
|
|
1100
|
+
return content;
|
|
1101
|
+
};
|
|
1102
|
+
|
|
992
1103
|
module.exports = RenderCache;
|
|
@@ -1090,7 +1090,10 @@ function Routing() {
|
|
|
1090
1090
|
|
|
1091
1091
|
|
|
1092
1092
|
if ( typeof(routing[rule]) == 'undefined' ) {
|
|
1093
|
-
|
|
1093
|
+
// #B132 — name the bundle + its table size so a degraded/near-empty
|
|
1094
|
+
// table (e.g. a bundle whose routing config never loaded) is
|
|
1095
|
+
// tellable from a plain mistyped rule at the call site.
|
|
1096
|
+
throw new Error('[ RoutingHelper::getRouting(rule, params) ] : `' +rule + '` not found ! (bundle `'+ bundle +'` holds '+ Object.keys(routing).length +' rules)')
|
|
1094
1097
|
}
|
|
1095
1098
|
|
|
1096
1099
|
var route = JSON.clone(routing[rule]);
|
package/gna.js
CHANGED
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
'use strict';
|
|
16
16
|
|
|
17
17
|
// Framework core — the main gna module (lifecycle hooks, lib, etc.)
|
|
18
|
-
var _gna = require('./framework/v0.5.
|
|
18
|
+
var _gna = require('./framework/v0.5.21/core/gna');
|
|
19
19
|
|
|
20
20
|
// SuperController and EntitySuper — loaded from their source modules
|
|
21
|
-
var SuperController = require('./framework/v0.5.
|
|
22
|
-
var EntitySuper = require('./framework/v0.5.
|
|
21
|
+
var SuperController = require('./framework/v0.5.21/core/controller');
|
|
22
|
+
var EntitySuper = require('./framework/v0.5.21/core/model/entity');
|
|
23
23
|
|
|
24
24
|
// uuid — from the lib registry
|
|
25
|
-
var uuid = require('./framework/v0.5.
|
|
25
|
+
var uuid = require('./framework/v0.5.21/lib/uuid');
|
|
26
26
|
|
|
27
27
|
module.exports = {
|
|
28
28
|
|
package/llms.txt
CHANGED
|
@@ -870,7 +870,7 @@ Dev-mode query instrumentation captures every database query tied to the current
|
|
|
870
870
|
- **`server.isaac.js:1954` initializes `req.params`** — `request.params = {}` and `request.params[0] = url` are set before `handle()` runs. Any code that deletes `req.params` breaks `fitsWithRequirements` which checks `typeof(request.params) != 'undefined'` before setting param values.
|
|
871
871
|
- **internal-bundle `setting-get-one-design` was a latent crash** — an internal bundle's routing had `"url": "/settings/get/design/:designId"` with no `requirements` block. Before the `fitsWithRequirements` fix, every GET to that URL threw a 500 TypeError. The fix makes it work correctly. Worth testing that route after the next ff-only merge.
|
|
872
872
|
|
|
873
|
-
129. **`env.json > response.header` config defaults are asymmetric across engines and can collide with framework `setHeader` calls — always trace the full emit chain before claiming a config default reaches the wire.** `core/server.js` (Express engine) reads `conf.server.response.header` into `resHeaders` at `server.js:1944` and loops `response.setHeader(h, headerValue)` over each key at `server.js:2034` — so any entry in the env.json `response.header` block IS applied on Express. But `core/server.isaac.js` does NOT read `server.response.header` anywhere (grep `serverResponseHeaders` / `server\.response\.header` against `server.isaac.js` returns zero matches) — Isaac builds its headers from the framework's own primitives (`_setPoweredByHeader()` for X-Powered-By, fixed setHeader calls for cache/CORS at the `/_gina/*` handlers), so any env.json `response.header` default is silently ignored on Isaac bundles. Layered on top: framework code that emits its own canonical value via a later `setHeader` call in the Express request lifecycle OVERWRITES whatever env.json set earlier. The combination means an env.json `response.header` config default can look load-bearing in the template while being functionally dead at runtime — applied-then-overwritten on Express, ignored on Isaac. Operator rule: before claiming a `response.header` config key reaches the wire, (a) grep both engines for reads of `server.response.header` (the Isaac silence is the dead-giveaway), and (b) grep for framework `setHeader('<that-key>', ...)` calls that would overwrite. Precedent: 2026-05-17 — the `X-Powered-By: "Gina I/O - v${version}"` env.json default at `core/template/conf/env.json:91` was structurally dead (overwritten by `server.js:3038` on Express, never read on Isaac); dropped in favour of the canonical `Gina/<version>` shape emitted by `server.js:3038` + `_setPoweredByHeader()` and suppressed by `gina.plugins.HidePoweredBy()` middleware + `settings.json > server.hidePoweredBy: true` gate respectively. The handoff that prompted the cleanup had framed the env.json default as a "third emit path that neither plugin nor gate reaches" — wrong in both directions (Express middleware DID remove the overwritten value cleanly; Isaac never read the env.json key at all). Established 2026-05-17. **Amended 2026-07-11 (static-404 suppression uniformity):** the per-request emission in `server.js`'s request-entry catch-all fires for BOTH engines (the Express-only framing above was stale — Isaac requests traverse it too) and is now GATED on `settings.json > server.hidePoweredBy`, so the flag suppresses X-Powered-By framework-wide: routed responses, static-asset serves, static/traversal 404s, framework error pages, and the Isaac `/_gina/*` sites it already covered. Previously the flag gated ONLY the `/_gina/*` sites, and a static-asset 404 leaked `Gina/<version>` past ALL THREE documented mechanisms: the middleware drain is bypassed for non-`text/html` static requests, and `throwError`'s HTTP/1.1 branches called `writeHead` BEFORE `completeHeaders`, whose `!headersSent`-gated loop then skipped the env `response.header` override — while the HTTP/2 branch merged it via `getHeaders()`. That engine asymmetry read as "override works on routed, raw literal on static-404" behind an HTTP/1.1 reverse proxy. `throwError` now applies `completeHeaders` before the HTTP/1.1 flush (a deferred content-type carrier + a late `writeHead`), so an env `response.header` X-Powered-By entry OVERRIDES the framework value on error responses too — i.e. the env.json entry is no longer dead: it is the value-REPLACEMENT mechanism, while `server.hidePoweredBy` is the removal mechanism. Wire-verified 3-config matrix on an isolated daemonless boot: default → `Gina/<version>` everywhere (unchanged); flag → absent everywhere; override `''` → empty value on static-404 + traversal + routed alike.
|
|
873
|
+
129. **`env.json > response.header` config defaults are asymmetric across engines and can collide with framework `setHeader` calls — always trace the full emit chain before claiming a config default reaches the wire.** `core/server.js` (Express engine) reads `conf.server.response.header` into `resHeaders` at `server.js:1944` and loops `response.setHeader(h, headerValue)` over each key at `server.js:2034` — so any entry in the env.json `response.header` block IS applied on Express. But `core/server.isaac.js` does NOT read `server.response.header` anywhere (grep `serverResponseHeaders` / `server\.response\.header` against `server.isaac.js` returns zero matches) — Isaac builds its headers from the framework's own primitives (`_setPoweredByHeader()` for X-Powered-By, fixed setHeader calls for cache/CORS at the `/_gina/*` handlers), so any env.json `response.header` default is silently ignored on Isaac bundles. Layered on top: framework code that emits its own canonical value via a later `setHeader` call in the Express request lifecycle OVERWRITES whatever env.json set earlier. The combination means an env.json `response.header` config default can look load-bearing in the template while being functionally dead at runtime — applied-then-overwritten on Express, ignored on Isaac. Operator rule: before claiming a `response.header` config key reaches the wire, (a) grep both engines for reads of `server.response.header` (the Isaac silence is the dead-giveaway), and (b) grep for framework `setHeader('<that-key>', ...)` calls that would overwrite. Precedent: 2026-05-17 — the `X-Powered-By: "Gina I/O - v${version}"` env.json default at `core/template/conf/env.json:91` was structurally dead (overwritten by `server.js:3038` on Express, never read on Isaac); dropped in favour of the canonical `Gina/<version>` shape emitted by `server.js:3038` + `_setPoweredByHeader()` and suppressed by `gina.plugins.HidePoweredBy()` middleware + `settings.json > server.hidePoweredBy: true` gate respectively. The handoff that prompted the cleanup had framed the env.json default as a "third emit path that neither plugin nor gate reaches" — wrong in both directions (Express middleware DID remove the overwritten value cleanly; Isaac never read the env.json key at all). Established 2026-05-17. **Amended 2026-07-11 (static-404 suppression uniformity):** the per-request emission in `server.js`'s request-entry catch-all fires for BOTH engines (the Express-only framing above was stale — Isaac requests traverse it too) and is now GATED on `settings.json > server.hidePoweredBy`, so the flag suppresses X-Powered-By framework-wide: routed responses, static-asset serves, static/traversal 404s, framework error pages, and the Isaac `/_gina/*` sites it already covered. Previously the flag gated ONLY the `/_gina/*` sites, and a static-asset 404 leaked `Gina/<version>` past ALL THREE documented mechanisms: the middleware drain is bypassed for non-`text/html` static requests, and `throwError`'s HTTP/1.1 branches called `writeHead` BEFORE `completeHeaders`, whose `!headersSent`-gated loop then skipped the env `response.header` override — while the HTTP/2 branch merged it via `getHeaders()`. That engine asymmetry read as "override works on routed, raw literal on static-404" behind an HTTP/1.1 reverse proxy. `throwError` now applies `completeHeaders` before the HTTP/1.1 flush (a deferred content-type carrier + a late `writeHead`), so an env `response.header` X-Powered-By entry OVERRIDES the framework value on error responses too — i.e. the env.json entry is no longer dead: it is the value-REPLACEMENT mechanism, while `server.hidePoweredBy` is the removal mechanism. Wire-verified 3-config matrix on an isolated daemonless boot: default → `Gina/<version>` everywhere (unchanged); flag → absent everywhere; override `''` → empty value on static-404 + traversal + routed alike. **Second amendment (2026-07-20, accept-language removal):** the template's OTHER hardcoded response-header default — `accept-language` (a REQUEST header, meaningless on responses; the runtime-merged template default made every response emit it, errors included) — is removed the same way the X-Powered-By default was: the framework emits nothing by default, a project/bundle env.json that declares its own value keeps being emitted verbatim (the override path is intact), and the controller's locale fallback still honors a declared value. The response.header block itself stays present-but-empty in the template — the controller fallback dereferences `server.response.header`, so the block's existence is load-bearing.
|
|
874
874
|
|
|
875
875
|
133. **SQL Query-Instrumentation index reporting does per-query column-level coverage (#QI Phase C) — heuristic, declared-index-vs-WHERE, NOT a planner verdict.** `sql-parser.js` gained two exports beyond Phase A's `parseCreateIndexes`/`extractTargetTable`: `extractWhereColumns(queryString)` (heuristic — bare lowercase identifiers immediately left of a comparison operator inside the WHERE clause; strips table/alias qualifiers; ignores ORDER BY/GROUP BY/HAVING; functional predicates like `LOWER(email)=?` yield no column, conservatively) and `annotateCoverage(tableIndexes, queryString)` (clones each descriptor, adds a `covers` boolean via the **leftmost-prefix rule** — an index covers the filter only if its FIRST column is among the WHERE columns, mirroring real B-tree usability; never mutates the shared `_knownIndexes`). `parseCreateIndexes` now captures each index's `columns` array (regex extended to consume the `(col, ...)` body plus an optional `USING <method>`; ASC/DESC/opclass/prefix-length reduced to the bare leading identifier). Each SQL connector's QI block (mysql/postgresql/sqlite) calls `annotateCoverage` and stores `_queryEntry.whereColumns` + per-index `covers`. The Inspector Query tab adds a 4th badge state `.bm-idx-uncovered` (amber-gold, dark `#e6b800` / light `#8a6d00`, label "no index for filter") that fires only when the table HAS indexes AND a WHERE filter parsed AND none cover it (so there is no false "uncovered" when the filter is unparseable or absent); the existing green/amber/red/N-A states are unchanged. **SQL-connector-only** — Couchbase reads the actually-used index from the query execution profile (accurate), so column inference is moot there and its path is untouched. Heuristic limits (documented deliberately): regex WHERE-parsing with no AST, no selectivity / range-vs-equality / functional-index awareness, and `indexes.sql` is a declaration that can drift from the live DB — the badge says "no index for filter", NOT "index unused". Phase B live-introspection (#QI Phase C.2, 2026-05-20) now ALSO captures each index's columns — MySQL adds `SEQ_IN_INDEX`/`COLUMN_NAME` to the STATISTICS query, PostgreSQL parses `indexdef` via the new `sql-parser.parseIndexDefColumns()` export, SQLite adds a per-index `PRAGMA index_info` — so live descriptors carry the same `{ name, primary, columns }` shape as Phase A and column-level coverage survives the opt-in `/_gina/indexes` refresh (subsequent queries annotate correctly instead of a false `uncovered` badge; server-side only, no SPA/dist change since coverage is computed server-side per query). Tests: `test/core/inspector.test.js` §61 (21, Phase C) + §62 (12, Phase C.2). Established 2026-05-20.
|
|
876
876
|
|
|
@@ -916,7 +916,7 @@ Dev-mode query instrumentation captures every database query tied to the current
|
|
|
916
916
|
|
|
917
917
|
212. **Structured (JSON) logging — `GINA_LOG_FORMAT=json` + per-request `requestId`/`durationMs` (consolidates former #152/#155; #M12a/#M12b).** The logger resolves its render format ONCE at init into `opt.format` (precedence `GINA_LOG_FORMAT=json|text` > `GINA_LOG_STDOUT` truthy ⇒ json > `text` default) BEFORE containers are cloned; a JSON line is `{ts, level, bundle, message, group, msg}` — `bundle`/`message` canonical, `group`/`msg` retained as additive back-compat aliases — and the raw `console.log` path honours the format too (otherwise JSON mode would interleave plain lines and break a collector); the `text` default keeps container logs byte-identical. Per-request `requestId` + `durationMs` ride JSON logs via a NARROW `AsyncLocalStorage` (`process.gina._reqALS`, parked on `process.gina` so it survives dev require-cache busting), gated on JSON logging ONLY (text renders no id field, so the ALS would be pure overhead — the text path stays byte-identical/zero-cost): the id resolver honours a SANITISED inbound `X-Request-Id` (`/^[\w.\-]{1,128}$/`, regenerate-on-violation kills log forging) else `crypto.randomUUID()`; the `.run({requestId, startMs})` wrap sits at `handle()` — NOT the request-entry handler — because the `request.on('end')` boundary between them loses async context while `handle()`'s awaits preserve it (the original body became `_handleDispatch`; `handle` is a thin wrapper); HTTP/2 gets per-stream scoping free via Node's per-stream compat `'request'` event, NOT `session.on('stream')`; the JSON-assembly sites read `getStore()` and add `requestId` + per-line `durationMs`, gracefully absent for CLI/boot/off-request logs. `.run()`, never `enterWith()` (enterWith bleeds sideways across siblings).
|
|
918
918
|
|
|
919
|
-
213. **Client-plugin discipline — CSP-safe listeners, native-dialog parity, preload coalescing (consolidates former #149/#159/#200).** (1) Client-bundle plugins must NOT inject inline event-handler attributes (`setAttribute('onclick', …)`, `el.onX = …`) — they trip CSP `script-src-attr` under nonce-based policies; suppress defaults with `addEventListener('click', e => e.preventDefault())`, and keep it `preventDefault`-ONLY (no stopPropagation) when the element participates in event delegation other handlers depend on — a `preventDefault`-only listener still sets `event.defaultPrevented` exactly as the inline handler did. (2) Dialog popins open as native modals (`$el.showModal()`) in EVERY env — the dev-only non-modal downgrade + manual overlay are gone for dialog mode (native `::backdrop`); a consumer that PRE-OPENS the dialog (skeleton loading) must also use `showModal()` or it is born non-modal with nothing positioning it; the opt-in `preOpen`/`loadingShell` skeleton is idempotent via `hasAttribute('open')` — NOT getAttribute truthiness, because `showModal()` sets `open` to the EMPTY string; a native UA close (Escape, `<form method="dialog">`) fires the element's `close` event WITHOUT the plugin's own close path, so a once-per-element `close` listener (the event is `close`, not `cancel` — `cancel` is Escape-only) routes it through the plugin close, keeping open-state/listeners/toolbar consistent — a UA-closed shared popin otherwise re-opens "one render behind" (#B58). (3) A popin/dialog click fired TWO identical GETs because the hover/`focusin` preload — `focusin` is part of the click gesture — was never reused: an in-flight preload registry lets the click-time consume ADOPT the in-flight fetch (waiter woken with the body, caller's own load on failure) instead of fetching again, and the legacy click path consumes preloads at all now (#B54); only the initial GET is ever preloaded. The consume path bypassing the full load tail (redirect/JSON handling) was ASSUMED acceptable — but a hover/focus-WARMED trigger whose GET returns a redirect/JSON response (`application/json` `{isXhrRedirect,location}`) had that raw JSON blind-injected as the popin body via `applyContent` (`$el.innerHTML`), the `_self` tunnel never firing — IDENTICAL symptom to the #B77 `_self` timer race but a DIFFERENT mechanism (the consume path, regression `2c61c494` v0.5.5), so #B77 fixed only the UNWARMED click-time path and the WARMED path persisted until #B80 (2026-07-06, `37e6829c`): `preloadFetch`'s `onreadystatechange` now caches a 2xx response ONLY when its Content-Type is NOT `application/json` (mirrors `popinLoad`'s own `isJsonContent` detection), firing the in-flight waiters with `null` (→ `consumePreload`'s `onMiss` = the click-time `doLoad`) and leaving the cache empty (→ a ready consume returns false → `doLoad`), so a JSON-returning trigger falls through to the click-time `popinLoad`'s full redirect/JSON tail exactly as a non-preloaded click (one extra GET on click — the hover-warm GET is not reused; measured 2 GETs). Only a genuine HTML fragment is preloaded+injected. Browser-bundled → prod dist rebuilt; VERIFIED in a real browser (a warmed legacy `data-gina-popin-url` redirect trigger now shows the tunnel target, not the raw JSON; the decline path positively exercised via resource-timing) — jsdom is falsely green. That residual — the GET itself still fired on hover for side-effecting triggers, authenticated (same-origin cookies) and CSRF-token-less (GET) — is CLOSED by the #B91 per-trigger opt-out (2026-07-10): `data-gina-dialog-preload="false"` on the trigger (honored on legacy `data-gina-popin-url` triggers too — the gate reads the attribute off the closest-matched intent target; case-INSENSITIVE `/^false$/i` on purpose, so a templated "False" cannot fail open and fire the GET anyway — deliberately safer than data-gina-dialog-modal's case-sensitive parse) suppresses BOTH the hover warm and the focusin-on-click warm at the shared intent handler; the opted-out click loads normally at click time (undefined cache slot → consume returns false → the caller's click-time load; exactly one GET per click). Default stays preload-ON: GET is presumed safe to fire early per HTTP semantics — a side-effecting trigger declares itself (the hover-prefetch ecosystem's convention, live-verified). (4) A proxied/tunnelled redirect JSON response (`isXhrRedirect`+`location`, default `_self`) used to `$popin.load()` then arm a blind `setTimeout(50, () => !$popin.isOpen && $popin.open())`; a follow-up load slower than 50 ms opened the popin against a not-yet-injected (skeleton/empty) target → intermittent unhandled-deref crash. Removed as vestigial (v0.1.0, 2021) — the already-armed `loaded.<id>` listener opens CONTENT-FIRST (injects the body via popinBind/handleLoadedBody, THEN popinOpen), so the load alone suffices; the `_self` branch's `return;` still guards the `window.open` fall-through (non-`_self` targets only) (#B77). Event contract: `open.<id>` = a fresh open, `loaded.<id>` = reload/redirect content injected — a consumer needing "content ready on every load" must listen to BOTH. A structurally identical blind timer lived in the SIBLING validator `Validator::Popin now redirecting` path (`core/plugins/lib/validator/src/main.js`), removed by #B79 (2026-07-10): the validator DISCARDED popinLoad's return, and that return IS the `{open}` handle whose `open()` arms the content-first `loaded.<id>` listener — so the timer was papering over a race the discarded handle created (an XHR faster than 50 ms fired `loaded` into the void and the body was lost, a slower one opened an empty popin first). It now captures the handle and calls `open()` inside the same not-open gate, guarding the `undefined` popinLoad returns when the request cannot start (CORS unsupported) so a failed load never blind-opens an empty popin; and the cross-popin branch resets `isRedirecting` before closing the ORIGINAL popin, because `popinClose` early-bails on a redirecting popin — that close was a silent no-op, leaving the original open behind the new one (browser-verified: pre-fix stays open, post-fix closes). MEASURED CORRECTION: the timer was NOT load-bearing for the different-popin branch as long assumed — that branch threw first, because the published `gina.popin` WAS re-assembled with a target-wins merge on every `new Popin()`, so its `getPopinByName`/`getPopinById` stayed bound to the FIRST instance's registry and resolved ONLY the boot popin, while `$popins` + `getActivePopin` saw every popin and `gina.popin.activePopinId` never updated (so `getActivePopin()` returned null once nothing was open) — and popins registered AFTER an instance's publish (click-time in-page dialog registrations) never reached the published registry at all, with destroyed popins lingering in it. FIXED as #B90 (2026-07-10): ONE module-scoped registry (`_sharedPopins`) aliased by every instance's `$popins`; a publish-ONCE `gina.popin = instance` (the published object IS the first instance, LIVE — re-publishing was both the freeze defect and, with a shared registry, a self-merge recursion hazard: gina's merge deep-recurses plain objects and `$popin.eventData` can hold the $popin itself); and a `setActivePopinId` write-through helper at all 7 write sites keeping the published `activePopinId` truthful no matter which instance opens or closes a popin. Browser-verified both ways on the built bundle (pre-fix: accessors blind + the validator cross-popin redirect 422-throws `not found`; fixed: accessors resolve every instance's popins and a form submit redirecting into a DIFFERENT popin works end-to-end — the original closes, the target loads content-first, `activePopinId` follows). Generalises: an accessor published through a target-wins `merge()` silently keeps the first instance's closure — publish a live instance once and share module-scoped state instead of re-merging per construction; and never infer a code path is reachable from the fact that it exists. All
|
|
919
|
+
213. **Client-plugin discipline — CSP-safe listeners, native-dialog parity, preload coalescing (consolidates former #149/#159/#200).** (1) Client-bundle plugins must NOT inject inline event-handler attributes (`setAttribute('onclick', …)`, `el.onX = …`) — they trip CSP `script-src-attr` under nonce-based policies; suppress defaults with `addEventListener('click', e => e.preventDefault())`, and keep it `preventDefault`-ONLY (no stopPropagation) when the element participates in event delegation other handlers depend on — a `preventDefault`-only listener still sets `event.defaultPrevented` exactly as the inline handler did. (2) Dialog popins open as native modals (`$el.showModal()`) in EVERY env — the dev-only non-modal downgrade + manual overlay are gone for dialog mode (native `::backdrop`); a consumer that PRE-OPENS the dialog (skeleton loading) must also use `showModal()` or it is born non-modal with nothing positioning it; the opt-in `preOpen`/`loadingShell` skeleton is idempotent via `hasAttribute('open')` — NOT getAttribute truthiness, because `showModal()` sets `open` to the EMPTY string; a native UA close (Escape, `<form method="dialog">`) fires the element's `close` event WITHOUT the plugin's own close path, so a once-per-element `close` listener (the event is `close`, not `cancel` — `cancel` is Escape-only) routes it through the plugin close, keeping open-state/listeners/toolbar consistent — a UA-closed shared popin otherwise re-opens "one render behind" (#B58). (3) A popin/dialog click fired TWO identical GETs because the hover/`focusin` preload — `focusin` is part of the click gesture — was never reused: an in-flight preload registry lets the click-time consume ADOPT the in-flight fetch (waiter woken with the body, caller's own load on failure) instead of fetching again, and the legacy click path consumes preloads at all now (#B54); only the initial GET is ever preloaded. The consume path bypassing the full load tail (redirect/JSON handling) was ASSUMED acceptable — but a hover/focus-WARMED trigger whose GET returns a redirect/JSON response (`application/json` `{isXhrRedirect,location}`) had that raw JSON blind-injected as the popin body via `applyContent` (`$el.innerHTML`), the `_self` tunnel never firing — IDENTICAL symptom to the #B77 `_self` timer race but a DIFFERENT mechanism (the consume path, regression `2c61c494` v0.5.5), so #B77 fixed only the UNWARMED click-time path and the WARMED path persisted until #B80 (2026-07-06, `37e6829c`): `preloadFetch`'s `onreadystatechange` now caches a 2xx response ONLY when its Content-Type is NOT `application/json` (mirrors `popinLoad`'s own `isJsonContent` detection), firing the in-flight waiters with `null` (→ `consumePreload`'s `onMiss` = the click-time `doLoad`) and leaving the cache empty (→ a ready consume returns false → `doLoad`), so a JSON-returning trigger falls through to the click-time `popinLoad`'s full redirect/JSON tail exactly as a non-preloaded click (one extra GET on click — the hover-warm GET is not reused; measured 2 GETs). Only a genuine HTML fragment is preloaded+injected. Browser-bundled → prod dist rebuilt; VERIFIED in a real browser (a warmed legacy `data-gina-popin-url` redirect trigger now shows the tunnel target, not the raw JSON; the decline path positively exercised via resource-timing) — jsdom is falsely green. That residual — the GET itself still fired on hover for side-effecting triggers, authenticated (same-origin cookies) and CSRF-token-less (GET) — is CLOSED by the #B91 per-trigger opt-out (2026-07-10): `data-gina-dialog-preload="false"` on the trigger (honored on legacy `data-gina-popin-url` triggers too — the gate reads the attribute off the closest-matched intent target; case-INSENSITIVE `/^false$/i` on purpose, so a templated "False" cannot fail open and fire the GET anyway — deliberately safer than data-gina-dialog-modal's case-sensitive parse) suppresses BOTH the hover warm and the focusin-on-click warm at the shared intent handler; the opted-out click loads normally at click time (undefined cache slot → consume returns false → the caller's click-time load; exactly one GET per click). Default stays preload-ON: GET is presumed safe to fire early per HTTP semantics — a side-effecting trigger declares itself (the hover-prefetch ecosystem's convention, live-verified). (4) A proxied/tunnelled redirect JSON response (`isXhrRedirect`+`location`, default `_self`) used to `$popin.load()` then arm a blind `setTimeout(50, () => !$popin.isOpen && $popin.open())`; a follow-up load slower than 50 ms opened the popin against a not-yet-injected (skeleton/empty) target → intermittent unhandled-deref crash. Removed as vestigial (v0.1.0, 2021) — the already-armed `loaded.<id>` listener opens CONTENT-FIRST (injects the body via popinBind/handleLoadedBody, THEN popinOpen), so the load alone suffices; the `_self` branch's `return;` still guards the `window.open` fall-through (non-`_self` targets only) (#B77). Event contract: `open.<id>` = a fresh open, `loaded.<id>` = reload/redirect content injected — a consumer needing "content ready on every load" must listen to BOTH. A structurally identical blind timer lived in the SIBLING validator `Validator::Popin now redirecting` path (`core/plugins/lib/validator/src/main.js`), removed by #B79 (2026-07-10): the validator DISCARDED popinLoad's return, and that return IS the `{open}` handle whose `open()` arms the content-first `loaded.<id>` listener — so the timer was papering over a race the discarded handle created (an XHR faster than 50 ms fired `loaded` into the void and the body was lost, a slower one opened an empty popin first). It now captures the handle and calls `open()` inside the same not-open gate, guarding the `undefined` popinLoad returns when the request cannot start (CORS unsupported) so a failed load never blind-opens an empty popin; and the cross-popin branch resets `isRedirecting` before closing the ORIGINAL popin, because `popinClose` early-bails on a redirecting popin — that close was a silent no-op, leaving the original open behind the new one (browser-verified: pre-fix stays open, post-fix closes). MEASURED CORRECTION: the timer was NOT load-bearing for the different-popin branch as long assumed — that branch threw first, because the published `gina.popin` WAS re-assembled with a target-wins merge on every `new Popin()`, so its `getPopinByName`/`getPopinById` stayed bound to the FIRST instance's registry and resolved ONLY the boot popin, while `$popins` + `getActivePopin` saw every popin and `gina.popin.activePopinId` never updated (so `getActivePopin()` returned null once nothing was open) — and popins registered AFTER an instance's publish (click-time in-page dialog registrations) never reached the published registry at all, with destroyed popins lingering in it. FIXED as #B90 (2026-07-10): ONE module-scoped registry (`_sharedPopins`) aliased by every instance's `$popins`; a publish-ONCE `gina.popin = instance` (the published object IS the first instance, LIVE — re-publishing was both the freeze defect and, with a shared registry, a self-merge recursion hazard: gina's merge deep-recurses plain objects and `$popin.eventData` can hold the $popin itself); and a `setActivePopinId` write-through helper at all 7 write sites keeping the published `activePopinId` truthful no matter which instance opens or closes a popin. Browser-verified both ways on the built bundle (pre-fix: accessors blind + the validator cross-popin redirect 422-throws `not found`; fixed: accessors resolve every instance's popins and a form submit redirecting into a DIFFERENT popin works end-to-end — the original closes, the target loads content-first, `activePopinId` follows). Generalises: an accessor published through a target-wins `merge()` silently keeps the first instance's closure — publish a live instance once and share module-scoped state instead of re-merging per construction; and never infer a code path is reachable from the fact that it exists. (5) EAGER content warm — `data-gina-dialog-preload="eager"` (case-insensitive) opts a trigger into a one-shot idle warm-all pass: after `window` load, on requestIdleCallback (setTimeout fallback), serialized one GET at a time, routed through the SAME shared per-trigger gate as the hover warm (`warmTrigger`: disabled skip → the `"false"` opt-out → URL-cache dedup → in-flight reserve + fetch) so the two warm paths cannot drift and whichever fires second is a no-op; skipped entirely under Save-Data; triggers injected after the pass keep the delegated hover warm; staleness matches the shipped no-TTL hover semantics — the opt-in accepts the wider warm→open window. Content preload deliberately does NOT ride 103 Early Hints: popin responses vary on `X-Requested-With` (a non-XHR GET of a fragment layout gets the iframe-wrap variant and misses the scripts append), and a browser `Link rel=preload` fetch never carries that header — wrong-variant bytes or a double GET, with no success branch; `self.setEarlyHints()` remains the right tool for a popin's STATIC subassets (the CSS/JS it injects via getScript/getStyle). All five are browser-bundled — prod dist rebuild required; verify (2), (3), (4) and (5) with a REAL preemptive-open / preload / redirect-tunnel consumer — a minimal smoke page is falsely green.
|
|
920
920
|
|
|
921
921
|
214. **Per-request routing-clone correctness — narrow the defensive clone, and propagate mutations onto returned clones (consolidates former #194/#195; #B52-residual, 2026-06-18).** The router's per-request `options.conf = JSON.clone(conf)` — a multi-MB deep clone of the ENTIRE bundle config per matched request, held for the request's whole query+render window — was narrowed to: shallow-copy the top level + `conf.content`, deep-clone ONLY `conf.content.routing`, the one subtree actually MUTATED per request (audited: every other per-request write is a whole-subtree REASSIGNMENT a shallow copy isolates, and plugins/connectors/models read config via their own clones, never through the request's) — removing a dev/high-load heap high-water-mark proportional to config size (measured 163→62 MB peak under 150 concurrent slow requests, drains on idle). Rule: clone only the subtrees mutated per request and share the immutable remainder by reference — but audit EVERY per-request writer first, or a missed mutate-into-a-shared-subtree reintroduces cross-request contamination. Sibling: `getRouteByUrl` (server-side redirect/relative-route resolution AND browser-bundled) aliased the shared route config's `param` by REFERENCE while the matcher rewrites `param.{path,namespace,file,title}` in place for `:placeholder` routes — request A's substitution contaminated request B (server) and repeat navigations (client). The fix is TWO coordinated edits, not just "clone the alias": clone `param` per request AND propagate the substituted param onto the returned route object — the function returns a fresh clone of the SINGLETON, so cloning alone returns the un-substituted `:placeholder` and regresses even the first request. Rule: when a matcher both aliases a shared config object and returns a re-clone of that object, isolating the alias is insufficient — propagate the per-request mutations onto the returned clone. The sibling is browser-bundled → prod dist rebuild.
|
|
922
922
|
|
|
@@ -1001,3 +1001,13 @@ Dev-mode query instrumentation captures every database query tied to the current
|
|
|
1001
1001
|
256. **Region locale data (`core/locales`) — standalone per-language files, localized `countryName`, additive `getCountries(code)` projection (#50, 2026-07-18, unreleased).** The region generator (`node src/make --target=region --region=en,fr`; CSV `resources/region.csv` = datahub country-codes, `;`-separated) emits ONE STANDALONE `dist/region/<lang>.json` per requested language: the row accumulator is reset per pass (it used to APPEND each language's rows to the previous output, so every `isoShort` was duplicated with the English copy FIRST and `findOne({isoShort})` always matched English), the requireJSON-cached column mapping is cloned per pass (a mutating pass used to leak into the next language's build — a `fr,en` order lost `officialStateName` for en), and rows without an ISO 3166 alpha-2 code are dropped (2 M49 aggregates with empty `isoShort` AND empty `countryName`; `en.json` 251→249). Non-en passes overlay `countryName` from `resources/region.names.<lang>.json` beside the CSV (French ships with the framework) and FAIL FAST when that file is missing for a requested language — never silently shipping English names under a non-en filename. The names files use PLAIN CLDR territory names: the fr `-alt-short` variants are abbreviations (`É.-U.`, `R.-U.`), not display names, so plain deliberately wins — a knowing style asymmetry with the CSV's own English column, which prefers `-alt-short` (`US`, `UK`). `--outdir=<path>` overrides the target dir; `require.main === module` gates the CLI so the module is require-safe/testable. Controller side: `getCountries(code)` honors its documented projection arg ADDITIVELY — a valid string field (`capital`, `continent`, `tld`) is added to each returned row, the 4 historical fields stay untouched, no-arg output is byte-identical, unknown/dotted codes warn and are ignored — and `getLocales()` on a bundle with no locale set degrades to an empty list instead of throwing. Composition: the per-request negotiated `req.culture` selects which language's region set a request sees through the setOptions locale bridge (#B100 guarded fallback to the bundle default then `en` when the resolved language has no region file), so an `Accept-Language` flip changes `countryName` per request — warm cached routes included (#B84: the cached fast-path re-negotiates). Region files are read ONCE at boot (`core/locales/index.js` loads ALL `dist/region/*.json` onto the gina context) — regenerated data needs a bundle restart; dev hot-reload does not deliver it.
|
|
1002
1002
|
|
|
1003
1003
|
257. **FormValidator #B127/#B128/#B129 (2026-07-19, ride the next cut) — numbered `is` aliases enforce, injected forms resolve their declared rule, `_case_` boolean coercion reads the case value.** (1) Numbered `is` aliases (`is0`, `is1`, … — multiple `is` conditions per field) were NEVER installed: the per-rule function typecheck `continue`d on exactly the undefined state the lazy installer required, silently skipping any `is<N>` key on client AND server. They now install (anchored `/^is\d+$/`) with a DISTINCT error key per alias on BOTH sides (client via the `window._currentValidatorAlias` handshake, server via a Node-`global` alias-root — key parity, both-fail → both keys present; previously the shared server key let a later PASSING alias erase an earlier FAILING alias's error — a silent bypass). ⚠️ Enforcement-tightening: `is<N>` rules that silently skipped START ENFORCING at pickup — sweep rule JSONs for `is<N>` keys before upgrading. Also fixed alongside: the server auto path no longer crashes on a `$`-bearing rule set (`$fields` null-guard), so server-side cross-field `$` conditions work; the `is` grammar remains ONE binary comparison (`=== !== == != < > <= >=`), no `&&` compounds, failing loudly with a warn. (2) `validateFormById(id)` (the popin/injected-form bind path) resolved the rule by FORM ID only — the `data-gina-form-rule` attribute read was unreachable — so a form injected after boot bound `{}` rules and live-check was stamped `"false"` while submit resolved the same attribute fine; the branch is attribute-first now (the id-derived name stays the fallback for attribute-less forms whose id names the rule). Live-check gate precedence: an AUTHOR-set `data-gina-form-live-check-enabled` always wins; the gate decides only when the attribute is absent (rules bound → true, none → false). (3) The cross-field `_case_` scan coerced the WRONG variable (the field being validated instead of the case value): a boolean `case: false` never matched a case field's raw "false" DOM string in single-element/live-check passes, and an outer field valued "true"/"false" clobbered string case matching for its pass. The case value itself now coerces (unconditional, matching the direct-case site's semantics) — declare boolean cases as JSON booleans; `case` values written as the strings "true"/"false" coerce to booleans consistently across sites. Worth knowing: a MATCHING case application replaces that field's rule set in the bound form's rules store persistently for the page, and there are NO standalone `maxLength`/`minLength` engine rules — length constraints are `isString`/`isNumber`/`isInteger` parameters; unknown rule keys are silently skipped.
|
|
1004
|
+
|
|
1005
|
+
258. **CSP useNonce × server cache (#B130, 2026-07-19, rides the next cut) — the bootstrap-script nonce is render-time, and cache hits re-mint.** With `Csp({useNonce:true})` + `server.cache.enable:true`, the framework-injected onGinaLoaded bootstrap `<script>` used to carry a nonce frozen at first compile (baked into the per-view compiled-template cache AND the persisted layout-cache file, which is only re-primed when missing), while the middleware minted a fresh header nonce per request — so header != markup on every later response of a cached route (misses included), breaking enforce-mode CSP. Now: (1) the loader injection is a swig conditional evaluated per execute against `page.cspNonce` (assigned pre-execute on both the compiled-cache-hit and compile branches), so cached compiled templates are nonce-agnostic; (2) stale layout-cache files written by pre-fix builds are normalized in place on the next compile (anchored on the loader's own comment-wrapper idiom + the dev Inspector script openers; idempotent; app-authored tags untouched); (3) output-cache HITS mint fresh per response — both engines' serve paths rewrite the stored CSP header (enforce and report-only) and swap the old nonce values in the stored body (exact-string split/join, base64-safe) without ever mutating the stored entry; the isaac fs read-back buffers instead of streaming only when a re-nonce applies. Verify on a live route: header nonce == every markup nonce AND rotating across responses on miss + hit. Dev/cacheless was never affected (layout re-primed every request).
|
|
1006
|
+
|
|
1007
|
+
259. **Server-side error responses strip stack traces outside local scope — the engine-level throwError sanitizes centrally; the full stack goes to the server log (2026-07-20, rides the next cut).** Two throwError implementations exist: the controller-side one (scope-gated since 0.5.x — it strips the `stack` FIELD outside local scope) and the SERVER-side engine-attached one, whose feeders (router action/middleware catches, server internals) flatten `err.stack` INTO the message string — so non-local 500 bodies used to carry absolute framework paths + stack frames in the JSON `error` field, the inline HTML error fallback, and custom-error page data. The server-side throwError now detects a stack-bearing message (`/\n\s+at\s/`, the V8 frame format) outside local scope, logs the FULL text server-side, and ships only the message line; an object msg has `.stack` logged then stripped off a clone (the caller's object is untouched). Local scope is byte-identical — the dev toolbar reads the stack off the wire. The gate reads the same NODE_SCOPE_IS_LOCAL env var as the controller-side gate (set once at bootstrap), deliberately NOT the config-derived per-bundle scope flag: that flag derives from the project's DEFAULT scope and can lag a boot started with an explicit NODE_SCOPE/--scope. Siblings fixed with it: the JSON render delegate's HTTP/1.1 reason-phrase catch ships `err.message` (a multi-line reason phrase is invalid on the HTTP/1.1 status line — Node rejects the write), and the cached-file stream error path ships message-only. Consumers who relied on wire stacks for service-to-service debugging keep them on LOCAL scope only; everywhere else the server log carries the diagnostic.
|
|
1008
|
+
|
|
1009
|
+
260. **A bundle with a missing or unreadable config/routing.json REFUSES to boot (matching the malformed-JSON path), and the route-lookup not-found error names the bundle + its rule count (2026-07-20, rides the next cut).** Bundle config hydration is readdir-driven: a routing.json absent at boot readdir time was never iterated, so the bundle silently booted with only the framework-synthetic routes (bundle-status, custom-error-page, webroot + the upload endpoints) — every app route 404'd and a sibling bundle's cross-bundle route lookup threw hours later with a message indistinguishable from a mistyped rule; there is no prod re-hydration. The config loader now tracks whether the config-file loop resolved a REAL routing config (bundle dir or shared-config complement; env-versioned `routing.<env>.json` variants ride their base file's iteration, so an env-only file still refuses — it never loaded anyway) and otherwise fails the boot with an error naming the bundle + environment; an EXTERNAL supervisor restart (an orchestrator liveness/restart, a container restart policy such as restart=always, an init system) then retries until the release tree settles, so a mid-deploy race self-heals — gina's own daemon does NOT retry a startup crash: it reports `crashed during startup` once and stops, so a bare `gina bundle:start` deployment is fail-stop until a manual restart. BEHAVIOR CHANGE: a deployment that relied on the silent half-boot must fix its release artifact. The `RoutingHelper::getRouting` not-found throw keeps its historical prefix and appends `(bundle <name> holds N rules)`, so a degraded or near-empty table is tellable from a plain mistyped rule — browser bundle included (dist rebuilt).
|
|
1010
|
+
|
|
1011
|
+
261. **FormValidator autocomplete interception + live-check stale-error clear (#B134/#B135/#B136).** The Safari-autocomplete keydown interception (fields with autocomplete="off" on a live-check form: preventDefault + programmatic value rebuild behind a transient readonly) now (a) bails on modifier chords — e.metaKey/e.ctrlKey returns BEFORE preventDefault so the native select-all/copy/paste/cut/undo defaults run; pre-fix Cmd+A typed the chord letter into the field and keyboard paste was dead (execCommand("paste") is inert in unprivileged web content; the whole chord-case block is commented out, incl. the undo case that wiped input back to defaultValue) — and (b) gates on REAL Safari only (/safari/i && !/chrom(e|ium)/i): every Chromium UA carries the Safari/537.36 token, so the workaround ran on Chrome/Edge/Brave where it was never intended; WebKit-on-iOS browsers (CriOS/FxiOS) stay matched by design. And (c) the live-check whole-form pass, when it turns VALID, now clears every previously-errored field' rendered error in BOTH copies (the input/checkbox/radio processEvent pass and updateSelect') instead of leaving a stale blocking-error paragraph beside the re-enabled submit trigger — the old clear branch was gated on the stored errors map being ALREADY empty and cleared only the touched field; the pass still never renders NEW errors on untouched fields. All three are browser-bundled (dist rebuilt). Tests: validator-autocomplete-interception.test.js + validator-livecheck-stale-error-clear.test.js — extracted-real-bytes execution (brace-walked handler + branch blocks, a real-UA matrix) with red-first dist pins (Closure De-Morgans the chord bail and folds the clear loop into a brace-less for-in, so minified pins target property-name shapes, never var names).
|
|
1012
|
+
|
|
1013
|
+
262. **Merged-process cross-bundle routing clobber (#B137).** In a merged-process project (several bundles sharing ONE port — `isStandalone` stays true and one process serves the project), `Env.getConf`'s merged branch permanently reassigned the TARGET bundle's `content.routing` to the STARTING app's table (a reference assignment surviving for the process lifetime, a 2015 single-table-era fossil). Under per-bundle `rule@bundle` keying the starting app's table cannot hold a sibling's keys, so the FIRST cross-bundle getUrl both inflicted the clobber and failed: every cross-bundle link rendered the literal `404:[<METHOD>]<rule>@<bundle>` marker (the not-found message betrays it — the sibling "holds N rules" where N is the STARTING app's count), and merged-mode inbound statics dispatch (which resolves a statics-prefix-matched sibling's table through the same slot) could match requests against the wrong bundle's table. Fixed by dropping the reassignment: each bundle keeps its own table (the hostname share stays — same host:port in merged mode by definition); the merged view of all bundles' rules lives in the global `envConf.routing`. Distinct-port projects always took the clean branch and were never affected; single-bundle projects saw only a benign self-assign. Server-side only — no browser-bundle rebuild.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gina",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.21",
|
|
4
4
|
"description": "Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nodejs",
|
|
@@ -73,12 +73,12 @@
|
|
|
73
73
|
"gina-container": "bin/gina-container",
|
|
74
74
|
"gina-init": "bin/gina-init"
|
|
75
75
|
},
|
|
76
|
-
"main": "./framework/v0.5.
|
|
76
|
+
"main": "./framework/v0.5.21/core/gna",
|
|
77
77
|
"exports": {
|
|
78
78
|
".": {
|
|
79
79
|
"types": "./types/index.d.ts",
|
|
80
80
|
"import": "./index.mjs",
|
|
81
|
-
"require": "./framework/v0.5.
|
|
81
|
+
"require": "./framework/v0.5.21/core/gna.js"
|
|
82
82
|
},
|
|
83
83
|
"./gna": {
|
|
84
84
|
"types": "./types/gna.d.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.5.20
|