gina 0.5.3 → 0.5.4
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 +24 -0
- package/README.md +11 -9
- package/ROADMAP.md +1 -0
- package/framework/v0.5.4/VERSION +1 -0
- package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +40 -1
- package/framework/v0.5.4/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- package/framework/v0.5.4/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +180 -100
- package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/js/gina.js +91 -15
- package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +216 -215
- package/framework/v0.5.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.5.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.js +26 -0
- package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.render-swig.js +15 -7
- package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/validator/src/form-validator.js +73 -13
- package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/validator/src/main.js +6 -1
- package/framework/{v0.5.3 → v0.5.4}/core/router.js +15 -2
- package/framework/{v0.5.3 → v0.5.4}/core/server.isaac.js +2 -38
- package/framework/{v0.5.3 → v0.5.4}/core/server.js +195 -30
- package/framework/{v0.5.3 → v0.5.4}/core/template/conf/settings.json +1 -1
- package/framework/v0.5.4/lib/admin/package.json +17 -0
- package/framework/v0.5.4/lib/admin/src/main.js +93 -0
- package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/add.js +38 -2
- package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/arguments.json +1 -0
- package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/help.txt +15 -1
- package/framework/{v0.5.3 → v0.5.4}/lib/index.js +27 -5
- package/framework/{v0.5.3 → v0.5.4}/lib/routing/src/main.js +12 -1
- package/framework/{v0.5.3 → v0.5.4}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +27 -1
- package/package.json +4 -4
- package/framework/v0.5.3/VERSION +0 -1
- package/framework/v0.5.3/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- package/framework/v0.5.3/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- package/framework/v0.5.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.5.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/AUTHORS +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/LICENSE +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/html/static.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/config.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/content.encoding +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/dev/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/gna.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/locales/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/locales/currency.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/locales/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/mime.types +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/model/entity.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/model/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/model/template/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/server.express.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/status.codes +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/_gitignore +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/conf/env.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/conf/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/console.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/context.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/data/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/data/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/json/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/json/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/path.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/prototypes.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/task.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/helpers/text.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/archiver/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/archiver/build.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/archiver/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/async/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/async/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cache/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cache/build.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cache/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/collection/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/collection/build.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/collection/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/config.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cron/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cron/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/domain/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/domain/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/generator/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/i18n/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/inherits/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/inherits/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/instrument/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/job/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/job/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/math/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/merge/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/merge/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/metrics/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/model.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/proc.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/routing/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/routing/build.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/routing/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/secrets/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/session-store.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/shell.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/state.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/url/README.md +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/url/index.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/url/routing.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/uuid/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/validator.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/watcher/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.5.3 → v0.5.4}/lib/ws-session/src/main.js +0 -0
|
@@ -4023,6 +4023,20 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4023
4023
|
let httpStatus = null; // captured from the HTTP/2 HEADERS frame (:status pseudo-header)
|
|
4024
4024
|
const chunks = []; // collect Buffer chunks — avoids peak-memory doubling from string concat
|
|
4025
4025
|
|
|
4026
|
+
// #B52 — release the settled outbound stream so the cached HTTP/2 session stops
|
|
4027
|
+
// retaining it (and, through the per-request controller it captures, the large
|
|
4028
|
+
// per-request `options.conf` clone made in router.js). Idempotent; invoked at every
|
|
4029
|
+
// NON-retry terminal below (retry paths client.destroy() the session, which tears the
|
|
4030
|
+
// old stream down). Never throws — cleanup must not break the response path.
|
|
4031
|
+
var _finalized = false;
|
|
4032
|
+
var _finalizeStream = function _finalizeStream() {
|
|
4033
|
+
if (_finalized) { return; }
|
|
4034
|
+
_finalized = true;
|
|
4035
|
+
try { req.setTimeout(0); } catch (e) {}
|
|
4036
|
+
try { req.removeAllListeners(); } catch (e) {}
|
|
4037
|
+
try { if (!req.closed && !req.destroyed) { req.close(); } } catch (e) {}
|
|
4038
|
+
};
|
|
4039
|
+
|
|
4026
4040
|
// Capture the HTTP/2 response status code from the HEADERS frame.
|
|
4027
4041
|
// Without this, the :status pseudo-header is never read and nginx-level errors
|
|
4028
4042
|
// (e.g. 502 Bad Gateway) are indistinguishable from JSON parse failures.
|
|
@@ -4059,6 +4073,8 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4059
4073
|
// All retries exhausted — surface the error (H4: typed GinaHttp2Error)
|
|
4060
4074
|
var _timeoutMsg = '[HTTP2] No response from '+ options[':authority'] +' after '+ (_streamTimeout > 1000 ? (_streamTimeout / 1000) + 's' : _streamTimeout + 'ms') +' (exhausted '+ HTTP2_MAX_RETRIES +' retries)';
|
|
4061
4075
|
var _timeoutErr = new GinaHttp2Error(_timeoutMsg, { code: 'TIMEOUT', retryable: false, status: 503, retryCount: retryCount });
|
|
4076
|
+
// #B52 — release the settled stream (covers both the swallow-return and the callback below)
|
|
4077
|
+
_finalizeStream();
|
|
4062
4078
|
// H3: if non-critical, swallow and return
|
|
4063
4079
|
if (_swallowIfNonCritical(_timeoutErr)) return;
|
|
4064
4080
|
if (typeof callback === 'function') {
|
|
@@ -4143,6 +4159,8 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4143
4159
|
_ginaErr.cause = error; // preserve original Node error (stack, syscall, etc.)
|
|
4144
4160
|
if (isConnError && error.accessPoint) { _ginaErr.accessPoint = error.accessPoint; }
|
|
4145
4161
|
|
|
4162
|
+
// #B52 — release the settled stream (covers both the swallow-return and the callback below)
|
|
4163
|
+
_finalizeStream();
|
|
4146
4164
|
// H3: if non-critical, swallow and return
|
|
4147
4165
|
if (_swallowIfNonCritical(_ginaErr)) return;
|
|
4148
4166
|
if (typeof callback !== 'undefined') {
|
|
@@ -4188,6 +4206,8 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4188
4206
|
status : 503,
|
|
4189
4207
|
retryCount : retryCount
|
|
4190
4208
|
});
|
|
4209
|
+
// #B52 — release the settled stream (covers both the swallow-return and the callback below)
|
|
4210
|
+
_finalizeStream();
|
|
4191
4211
|
// H3: if non-critical, swallow and return
|
|
4192
4212
|
if (_swallowIfNonCritical(prematureCloseErr)) return;
|
|
4193
4213
|
if (typeof callback !== 'undefined') {
|
|
@@ -4247,6 +4267,8 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4247
4267
|
status : 502,
|
|
4248
4268
|
retryCount : retryCount
|
|
4249
4269
|
});
|
|
4270
|
+
// #B52 — release the settled stream (covers both the swallow-return and the callback below)
|
|
4271
|
+
_finalizeStream();
|
|
4250
4272
|
// H3: if non-critical, swallow and return
|
|
4251
4273
|
if (_swallowIfNonCritical(_badGatewayErr)) return;
|
|
4252
4274
|
if (typeof callback !== 'undefined') {
|
|
@@ -4257,6 +4279,10 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4257
4279
|
return;
|
|
4258
4280
|
}
|
|
4259
4281
|
|
|
4282
|
+
// #B52 — release the settled stream before the remaining onEnd terminals
|
|
4283
|
+
// (ALPN-mismatch, 5xx callback, throwError, success callback, EventEmitter-mode)
|
|
4284
|
+
_finalizeStream();
|
|
4285
|
+
|
|
4260
4286
|
// 3. Exception filter for ALPN or protocol mismatches
|
|
4261
4287
|
if (typeof data === 'string' && /^Unknown ALPN Protocol/.test(data)) {
|
|
4262
4288
|
const err = { status: 500, error: new Error(data) };
|
|
@@ -12,10 +12,11 @@ var emitInspectorWindowData = require('./inspector-window-emit');
|
|
|
12
12
|
// Precompiled regex — avoids per-request RegExp allocation (#P3)
|
|
13
13
|
var blacklistRe = /[<>]/g;
|
|
14
14
|
|
|
15
|
-
// Inherited from controller
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
// Inherited from controller.
|
|
16
|
+
// #INS10 race fix: `self` / `local` are NOT declared module-scoped — they are
|
|
17
|
+
// captured FUNCTION-scoped inside render() (see the deps unpack) so concurrent
|
|
18
|
+
// renders never share them. The refs below stay module-scoped (read pre-await).
|
|
19
|
+
var getData = null
|
|
19
20
|
, hasViews = null
|
|
20
21
|
, setResources = null
|
|
21
22
|
// Default filters
|
|
@@ -160,9 +161,16 @@ async function writeCache(bundle, opt, htmlContent, req, res) {
|
|
|
160
161
|
*/
|
|
161
162
|
module.exports = async function render(userData, displayInspector, errOptions, deps) {
|
|
162
163
|
|
|
163
|
-
// Inherited from controller
|
|
164
|
-
self
|
|
165
|
-
|
|
164
|
+
// Inherited from controller.
|
|
165
|
+
// #INS10 race fix — `self` / `local` are FUNCTION-scoped (`var`), not module-
|
|
166
|
+
// scoped: render() is async, so a render suspended at an await must not have
|
|
167
|
+
// its `self` / `local` overwritten by a concurrent render — otherwise the
|
|
168
|
+
// post-await Inspector emit (prod-window egress + dev `inspector#data`) would
|
|
169
|
+
// carry the other request's `_queryLog` / `_timeline`. Mirrors render-nunjucks.js.
|
|
170
|
+
// (getData / hasViews / SwigFilters / headersSent stay module-scoped: read
|
|
171
|
+
// before the first await, so they are not the documented race vector.)
|
|
172
|
+
var self = deps.self;
|
|
173
|
+
var local = deps.local;
|
|
166
174
|
getData = deps.getData;
|
|
167
175
|
hasViews = deps.hasViews;
|
|
168
176
|
setResources = deps.setResources;
|
|
@@ -1504,8 +1504,23 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
|
|
|
1504
1504
|
}
|
|
1505
1505
|
|
|
1506
1506
|
// test if val is strictly a float
|
|
1507
|
-
|
|
1508
|
-
|
|
1507
|
+
// #B46 (2026-06-15) — accept STRING floats, not only real JS numbers.
|
|
1508
|
+
// The old gate `Number(val) === val` is true only for a real number,
|
|
1509
|
+
// so a string "1.5" (browser .value and urlencoded bodies are ALWAYS
|
|
1510
|
+
// strings) was rejected server-side. Coerce to Number first, then
|
|
1511
|
+
// require a finite value with a fractional part. Whole numbers ("2", 2)
|
|
1512
|
+
// still fail (no fractional part), preserving isFloat's contract that
|
|
1513
|
+
// an integer is not a float.
|
|
1514
|
+
// was:
|
|
1515
|
+
// if ( Number(val) === val && val % 1 !== 0 ) {
|
|
1516
|
+
// this.value = local.data[this.name] = Number(val);
|
|
1517
|
+
// isValid = true
|
|
1518
|
+
// } else {
|
|
1519
|
+
// isValid = false
|
|
1520
|
+
// }
|
|
1521
|
+
var floatVal = Number(val);
|
|
1522
|
+
if ( Number.isFinite(floatVal) && floatVal % 1 !== 0 ) {
|
|
1523
|
+
this.value = local.data[this.name] = floatVal;
|
|
1509
1524
|
isValid = true
|
|
1510
1525
|
} else {
|
|
1511
1526
|
isValid = false
|
|
@@ -1686,7 +1701,7 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
|
|
|
1686
1701
|
*
|
|
1687
1702
|
* @param {string|boolean} [mask] - by default "yyyy-mm-dd"
|
|
1688
1703
|
*
|
|
1689
|
-
* @returns {
|
|
1704
|
+
* @returns {object} field object (chainable). The parsed Date is preserved on the field's `.value` and rendered via the field's own `.format()` method (DateFormatHelper — an adaptation of Steven Levithan's code).
|
|
1690
1705
|
* */
|
|
1691
1706
|
self[el]['isDate'] = function(mask) {
|
|
1692
1707
|
var val = this.value
|
|
@@ -1727,22 +1742,60 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
|
|
|
1727
1742
|
throw new Error('[FormValidator::isDate] Provided mask not allowed: `'+ mask +'`');
|
|
1728
1743
|
}
|
|
1729
1744
|
|
|
1745
|
+
// #B47 (2026-06-15) — build the Date from explicit numeric
|
|
1746
|
+
// components identified by the mask tokens (y*/m*/d*), then
|
|
1747
|
+
// range-check via a round-trip. The old path rebuilt the string
|
|
1748
|
+
// FROM THE MASK (keeping its separators) and handed it to
|
|
1749
|
+
// `new Date(str)`, which parses a slash mask (e.g. "15/06/2023")
|
|
1750
|
+
// as US MM/DD -> month 15 -> Invalid Date, so any non-ISO mask
|
|
1751
|
+
// with day>12 (or non-US field order) was wrongly rejected. A
|
|
1752
|
+
// naive `new Date(y, m-1, d)` is not enough either: JS rolls
|
|
1753
|
+
// invalid components over (new Date(2023,12,45) is a valid date),
|
|
1754
|
+
// so the round-trip check (constructed components must equal the
|
|
1755
|
+
// inputs) is what still rejects e.g. 2023-13-45 and 2023-02-30.
|
|
1756
|
+
// was:
|
|
1757
|
+
// try {
|
|
1758
|
+
// val = val.match(/[^\/\- ]+/g);
|
|
1759
|
+
// var dic = {}, d, len;
|
|
1760
|
+
// for (d=0, len=m.length; d<len; ++d) { dic[m[d]] = val[d] }
|
|
1761
|
+
// var formatedDate = mask;
|
|
1762
|
+
// for (var v in dic) { formatedDate = formatedDate.replace(new RegExp(v, "g"), dic[v]) }
|
|
1763
|
+
// } catch (err) { throw new Error('...Provided value not allowed...'); }
|
|
1764
|
+
// date = this.value = local.data[this.name] = new Date(formatedDate);
|
|
1765
|
+
var dic = {}, d, len, parts = null,
|
|
1766
|
+
yNum = NaN, moNum = NaN, dNum = NaN;
|
|
1730
1767
|
try {
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
dic[m[d]] = val[d]
|
|
1735
|
-
}
|
|
1736
|
-
var formatedDate = mask;
|
|
1737
|
-
for (var v in dic) {
|
|
1738
|
-
formatedDate = formatedDate.replace(new RegExp(v, "g"), dic[v])
|
|
1768
|
+
parts = val.match(/[^\/\- ]+/g);
|
|
1769
|
+
for (d = 0, len = m.length; d < len; ++d) {
|
|
1770
|
+
dic[m[d]] = parts[d];
|
|
1739
1771
|
}
|
|
1740
1772
|
} catch (err) {
|
|
1741
1773
|
throw new Error('[FormValidator::isDate] Provided value not allowed: `'+ val +'`' + err);
|
|
1742
1774
|
}
|
|
1743
1775
|
|
|
1776
|
+
for (var tok in dic) {
|
|
1777
|
+
if ( /y/i.test(tok) ) { yNum = parseInt(dic[tok], 10); }
|
|
1778
|
+
else if ( /m/i.test(tok) ) { moNum = parseInt(dic[tok], 10); }
|
|
1779
|
+
else if ( /d/i.test(tok) ) { dNum = parseInt(dic[tok], 10); }
|
|
1780
|
+
}
|
|
1744
1781
|
|
|
1745
|
-
|
|
1782
|
+
if (
|
|
1783
|
+
!Number.isFinite(yNum) || !Number.isFinite(moNum) || !Number.isFinite(dNum)
|
|
1784
|
+
|| moNum < 1 || moNum > 12 || dNum < 1 || dNum > 31
|
|
1785
|
+
) {
|
|
1786
|
+
date = this.value = local.data[this.name] = new Date(NaN);
|
|
1787
|
+
} else {
|
|
1788
|
+
date = new Date(yNum, moNum - 1, dNum);
|
|
1789
|
+
// reject rolled-over components (e.g. Feb 30 -> Mar 2)
|
|
1790
|
+
if (
|
|
1791
|
+
date.getFullYear() !== yNum
|
|
1792
|
+
|| date.getMonth() !== (moNum - 1)
|
|
1793
|
+
|| date.getDate() !== dNum
|
|
1794
|
+
) {
|
|
1795
|
+
date = new Date(NaN);
|
|
1796
|
+
}
|
|
1797
|
+
this.value = local.data[this.name] = date;
|
|
1798
|
+
}
|
|
1746
1799
|
|
|
1747
1800
|
if ( /Invalid Date/i.test(date) || date instanceof Date === false ) {
|
|
1748
1801
|
if ( !errors['isRequired'] && this.value == '' ) {
|
|
@@ -1762,7 +1815,14 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet) {
|
|
|
1762
1815
|
|
|
1763
1816
|
this.valid = isValid;
|
|
1764
1817
|
|
|
1765
|
-
return
|
|
1818
|
+
// #B48 (2026-06-17) — return the field object (chainable), like
|
|
1819
|
+
// every other rule, instead of the raw parsed Date. The Date is
|
|
1820
|
+
// preserved on this.value (set above), so
|
|
1821
|
+
// `field.isDate(mask).format('isoDateTime')` still renders it via
|
|
1822
|
+
// the field's own `format` method; returning the Date here broke
|
|
1823
|
+
// chaining into any validator rule (a Date has no .isX()).
|
|
1824
|
+
// was: return date
|
|
1825
|
+
return self[this.name]
|
|
1766
1826
|
}
|
|
1767
1827
|
|
|
1768
1828
|
/**
|
|
@@ -886,7 +886,12 @@ function ValidatorPlugin(rules, data, formId) {
|
|
|
886
886
|
|
|
887
887
|
$divs[d].parentElement.removeChild($divs[d]);
|
|
888
888
|
$err = document.createElement('div');
|
|
889
|
-
|
|
889
|
+
// #livecheck — a field being typed in (the active element) surfaces only the
|
|
890
|
+
// soft form-item-warning border; its committed error message stays hidden until
|
|
891
|
+
// blur. This "refresh" re-create runs AFTER refreshWarning in the live-check
|
|
892
|
+
// global pass, so without this focus guard it re-shows the message mid-typing.
|
|
893
|
+
// On blur (field no longer active) the message is created shown (focusout commits).
|
|
894
|
+
$err.setAttribute('class', ( document.activeElement && document.activeElement.name == name ) ? 'form-item-error-message hidden' : 'form-item-error-message');
|
|
890
895
|
|
|
891
896
|
// #A11Y1 (slice 2) — preserve the aria-errormessage wire we own across refresh.
|
|
892
897
|
if ( _ginaOwnsErrMsg && _ariaErrId ) {
|
|
@@ -533,8 +533,21 @@ function Router(env, scope) {
|
|
|
533
533
|
options = merge(JSON.clone(options), params);
|
|
534
534
|
// options = merge(options, params);
|
|
535
535
|
|
|
536
|
-
// We want to keep original conf untouched
|
|
537
|
-
|
|
536
|
+
// We want to keep original conf untouched.
|
|
537
|
+
// #B52-residual: deep-cloning the WHOLE bundle conf on every matched request is a
|
|
538
|
+
// multi-MB per-request allocation (templates / server config / app assets / fonts) that
|
|
539
|
+
// accumulates under concurrency into a heap high-water-mark. Only conf.content.routing is
|
|
540
|
+
// mutated through this clone (the [rule].param write below) — every other subtree is
|
|
541
|
+
// read-only on the per-request path (setOptions reassigns conf.routing/reverseRouting/
|
|
542
|
+
// forms/locales/locale wholesale, which the shallow top-level copy already isolates; and
|
|
543
|
+
// plugins/connectors/model read config via their own getConfig clone or the global
|
|
544
|
+
// singleton, never through this object). So shallow-copy the top level + conf.content and
|
|
545
|
+
// deep-clone only conf.content.routing; the large immutable remainder is shared by
|
|
546
|
+
// reference at no per-request heap cost.
|
|
547
|
+
// options.conf = JSON.clone(conf); // pre-#B52-residual: whole-conf deep clone per request
|
|
548
|
+
options.conf = Object.assign({}, conf);
|
|
549
|
+
options.conf.content = Object.assign({}, conf.content);
|
|
550
|
+
options.conf.content.routing = JSON.clone(conf.content.routing);
|
|
538
551
|
// inheriting from _common
|
|
539
552
|
if (
|
|
540
553
|
options.template
|
|
@@ -42,42 +42,6 @@ const env = process.env.NODE_ENV
|
|
|
42
42
|
, isProductionScope = process.env.NODE_SCOPE_IS_PRODUCTION && process.env.NODE_SCOPE_IS_PRODUCTION.toLowerCase() === 'true'
|
|
43
43
|
;
|
|
44
44
|
|
|
45
|
-
/**
|
|
46
|
-
* IP-allowlist check for admin-grade /_gina/* endpoints (/_gina/info,
|
|
47
|
-
* /_gina/cache/stats). #S7.
|
|
48
|
-
*
|
|
49
|
-
* Reads the allowlist from `process.gina._adminAllowList`, which `gna.js`
|
|
50
|
-
* populates at bundle init from `app.json` `admin.allowFrom` (defaults to
|
|
51
|
-
* loopback `['127.0.0.1', '::1']`). Same shape as `lib.metrics.isClientAllowed`
|
|
52
|
-
* but on a separate axis — admin endpoints expose process state (memory,
|
|
53
|
-
* uptime, HTTP/2 session counters, cache contents) and are gated separately
|
|
54
|
-
* from Prometheus scrapes.
|
|
55
|
-
*
|
|
56
|
-
* Reads the client IP from `req.socket.remoteAddress` only — never trusts
|
|
57
|
-
* `X-Forwarded-For` because reverse proxies could spoof it. Normalises
|
|
58
|
-
* `::ffff:IPv4` (IPv6-mapped IPv4) → `IPv4` so listing `127.0.0.1` matches
|
|
59
|
-
* both forms.
|
|
60
|
-
*
|
|
61
|
-
* Empty allowlist (`[]`) denies everyone — explicit lockdown choice.
|
|
62
|
-
* Missing `process.gina._adminAllowList` (init not yet fired) falls back
|
|
63
|
-
* to loopback-only, the safest default.
|
|
64
|
-
*
|
|
65
|
-
* @inner
|
|
66
|
-
* @param {http.IncomingMessage|http2.Http2ServerRequest} req
|
|
67
|
-
* @returns {boolean} true if client IP is allowed, false otherwise
|
|
68
|
-
*/
|
|
69
|
-
function isAdminClientAllowed(req) {
|
|
70
|
-
var list = (typeof process.gina === 'object' && process.gina && Array.isArray(process.gina._adminAllowList))
|
|
71
|
-
? process.gina._adminAllowList
|
|
72
|
-
: ['127.0.0.1', '::1'];
|
|
73
|
-
if (list.length === 0) return false;
|
|
74
|
-
var ip = (req.socket && req.socket.remoteAddress)
|
|
75
|
-
|| (req.connection && req.connection.remoteAddress)
|
|
76
|
-
|| '';
|
|
77
|
-
if (ip.indexOf('::ffff:') === 0) ip = ip.slice(7);
|
|
78
|
-
return list.indexOf(ip) >= 0;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
45
|
/**
|
|
82
46
|
* Constant-time API-key check for the /_gina/agent SSE endpoint when it is
|
|
83
47
|
* exposed outside dev mode (#INS9b). The configured key lives on
|
|
@@ -1007,7 +971,7 @@ function ServerEngineClass(options) {
|
|
|
1007
971
|
|
|
1008
972
|
// #S7 — IP allowlist gate. Mirrors the metrics endpoint
|
|
1009
973
|
// gate at L605-621. 403 on deny.
|
|
1010
|
-
if ( !
|
|
974
|
+
if ( !lib.admin.isClientAllowed(request) ) {
|
|
1011
975
|
var infoForbiddenBody = JSON.stringify({ error: 'forbidden', message: '/_gina/info: client IP not in app.json admin.allowFrom' });
|
|
1012
976
|
var infoForbiddenHeaders = _setPoweredByHeader({
|
|
1013
977
|
'cache-control': 'no-cache, no-store, must-revalidate',
|
|
@@ -1067,7 +1031,7 @@ function ServerEngineClass(options) {
|
|
|
1067
1031
|
if ( request.method.toUpperCase() === 'GET' && /\/_gina\/cache\/stats$/i.test(request.url) ) {
|
|
1068
1032
|
|
|
1069
1033
|
// #S7 — IP allowlist gate. Same shape as the /_gina/info gate above.
|
|
1070
|
-
if ( !
|
|
1034
|
+
if ( !lib.admin.isClientAllowed(request) ) {
|
|
1071
1035
|
var cacheStatsForbiddenBody = JSON.stringify({ error: 'forbidden', message: '/_gina/cache/stats: client IP not in app.json admin.allowFrom' });
|
|
1072
1036
|
var cacheStatsForbiddenHeaders = _setPoweredByHeader({
|
|
1073
1037
|
'cache-control': 'no-cache, no-store, must-revalidate',
|
|
@@ -2910,6 +2910,64 @@ function Server(options) {
|
|
|
2910
2910
|
});
|
|
2911
2911
|
}
|
|
2912
2912
|
|
|
2913
|
+
// ── /_gina/info — process/runtime state (always-on, admin-gated) ─────────
|
|
2914
|
+
// (#S7) Engine-agnostic mirror of the Isaac handler. GET only. The IP
|
|
2915
|
+
// allowlist comes from app.json `admin.allowFrom` (default loopback) via
|
|
2916
|
+
// process.gina._adminAllowList; 403 JSON on deny. The `http2` block is
|
|
2917
|
+
// Isaac-only (the Express engine has no HTTP/2 session metrics —
|
|
2918
|
+
// _h2Metrics is undefined here), so it degrades to omitted under Express.
|
|
2919
|
+
if (
|
|
2920
|
+
request.method.toUpperCase() === 'GET'
|
|
2921
|
+
&& /\/_gina\/info$/i.test(request.url)
|
|
2922
|
+
) {
|
|
2923
|
+
response.setHeader('content-type', 'application/json; charset=utf8');
|
|
2924
|
+
response.setHeader('cache-control', 'no-cache, no-store, must-revalidate');
|
|
2925
|
+
response.setHeader('pragma', 'no-cache');
|
|
2926
|
+
response.setHeader('expires', '0');
|
|
2927
|
+
if ( !lib.admin.isClientAllowed(request) ) {
|
|
2928
|
+
response.statusCode = 403;
|
|
2929
|
+
return response.end(JSON.stringify({ error: 'forbidden', message: '/_gina/info: client IP not in app.json admin.allowFrom' }));
|
|
2930
|
+
}
|
|
2931
|
+
var infoPayload = {
|
|
2932
|
+
"cache-is-enabled": self.instance._cacheIsEnabled,
|
|
2933
|
+
"memory" : process.memoryUsage(),
|
|
2934
|
+
"uptime" : process.uptime(),
|
|
2935
|
+
"version" : process.version
|
|
2936
|
+
};
|
|
2937
|
+
if (self.instance._h2Metrics) {
|
|
2938
|
+
infoPayload["http2"] = {
|
|
2939
|
+
activeSessions : self.instance._h2Metrics.activeSessions,
|
|
2940
|
+
totalStreams : self.instance._h2Metrics.totalStreams,
|
|
2941
|
+
goawayCount : self.instance._h2Metrics.goawayCount,
|
|
2942
|
+
rstCount : self.instance._h2Metrics.rstCount,
|
|
2943
|
+
rapidResetBlocked : self.instance._h2Metrics.rapidResetBlocked,
|
|
2944
|
+
extendedConnect : self.instance._h2Metrics.extendedConnect
|
|
2945
|
+
};
|
|
2946
|
+
}
|
|
2947
|
+
return response.end(JSON.stringify(infoPayload));
|
|
2948
|
+
}
|
|
2949
|
+
|
|
2950
|
+
// ── /_gina/cache/stats — cache statistics (always-on, admin-gated) ───────
|
|
2951
|
+
// (#S7) Engine-agnostic mirror of the Isaac handler. GET only. Same admin
|
|
2952
|
+
// IP allowlist as /_gina/info. Builds a Cache view over the shared
|
|
2953
|
+
// self.instance._cached Map and returns its stats(); 403 JSON on deny.
|
|
2954
|
+
if (
|
|
2955
|
+
request.method.toUpperCase() === 'GET'
|
|
2956
|
+
&& /\/_gina\/cache\/stats$/i.test(request.url)
|
|
2957
|
+
) {
|
|
2958
|
+
response.setHeader('content-type', 'application/json; charset=utf8');
|
|
2959
|
+
response.setHeader('cache-control', 'no-cache, no-store, must-revalidate');
|
|
2960
|
+
response.setHeader('pragma', 'no-cache');
|
|
2961
|
+
response.setHeader('expires', '0');
|
|
2962
|
+
if ( !lib.admin.isClientAllowed(request) ) {
|
|
2963
|
+
response.statusCode = 403;
|
|
2964
|
+
return response.end(JSON.stringify({ error: 'forbidden', message: '/_gina/cache/stats: client IP not in app.json admin.allowFrom' }));
|
|
2965
|
+
}
|
|
2966
|
+
var _cacheStatsView = new lib.Cache();
|
|
2967
|
+
_cacheStatsView.from(self.instance._cached);
|
|
2968
|
+
return response.end(JSON.stringify(_cacheStatsView.stats()));
|
|
2969
|
+
}
|
|
2970
|
+
|
|
2913
2971
|
// ── /_gina/jobs/:id — async-job status (always-on, state-only) ──────────
|
|
2914
2972
|
// (#AI6 slice 3) Engine-agnostic mirror of the Isaac handler. GET only.
|
|
2915
2973
|
// Returns lib.job.toStatusView (id + state + timestamps) — never the
|
|
@@ -3386,8 +3444,36 @@ function Server(options) {
|
|
|
3386
3444
|
// -> https://github.com/mscdex/busboy
|
|
3387
3445
|
var opt = self.conf[self.appName][self.env].content.settings.upload;
|
|
3388
3446
|
// checking size
|
|
3389
|
-
|
|
3390
|
-
var
|
|
3447
|
+
// #B51 (2026-06-16) — parse the maxFieldsSize unit suffix into bytes.
|
|
3448
|
+
// was: var maxSize = parseInt(opt.maxFieldsSize);
|
|
3449
|
+
// var fileSize = request.headers["content-length"]/1024/1024; //MB
|
|
3450
|
+
// parseInt("512K") => 512, compared against content-length/1024/1024 (MB), so
|
|
3451
|
+
// "512K" silently meant 512 MB. parseSize reads B/KB/MB/GB (case-insensitive)
|
|
3452
|
+
// into bytes; a BARE number is treated as MB for back-compat (the shipped "2MB"
|
|
3453
|
+
// => 2*1024*1024, unchanged). content-length is then compared in bytes directly.
|
|
3454
|
+
var parseSize = function(value) {
|
|
3455
|
+
if ( typeof(value) == 'number' ) { return value * 1024 * 1024; } // bare number = MB
|
|
3456
|
+
if ( typeof(value) != 'string' ) { return NaN; }
|
|
3457
|
+
var m = value.trim().match(/^([0-9]*\.?[0-9]+)\s*(b|kb|k|mb|m|gb|g)?$/i);
|
|
3458
|
+
if ( !m ) { return NaN; }
|
|
3459
|
+
var n = parseFloat(m[1]);
|
|
3460
|
+
switch ( (m[2] || 'mb').toLowerCase() ) {
|
|
3461
|
+
case 'b':
|
|
3462
|
+
return n;
|
|
3463
|
+
case 'k':
|
|
3464
|
+
case 'kb':
|
|
3465
|
+
return n * 1024;
|
|
3466
|
+
case 'g':
|
|
3467
|
+
case 'gb':
|
|
3468
|
+
return n * 1024 * 1024 * 1024;
|
|
3469
|
+
case 'm':
|
|
3470
|
+
case 'mb':
|
|
3471
|
+
default:
|
|
3472
|
+
return n * 1024 * 1024;
|
|
3473
|
+
}
|
|
3474
|
+
};
|
|
3475
|
+
var maxSize = parseSize(opt.maxFieldsSize); // bytes
|
|
3476
|
+
var fileSize = parseInt(request.headers["content-length"], 10); // bytes
|
|
3391
3477
|
var hasAutoTmpCleanupTimeout = (
|
|
3392
3478
|
typeof(opt.autoTmpCleanupTimeout) != 'undefined'
|
|
3393
3479
|
&& opt.autoTmpCleanupTimeout != ''
|
|
@@ -3396,11 +3482,23 @@ function Server(options) {
|
|
|
3396
3482
|
) ? true : false;
|
|
3397
3483
|
var autoTmpCleanupTimeout = (!hasAutoTmpCleanupTimeout) ? null : parseTimeout(opt.autoTmpCleanupTimeout);
|
|
3398
3484
|
|
|
3399
|
-
|
|
3485
|
+
// #B51 — guard on maxSize so an unset / 0 / invalid maxFieldsSize disables the
|
|
3486
|
+
// cap (was: `fileSize > maxSize` with maxSize=NaN naturally skipped; maxSize=0
|
|
3487
|
+
// would have rejected everything — 0 now means "no limit", as for maxFields).
|
|
3488
|
+
if (maxSize && fileSize > maxSize) {
|
|
3400
3489
|
return throwError(response, 431, 'Attachment exceeded maximum file size [ '+ opt.maxFieldsSize +' ]');
|
|
3401
3490
|
}
|
|
3402
3491
|
|
|
3403
|
-
|
|
3492
|
+
// #B49 (2026-06-16) — honour the configured upload directory.
|
|
3493
|
+
// was: var uploadDir = opt.uploadDir || os.tmpdir();
|
|
3494
|
+
// The old line read only `opt.uploadDir`, a key the shipped settings.json
|
|
3495
|
+
// never sets (it defines `upload.tmpPath`, and nothing maps tmpPath→uploadDir),
|
|
3496
|
+
// so every upload fell back to os.tmpdir() and the documented `upload.tmpPath`
|
|
3497
|
+
// / per-group `path` keys were dead. `tmpPath` resolves to an absolute dir at
|
|
3498
|
+
// config-load (via whisper → <project>/tmp, created at boot), so prefer it;
|
|
3499
|
+
// `uploadDir` is kept first for back-compat (any operator who set it). A
|
|
3500
|
+
// per-group `path` overrides this global default at the write site below.
|
|
3501
|
+
var uploadDir = opt.uploadDir || opt.tmpPath || os.tmpdir();
|
|
3404
3502
|
|
|
3405
3503
|
/**
|
|
3406
3504
|
* str2ab
|
|
@@ -3504,43 +3602,108 @@ function Server(options) {
|
|
|
3504
3602
|
file._dataLen = 0;
|
|
3505
3603
|
++fileCount;
|
|
3506
3604
|
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
)
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
if ( !Array.isArray(ext) ) {
|
|
3519
|
-
ext = [ext]
|
|
3520
|
-
}
|
|
3605
|
+
// #B51 (2026-06-16) — enforce the global maxFields file-count cap. It was
|
|
3606
|
+
// declared in settings.json (default 1000) but read NOWHERE — the only count
|
|
3607
|
+
// limit was the binary per-group isMultipleAllowed, so an isMultipleAllowed:true
|
|
3608
|
+
// group (the shipped untagged default) accepted UNBOUNDED files. parseInt reads
|
|
3609
|
+
// the number or a string; an unset / 0 / NaN value disables the cap. Global only
|
|
3610
|
+
// (per-group maxFields is not wired, like per-group maxFieldsSize).
|
|
3611
|
+
var maxFields = parseInt(opt.maxFields, 10);
|
|
3612
|
+
if ( maxFields && fileCount > maxFields ) {
|
|
3613
|
+
throwError(response, 400, 'too many upload fields (max '+ maxFields +'). See the `upload.maxFields` definition in settings.json.');
|
|
3614
|
+
return false;
|
|
3615
|
+
}
|
|
3521
3616
|
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3617
|
+
// #B50 (2026-06-16) — every uploaded file must map to a CONFIGURED upload group.
|
|
3618
|
+
// The old gate (commented below) ran the ext + count checks ONLY for a group that was
|
|
3619
|
+
// defined, NOT `untagged`, AND present in opt.groups; every other case — no group,
|
|
3620
|
+
// `untagged`, or an unknown group name — streamed through UNCHECKED, so a client could
|
|
3621
|
+
// bypass a group's allow-list simply by tagging a file with any unconfigured group.
|
|
3622
|
+
// Now: a file with no group falls back to the default `untagged`; a group not declared
|
|
3623
|
+
// in settings.json `upload.groups` is rejected (400); and `untagged` is no longer
|
|
3624
|
+
// hardcode-exempt — it obeys its own allowedExtensions / isMultipleAllowed like any
|
|
3625
|
+
// other group (the shipped default is `*` + isMultipleAllowed:true, so single- and
|
|
3626
|
+
// multi-file untagged uploads are unaffected).
|
|
3627
|
+
//
|
|
3628
|
+
// if (
|
|
3629
|
+
// typeof(group) != 'undefined'
|
|
3630
|
+
// && group != 'untagged'
|
|
3631
|
+
// && typeof(opt.groups[group]) != 'undefined'
|
|
3632
|
+
// ) {
|
|
3633
|
+
// // allowed extensions
|
|
3634
|
+
// if ( typeof(opt.groups[group].allowedExtensions) != 'undefined'
|
|
3635
|
+
// && opt.groups[group].allowedExtensions != '*'
|
|
3636
|
+
// ) {
|
|
3637
|
+
// var ext = opt.groups[group].allowedExtensions;
|
|
3638
|
+
// var fileExt = filename.substring(filename.lastIndexOf('.')+1)
|
|
3639
|
+
// if ( !Array.isArray(ext) ) { ext = [ext] }
|
|
3640
|
+
// if ( ext.indexOf(fileExt) < 0 ) {
|
|
3641
|
+
// throwError(response, 400, '`'+ fileExt +'` is not an allowed extension. See `'+ group +'` upload group definition.');
|
|
3642
|
+
// return false;
|
|
3643
|
+
// }
|
|
3644
|
+
// }
|
|
3645
|
+
// // multiple or single
|
|
3646
|
+
// if ( typeof(opt.groups[group].isMultipleAllowed) != 'undefined'
|
|
3647
|
+
// && !opt.groups[group].isMultipleAllowed
|
|
3648
|
+
// && fileCount > 1
|
|
3649
|
+
// ) {
|
|
3650
|
+
// throwError(response, 400, 'multiple uploads not allowed. See `'+ group +'` upload group definition.');
|
|
3651
|
+
// return false;
|
|
3652
|
+
// }
|
|
3653
|
+
// }
|
|
3654
|
+
var fileGroup = ( typeof(group) != 'undefined' && group ) ? group : 'untagged';
|
|
3655
|
+
|
|
3656
|
+
// deny an unconfigured upload group (was: silently streamed through)
|
|
3657
|
+
if ( typeof(opt.groups) == 'undefined' || typeof(opt.groups[fileGroup]) == 'undefined' ) {
|
|
3658
|
+
throwError(response, 400, '`'+ fileGroup +'` is not a configured upload group. See the `upload.groups` definition in settings.json.');
|
|
3659
|
+
return false;
|
|
3660
|
+
}
|
|
3661
|
+
|
|
3662
|
+
// allowed extensions
|
|
3663
|
+
if ( typeof(opt.groups[fileGroup].allowedExtensions) != 'undefined'
|
|
3664
|
+
&& opt.groups[fileGroup].allowedExtensions != '*'
|
|
3665
|
+
) {
|
|
3666
|
+
var ext = opt.groups[fileGroup].allowedExtensions;
|
|
3667
|
+
var fileExt = filename.substring(filename.lastIndexOf('.')+1)
|
|
3668
|
+
if ( !Array.isArray(ext) ) {
|
|
3669
|
+
ext = [ext]
|
|
3526
3670
|
}
|
|
3527
3671
|
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
&& !opt.groups[group].isMultipleAllowed
|
|
3531
|
-
&& fileCount > 1
|
|
3532
|
-
) {
|
|
3533
|
-
throwError(response, 400, 'multiple uploads not allowed. See `'+ group +'` upload group definition.');
|
|
3672
|
+
if ( ext.indexOf(fileExt) < 0 ) {
|
|
3673
|
+
throwError(response, 400, '`'+ fileExt +'` is not an allowed extension. See `'+ fileGroup +'` upload group definition.');
|
|
3534
3674
|
return false;
|
|
3535
3675
|
}
|
|
3536
3676
|
}
|
|
3537
3677
|
|
|
3678
|
+
// multiple or single
|
|
3679
|
+
if ( typeof(opt.groups[fileGroup].isMultipleAllowed) != 'undefined'
|
|
3680
|
+
&& !opt.groups[fileGroup].isMultipleAllowed
|
|
3681
|
+
&& fileCount > 1
|
|
3682
|
+
) {
|
|
3683
|
+
throwError(response, 400, 'multiple uploads not allowed. See `'+ fileGroup +'` upload group definition.');
|
|
3684
|
+
return false;
|
|
3685
|
+
}
|
|
3686
|
+
|
|
3538
3687
|
|
|
3539
3688
|
// TODO - https://github.com/TooTallNate/node-wav
|
|
3540
3689
|
//file._mimetype = mimetype;
|
|
3541
3690
|
|
|
3691
|
+
// #B49 (2026-06-16) — per-group `path` overrides the global uploadDir;
|
|
3692
|
+
// fall back to the global dir when the group declares no path. The
|
|
3693
|
+
// configured defaults resolve to dirs that exist (os.tmpdir() always;
|
|
3694
|
+
// <project>/tmp is created at boot), but a CUSTOM dir may not exist yet —
|
|
3695
|
+
// and the writeStream 'error' handler is only attached later, in the
|
|
3696
|
+
// busboy 'finish' loop, so a missing dir would emit an unhandled ENOENT
|
|
3697
|
+
// here (during streaming) and crash the bundle. mkdir-if-missing guards it.
|
|
3698
|
+
var fileUploadDir = ( opt.groups[fileGroup] && opt.groups[fileGroup].path )
|
|
3699
|
+
? opt.groups[fileGroup].path
|
|
3700
|
+
: uploadDir;
|
|
3701
|
+
if ( !fs.existsSync(fileUploadDir) ) {
|
|
3702
|
+
fs.mkdirSync(fileUploadDir, { recursive: true });
|
|
3703
|
+
}
|
|
3704
|
+
|
|
3542
3705
|
// creating file
|
|
3543
|
-
writeStreams[index] = fs.createWriteStream( _(
|
|
3706
|
+
writeStreams[index] = fs.createWriteStream( _(fileUploadDir + '/' + filename) );
|
|
3544
3707
|
var liner = new require('stream').Transform({objectMode: true});
|
|
3545
3708
|
|
|
3546
3709
|
liner._transform = function (chunk, encoding, done) {
|
|
@@ -3567,7 +3730,9 @@ function Server(options) {
|
|
|
3567
3730
|
//fileObj = Buffer.from(str2ab(this._dataChunk));
|
|
3568
3731
|
//delete this._dataChunk;
|
|
3569
3732
|
|
|
3570
|
-
|
|
3733
|
+
// #B49 — mirror the per-group / configured dir chosen at the write site
|
|
3734
|
+
// above (file.on('end') closes over the same per-file fileUploadDir).
|
|
3735
|
+
tmpFilename = _(fileUploadDir + '/' + filename);
|
|
3571
3736
|
|
|
3572
3737
|
request.files.push({
|
|
3573
3738
|
name: fieldname,
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"untagged": {
|
|
84
84
|
"path": "${tmpPath}",
|
|
85
85
|
"allowedExtensions": "*", // or [ "jpg", "jpeg", "png", "svg" ]
|
|
86
|
-
"isMultipleAllowed": false
|
|
86
|
+
"isMultipleAllowed": true // #B50 — untagged is the permissive default (now enforced); set false to require single-file
|
|
87
87
|
// optional sample
|
|
88
88
|
// ,
|
|
89
89
|
// "filePrefix": "$designId_",
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gina-lib-admin",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Admin /_gina/* IP-allowlist gate (isClientAllowed). Single source of truth for the /_gina/info and /_gina/cache/stats access check; previously duplicated byte-identical in server.js and server.isaac.js.",
|
|
5
|
+
"authors": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Martin-Luther ETOUMAN",
|
|
8
|
+
"email": "contact@gina.io"
|
|
9
|
+
}
|
|
10
|
+
],
|
|
11
|
+
"copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=0.10.22"
|
|
14
|
+
},
|
|
15
|
+
"main": "src/main",
|
|
16
|
+
"license": "MIT"
|
|
17
|
+
}
|