gina 0.3.15-alpha.1 → 0.3.15-alpha.2
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/ROADMAP.md +21 -0
- package/framework/v0.3.15-alpha.2/VERSION +1 -0
- package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/index.js +13 -3
- package/framework/v0.3.15-alpha.2/core/plugins/lib/hsts/README.md +144 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/hsts/package.json +22 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/hsts/src/main.js +270 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/origin-agent-cluster/README.md +84 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/origin-agent-cluster/package.json +22 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/origin-agent-cluster/src/main.js +153 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/referrer-policy/README.md +97 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/referrer-policy/package.json +22 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/referrer-policy/src/main.js +198 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/x-content-type-options/README.md +64 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/x-content-type-options/package.json +22 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/x-content-type-options/src/main.js +145 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/x-frame-options/README.md +94 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/x-frame-options/package.json +22 -0
- package/framework/v0.3.15-alpha.2/core/plugins/lib/x-frame-options/src/main.js +190 -0
- package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/index.js +52 -0
- package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/conf/settings.json +59 -0
- package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +6 -0
- package/package.json +2 -2
- package/framework/v0.3.15-alpha.1/VERSION +0 -1
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/AUTHORS +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/html/static.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/config.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/connector.v2.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/content.encoding +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/controller.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/controller/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/dev/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/gna.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/locales/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/locales/currency.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/locales/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/mime.types +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/model/entity.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/model/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/model/template/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/router.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/server.express.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/server.isaac.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/server.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/status.codes +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/_gitignore +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/conf/env.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/conf/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/console.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/context.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/data/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/data/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/json/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/json/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/path.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/prototypes.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/task.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/helpers/text.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/archiver/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/archiver/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/archiver/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/async/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/async/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cache/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cache/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cache/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/collection/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/collection/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/collection/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/config.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cron/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cron/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/domain/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/domain/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/generator/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/i18n/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/inherits/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/inherits/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/math/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/merge/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/merge/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/metrics/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/model.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/proc.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/routing/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/routing/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/routing/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/secrets/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/shell.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/state.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/url/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/url/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/url/routing.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/uuid/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/validator.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/watcher/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.2}/lib/watcher/src/main.js +0 -0
package/ROADMAP.md
CHANGED
|
@@ -156,6 +156,27 @@ Cross-site request forgery protection. Three-phase defense-in-depth plan aligned
|
|
|
156
156
|
|
|
157
157
|
---
|
|
158
158
|
|
|
159
|
+
## Web Security Headers
|
|
160
|
+
|
|
161
|
+
HTTP security response headers as opt-in `gina.plugins.*` middlewares, mirroring the `Session` (#CSRF1) and `Csrf` (#CSRF2/#CSRF3) plugin shape. Each plugin is single-concern, opt-in by default-off, and reads its config from a flat top-level `settings.json` key. Native implementation — no `helmet` dependency. **Phase 1** covers the five modern critical headers (X-Content-Type-Options, X-Frame-Options, Referrer-Policy, HSTS, Origin-Agent-Cluster) — all shipped in `0.3.15-alpha`. **Phase 1.5** covers helmet-parity gap-fill (HidePoweredBy, X-DNS-Prefetch-Control, X-XSS-Protection, X-Download-Options, X-Permitted-Cross-Domain-Policies) — defense-in-depth + parity-with-helmet narrative; modest practical value. **Phase 2** covers CSP + COEP/COOP/CORP (dynamic / higher-break-risk, deferred to `0.4.0`). CORS handling is separate and already lives in `core/server.js` (request-side).
|
|
162
|
+
|
|
163
|
+
| Status | Feature | Version | Target |
|
|
164
|
+
| --- | --- | --- | --- |
|
|
165
|
+
| ✅ | **`X-Content-Type-Options: nosniff` middleware** — Opt-in plugin `gina.plugins.XContentTypeOptions()` returns an Express-compatible middleware that emits the `X-Content-Type-Options: nosniff` response header on every response (the only valid value per RFC 7034 / WHATWG Fetch Standard). Adoption is two lines: `var xContentTypeOptions = require('gina').plugins.XContentTypeOptions(); app.use(xContentTypeOptions);`. Idempotent — if an earlier middleware already set the header, the existing value is preserved (safe to stack with helmet-style upstream gates). No `enabled` flag — register to opt in, don't register to opt out. Settings template seeds `xContentTypeOptions: {}` with the block reserved for future fields (per-route opt-out, etc.); future additions do not need an API break. Establishes the per-header response-middleware shape that the rest of Phase 1 (X-Frame-Options, Referrer-Policy, HSTS, Origin-Agent-Cluster) will mirror. 33 unit tests; full suite 5467/5467. | `0.3.15-alpha` | 2026-05-17 |
|
|
166
|
+
| ✅ | **`X-Frame-Options` clickjacking-defense middleware** — Opt-in plugin `gina.plugins.XFrameOptions({ value })`. Settings: `xFrameOptions.value: "DENY"` or `"SAMEORIGIN"` (default `"SAMEORIGIN"`). Caller options always win over settings; values are normalised to uppercase. Validation rejects the legacy `"ALLOW-FROM"` value at factory call time with a dedicated error pointing at the modern `Content-Security-Policy: frame-ancestors` replacement (modern browsers never honoured ALLOW-FROM cross-vendor). Idempotent — first-writer-wins. 51 unit tests. | `0.3.15-alpha` | 2026-05-17 |
|
|
167
|
+
| ✅ | **`Referrer-Policy` middleware** — Opt-in plugin `gina.plugins.ReferrerPolicy({ value })`. Settings: `referrerPolicy.value` is one of the eight W3C tokens (`"no-referrer"`, `"no-referrer-when-downgrade"`, `"origin"`, `"origin-when-cross-origin"`, `"same-origin"`, `"strict-origin"`, `"strict-origin-when-cross-origin"`, `"unsafe-url"`). Default `"strict-origin-when-cross-origin"` matches the browser default since ~2021. Caller options always win over settings; values are normalised to lowercase per the W3C spec's case-insensitive matching. Invalid tokens throw at factory call time with the full eight-token list + W3C spec URL in the message. Idempotent — first-writer-wins. 56 unit tests. | `0.3.15-alpha` | 2026-05-17 |
|
|
168
|
+
| ✅ | **`Strict-Transport-Security` (HSTS) middleware** — Opt-in plugin `gina.plugins.Hsts({ maxAge, includeSubDomains, preload })`. Defaults: `maxAge: 15552000` (180 days), `includeSubDomains: false`, `preload: false`. Caller options always win over settings. Browser-parity invariant: `preload: true` requires `includeSubDomains: true` AND `maxAge >= 31536000` (1 year) per the HSTS preload-list submission requirements; factory throws at call time on invariant violations with a pointer at https://hstspreload.org/. Also throws on non-integer / negative / NaN / Infinity `maxAge`. Header value built per RFC 6797 §6.1 directive order (`max-age=<n>; includeSubDomains; preload`). Spec deviation documented: emits on every response (helmet-aligned) rather than gating HTTPS-only — receiver enforces correctly anyway per RFC 6797 §8.1. Idempotent — first-writer-wins. 69 unit tests. | `0.3.15-alpha` | 2026-05-17 |
|
|
169
|
+
| ✅ | **`Origin-Agent-Cluster: ?1` middleware** — Opt-in plugin `gina.plugins.OriginAgentCluster()` requests origin-keyed agent clustering — same-site cross-origin pages get isolated agents (can no longer reach in via `document.domain`), mitigating one class of Spectre side-channel attack. Per the HTML spec, `?1` (Structured Header boolean true) is the only useful value; no tunable options. Browser support: Chrome 88+, Edge 88+, Firefox 109+, Safari 15+. Mirrors the #HDR1 shape exactly. Idempotent — first-writer-wins. 33 unit tests. **Closes Phase 1 (modern critical coverage).** | `0.3.15-alpha` | 2026-05-17 |
|
|
170
|
+
| 📋 | **Phase 1.5 — `HidePoweredBy` (#HDR8)** — `gina.plugins.HidePoweredBy()` removes the `X-Powered-By` response header (Express's `X-Powered-By: Express` leaks framework identity). REMOVE shape (`res.removeHeader`), unlike the SET shape of every other plugin in the track. Modest practical value; helmet covers it. | `0.3.16-alpha` | Q2 2026 |
|
|
171
|
+
| 📋 | **Phase 1.5 — `X-DNS-Prefetch-Control` (#HDR9)** — `gina.plugins.XDnsPrefetchControl({ value })`. Default `"off"` (matches helmet). Marginal value — modern browsers mostly ignore the header. | `0.3.16-alpha` | Q3 2026 |
|
|
172
|
+
| 📋 | **Phase 1.5 — `X-XSS-Protection: 0` (#HDR10)** — `gina.plugins.XXssProtection()` emits `0` to DISABLE Chrome's legacy XSS auditor (deprecated; auditor had its own vulnerabilities). Near-zero practical value in 2026 (Chrome dropped the auditor in 78; Firefox / Safari never implemented). | `0.3.16-alpha` | Q3 2026 |
|
|
173
|
+
| 📋 | **Phase 1.5 — `X-Download-Options: noopen` (#HDR11)** — `gina.plugins.XDownloadOptions()` IE8+ legacy header. Modern browsers ignore. Defense-in-depth for IE11 holdouts only. | `0.3.16-alpha` | Q3 2026 |
|
|
174
|
+
| 📋 | **Phase 1.5 — `X-Permitted-Cross-Domain-Policies` (#HDR12)** — `gina.plugins.XPermittedCrossDomainPolicies({ value })`. Restricts Adobe Flash / PDF cross-domain. Flash EOL since 2020; PDF readers mostly ignore. Helmet still ships it. | `0.3.16-alpha` | Q3 2026 |
|
|
175
|
+
| 📋 | **`Content-Security-Policy` (Phase 2 — static directives)** — Opt-in plugin `gina.plugins.Csp({ directives, reportOnly })`. v0 ships static directives only; per-response nonce wiring requires template-render integration and defers to a separate CSP-aware view-layer plugin. `reportOnly: true` emits `Content-Security-Policy-Report-Only` for non-enforcing migration testing. | `0.4.0` | Q1 2027 |
|
|
176
|
+
| 📋 | **`Cross-Origin-{Embedder,Opener,Resource}-Policy` (Phase 2)** — Opt-in plugin `gina.plugins.CrossOriginPolicies({ embedder, opener, resource })` — COEP/COOP/CORP browsing-context isolation. Distinct from CORS (request-side, handled in `core/server.js:1362-1520`). Can break legitimate cross-origin resource loading; opt-in even more conservatively than Phase 1. | `0.4.0` | Q1 2027 |
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
159
180
|
## Secrets & Configuration
|
|
160
181
|
|
|
161
182
|
Secrets handling for bundle JSON configs without baking plaintext values into source. Pluggable-backend design with `process.env` as the default; the reserved API surface allows future Vault / SOPS / K8s Secrets backends to slot in without changing call sites or the placeholder syntax.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.3.15-alpha.2
|
|
@@ -32,11 +32,21 @@ function Plugins() {
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
var self = {
|
|
35
|
-
Validator
|
|
35
|
+
Validator : _require('./lib/validator'),
|
|
36
36
|
// #CSRF1 — hardened session-cookie wrapper around express-session.
|
|
37
|
-
Session
|
|
37
|
+
Session : _require('./lib/session'),
|
|
38
38
|
// #CSRF2 — signed double-submit token CSRF middleware.
|
|
39
|
-
Csrf
|
|
39
|
+
Csrf : _require('./lib/csrf'),
|
|
40
|
+
// #HDR1 — X-Content-Type-Options: nosniff response header.
|
|
41
|
+
XContentTypeOptions : _require('./lib/x-content-type-options'),
|
|
42
|
+
// #HDR2 — X-Frame-Options clickjacking-defense response header.
|
|
43
|
+
XFrameOptions : _require('./lib/x-frame-options'),
|
|
44
|
+
// #HDR3 — Referrer-Policy response header.
|
|
45
|
+
ReferrerPolicy : _require('./lib/referrer-policy'),
|
|
46
|
+
// #HDR4 — HSTS (Strict-Transport-Security) response header.
|
|
47
|
+
Hsts : _require('./lib/hsts'),
|
|
48
|
+
// #HDR7 — Origin-Agent-Cluster response header (origin-keyed isolation).
|
|
49
|
+
OriginAgentCluster : _require('./lib/origin-agent-cluster')
|
|
40
50
|
};
|
|
41
51
|
|
|
42
52
|
return self
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# HSTS Plugin (#HDR4)
|
|
2
|
+
|
|
3
|
+
Opt-in middleware that sets the `Strict-Transport-Security` response
|
|
4
|
+
header on every response, instructing browsers to access the host
|
|
5
|
+
exclusively over HTTPS for the next `maxAge` seconds.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
Once a browser receives a valid HSTS policy from a host, it refuses to
|
|
10
|
+
make plain HTTP requests to that host for the duration of `maxAge` —
|
|
11
|
+
attempts get upgraded to HTTPS before the network even sees them. This
|
|
12
|
+
defeats SSL-stripping attacks where an active MITM intercepts the
|
|
13
|
+
client's first HTTP request and prevents it from ever escalating to
|
|
14
|
+
HTTPS. Once the policy is in place, the attacker has no opportunity to
|
|
15
|
+
sit between the client and the server in plaintext.
|
|
16
|
+
|
|
17
|
+
The fourth and final Phase 1 plugin on the gina security headers
|
|
18
|
+
track (#HDR1–#HDR4).
|
|
19
|
+
|
|
20
|
+
## Adoption
|
|
21
|
+
|
|
22
|
+
One line in the bundle bootstrap (`bundles/<name>/index.js`), after the
|
|
23
|
+
express app is created:
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
var express = require('express');
|
|
27
|
+
var hsts = require('gina').plugins.Hsts();
|
|
28
|
+
var app = express();
|
|
29
|
+
|
|
30
|
+
app.use(hsts);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Order with other gina security plugins does not matter — the header is
|
|
34
|
+
emitted on the response, not consumed from the request.
|
|
35
|
+
|
|
36
|
+
## Configuration
|
|
37
|
+
|
|
38
|
+
In `bundles/<name>/config/settings.json`:
|
|
39
|
+
|
|
40
|
+
```jsonc
|
|
41
|
+
{
|
|
42
|
+
"hsts": {
|
|
43
|
+
"maxAge": 15552000,
|
|
44
|
+
"includeSubDomains": false,
|
|
45
|
+
"preload": false
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
| Field | Type | Default | Notes |
|
|
51
|
+
|---------------------|---------|-------------|--------------------------------------------|
|
|
52
|
+
| `maxAge` | number | `15552000` | Seconds. Default = 180 days. |
|
|
53
|
+
| `includeSubDomains` | boolean | `false` | Apply HSTS to all sub-domains as well. |
|
|
54
|
+
| `preload` | boolean | `false` | Opt into the HSTS preload list. |
|
|
55
|
+
|
|
56
|
+
Caller-supplied options always win over settings:
|
|
57
|
+
|
|
58
|
+
```js
|
|
59
|
+
var hsts = require('gina').plugins.Hsts({
|
|
60
|
+
maxAge: 63072000,
|
|
61
|
+
includeSubDomains: true,
|
|
62
|
+
preload: true
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Browser-parity invariant on `preload`
|
|
67
|
+
|
|
68
|
+
`preload: true` requires `includeSubDomains: true` AND `maxAge >=
|
|
69
|
+
31536000` (1 year) per the [HSTS preload-list submission requirements](https://hstspreload.org/#deployment-recommendations).
|
|
70
|
+
The factory throws at call time when the combination is invalid:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
[gina.plugins.Hsts] preload=true requires includeSubDomains=true per the
|
|
74
|
+
HSTS preload-list submission requirements — see
|
|
75
|
+
https://hstspreload.org/#deployment-recommendations
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
[gina.plugins.Hsts] preload=true requires maxAge>=31536000 (1 year)
|
|
80
|
+
per the HSTS preload-list submission requirements; received
|
|
81
|
+
maxAge=15552000. See https://hstspreload.org/#deployment-recommendations
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This mirrors the #CSRF1 `SameSite=None`+`Secure` lock and the #HDR2
|
|
85
|
+
`ALLOW-FROM` rejection — fast-fail at bootstrap, the bundle won't start
|
|
86
|
+
with a misconfigured header.
|
|
87
|
+
|
|
88
|
+
**Why the invariant matters**: the HSTS preload list is the browsers'
|
|
89
|
+
hard-coded HSTS database. Once your hostname is in it, all browsers
|
|
90
|
+
treat HSTS as active from the moment they install the browser update,
|
|
91
|
+
regardless of whether they've ever fetched a response from your host.
|
|
92
|
+
Removal from the preload list takes months and isn't guaranteed —
|
|
93
|
+
opting in is a one-way operation in practical terms. The submission
|
|
94
|
+
requirements exist to keep operators from accidentally locking
|
|
95
|
+
themselves out.
|
|
96
|
+
|
|
97
|
+
## Choosing values
|
|
98
|
+
|
|
99
|
+
- **`maxAge`** — start small (`300` = 5 minutes) during initial rollout
|
|
100
|
+
to bound the blast radius of a mistake; ramp to `15552000` (180 days)
|
|
101
|
+
for steady state; `63072000` (2 years) is the conventional value for
|
|
102
|
+
preload-list submission.
|
|
103
|
+
- **`includeSubDomains`** — only enable if you're certain *every*
|
|
104
|
+
sub-domain (including ones added in the future) will be HTTPS-only.
|
|
105
|
+
Common foot-gun: `app.example.com` enabling `includeSubDomains` and
|
|
106
|
+
breaking `legacy.example.com` that's stuck on HTTP.
|
|
107
|
+
- **`preload`** — only opt in once you've run stable in steady-state for
|
|
108
|
+
weeks, audited every sub-domain, and accepted that removal is slow.
|
|
109
|
+
|
|
110
|
+
## Spec note — emission gating
|
|
111
|
+
|
|
112
|
+
This plugin emits the header on **every** response regardless of
|
|
113
|
+
transport. RFC 6797 §7.2 says "An HSTS Host MUST NOT include the STS
|
|
114
|
+
header field in HTTP responses conveyed over non-secure transport".
|
|
115
|
+
However, §8.1 also says the user agent "MUST ignore any present STS
|
|
116
|
+
header field(s)" received over insecure transport — the receiver
|
|
117
|
+
enforces the policy correctly regardless of what the server sends.
|
|
118
|
+
|
|
119
|
+
The plugin's design favours **proxy-deployment robustness** (no
|
|
120
|
+
dependency on `x-forwarded-proto` being preserved by intermediaries)
|
|
121
|
+
over sender-side spec purity. helmet's `Strict-Transport-Security`
|
|
122
|
+
middleware takes the same approach, so adopters migrating from helmet
|
|
123
|
+
see identical wire behaviour.
|
|
124
|
+
|
|
125
|
+
Bundles that need strict §7.2 compliance can simply not register the
|
|
126
|
+
plugin in non-HTTPS bundles — the `registration = opt-in` discipline
|
|
127
|
+
covers that case.
|
|
128
|
+
|
|
129
|
+
## Failure modes
|
|
130
|
+
|
|
131
|
+
| Condition | Outcome |
|
|
132
|
+
|----------------------------------------------------------|------------------------------------------------------|
|
|
133
|
+
| All fields omitted | Emits `max-age=15552000` |
|
|
134
|
+
| `maxAge` is not a non-negative integer | Factory throws at call time |
|
|
135
|
+
| `preload=true` with `includeSubDomains=false` | Factory throws with hstspreload.org pointer |
|
|
136
|
+
| `preload=true` with `maxAge<31536000` | Factory throws with hstspreload.org pointer |
|
|
137
|
+
| `maxAge=0` | Emits `max-age=0` (clears existing HSTS policy) |
|
|
138
|
+
| Plugin not registered | Header not emitted; browser uses no HSTS policy |
|
|
139
|
+
| Header already set by an earlier middleware | Existing value preserved (idempotent) |
|
|
140
|
+
| Response already sent (`res.headersSent === true`) | Node's `setHeader` no-ops; request resumes |
|
|
141
|
+
|
|
142
|
+
The idempotent behaviour makes the plugin safe to register more than
|
|
143
|
+
once or alongside another middleware that emits the same header (e.g.
|
|
144
|
+
a generic helmet-style upstream gate) — the first writer wins.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gina-core-plugin-hsts",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Strict-Transport-Security (HSTS) response header middleware (#HDR4)",
|
|
5
|
+
"authors": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Maritn-Luther ETOUMAN",
|
|
8
|
+
"email": "contact@gina.io"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "Fabrice DELANEAU",
|
|
12
|
+
"email": "contact@gina.io"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=0.10.22"
|
|
18
|
+
},
|
|
19
|
+
"main": "src/main",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"readmeFilename": "README.md"
|
|
22
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the gina package.
|
|
3
|
+
* Copyright (c) 2009-2026 Rhinostone <contact@gina.io>
|
|
4
|
+
*
|
|
5
|
+
* For the full copyright and license information, please view the LICENSE
|
|
6
|
+
* file that was distributed with this source code.
|
|
7
|
+
*/
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* HSTS plugin (#HDR4) — emits the `Strict-Transport-Security` response
|
|
12
|
+
* header on every response, instructing browsers to access the host
|
|
13
|
+
* exclusively over HTTPS for the next `maxAge` seconds.
|
|
14
|
+
*
|
|
15
|
+
* Bundles adopt it with a one-line bootstrap add:
|
|
16
|
+
*
|
|
17
|
+
* var express = require('express');
|
|
18
|
+
* var hsts = require('gina').plugins.Hsts();
|
|
19
|
+
* var app = express();
|
|
20
|
+
*
|
|
21
|
+
* app.use(hsts);
|
|
22
|
+
*
|
|
23
|
+
* Three configuration fields per RFC 6797:
|
|
24
|
+
*
|
|
25
|
+
* - `maxAge` — seconds; default 15552000 (180 days).
|
|
26
|
+
* - `includeSubDomains` — boolean; default false.
|
|
27
|
+
* - `preload` — boolean; default false. Browser-parity
|
|
28
|
+
* invariant: preload=true requires
|
|
29
|
+
* includeSubDomains=true AND maxAge>=31536000
|
|
30
|
+
* (1 year) per the HSTS preload-list
|
|
31
|
+
* submission requirements.
|
|
32
|
+
*
|
|
33
|
+
* Browser-parity invariant on `preload` is enforced at factory call
|
|
34
|
+
* time — the factory throws when the combination is invalid, mirroring
|
|
35
|
+
* the #CSRF1 SameSite=None+Secure lock and the #HDR2 ALLOW-FROM
|
|
36
|
+
* rejection.
|
|
37
|
+
*
|
|
38
|
+
* **Spec deviation**: this plugin emits the header on every response
|
|
39
|
+
* regardless of transport. RFC 6797 §7.2 says "An HSTS Host MUST NOT
|
|
40
|
+
* include the STS header field in HTTP responses conveyed over non-secure
|
|
41
|
+
* transport" — but §8.1 also says "the UA MUST ignore any present STS
|
|
42
|
+
* header field(s)" received over insecure transport. The receiver
|
|
43
|
+
* enforces the policy correctly regardless, so the practical wire
|
|
44
|
+
* outcome is identical. This plugin matches helmet's behaviour
|
|
45
|
+
* (emit unconditionally) rather than the sender-side MUST NOT — the
|
|
46
|
+
* design favours proxy-deployment robustness (no dependency on
|
|
47
|
+
* x-forwarded-proto being preserved by intermediaries) over sender-side
|
|
48
|
+
* spec purity. Bundles that need strict §7.2 compliance can simply not
|
|
49
|
+
* register the plugin in non-HTTPS bundles.
|
|
50
|
+
*
|
|
51
|
+
* @module plugins/hsts
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
var HEADER_NAME = 'strict-transport-security';
|
|
55
|
+
var DEFAULT_MAX_AGE = 15552000; // 180 days
|
|
56
|
+
var DEFAULT_INCLUDE_SUBDOMS = false;
|
|
57
|
+
var DEFAULT_PRELOAD = false;
|
|
58
|
+
var PRELOAD_MIN_MAX_AGE = 31536000; // 1 year — HSTS preload-list submission requirement
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Read the active bundle's `settings.json > hsts.*` block and return the
|
|
63
|
+
* merged framework defaults.
|
|
64
|
+
*
|
|
65
|
+
* Falls back to an empty object when the bundle context is not ready yet
|
|
66
|
+
* (e.g. `Hsts()` invoked at module-require time, before `onInitialize`).
|
|
67
|
+
*
|
|
68
|
+
* @returns {object}
|
|
69
|
+
* @inner
|
|
70
|
+
* @private
|
|
71
|
+
*/
|
|
72
|
+
function resolveSettingsDefaults() {
|
|
73
|
+
var defaults = {};
|
|
74
|
+
var pluginConf = {};
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
var ctx = getContext();
|
|
78
|
+
var bundle = ctx && ctx.bundle;
|
|
79
|
+
var env = ctx && ctx.env;
|
|
80
|
+
var conf = (typeof getConfig === 'function') ? getConfig() : null;
|
|
81
|
+
if (bundle && env && conf && conf[bundle] && conf[bundle][env]) {
|
|
82
|
+
var content = conf[bundle][env].content || {};
|
|
83
|
+
var settings = content.settings || {};
|
|
84
|
+
pluginConf = settings.hsts || {};
|
|
85
|
+
}
|
|
86
|
+
} catch (ignored) {
|
|
87
|
+
pluginConf = {};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
for (var k in pluginConf) {
|
|
91
|
+
if (Object.prototype.hasOwnProperty.call(pluginConf, k)) {
|
|
92
|
+
defaults[k] = pluginConf[k];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return defaults;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Merge caller-supplied options on top of the resolved defaults.
|
|
102
|
+
* Caller-supplied values always win (`hasOwnProperty`-guarded).
|
|
103
|
+
*
|
|
104
|
+
* @param {object|undefined} caller
|
|
105
|
+
* @param {object} defaults
|
|
106
|
+
* @returns {object}
|
|
107
|
+
* @inner
|
|
108
|
+
* @private
|
|
109
|
+
*/
|
|
110
|
+
function mergeOptions(caller, defaults) {
|
|
111
|
+
caller = caller || {};
|
|
112
|
+
var merged = {};
|
|
113
|
+
for (var dk in defaults) {
|
|
114
|
+
if (Object.prototype.hasOwnProperty.call(defaults, dk)) merged[dk] = defaults[dk];
|
|
115
|
+
}
|
|
116
|
+
for (var ck in caller) {
|
|
117
|
+
if (Object.prototype.hasOwnProperty.call(caller, ck)) merged[ck] = caller[ck];
|
|
118
|
+
}
|
|
119
|
+
return merged;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Coerce a value to boolean with explicit defaults.
|
|
125
|
+
*
|
|
126
|
+
* @param {*} value
|
|
127
|
+
* @param {boolean} fallback
|
|
128
|
+
* @returns {boolean}
|
|
129
|
+
* @inner
|
|
130
|
+
* @private
|
|
131
|
+
*/
|
|
132
|
+
function toBool(value, fallback) {
|
|
133
|
+
if (typeof value === 'undefined' || value === null) return fallback;
|
|
134
|
+
if (typeof value === 'boolean') return value;
|
|
135
|
+
if (typeof value === 'string') {
|
|
136
|
+
if (/^(true|1|yes|on)$/i.test(value)) return true;
|
|
137
|
+
if (/^(false|0|no|off)$/i.test(value)) return false;
|
|
138
|
+
}
|
|
139
|
+
return fallback;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Validate the merged options against the HSTS spec invariants and
|
|
145
|
+
* return a normalised triplet `{ maxAge, includeSubDomains, preload }`.
|
|
146
|
+
*
|
|
147
|
+
* Browser-parity invariant: `preload: true` requires
|
|
148
|
+
* `includeSubDomains: true` AND `maxAge >= 31536000` (1 year). Per the
|
|
149
|
+
* HSTS preload-list submission requirements at
|
|
150
|
+
* https://hstspreload.org/#deployment-recommendations — the factory
|
|
151
|
+
* throws at call time when the combination is invalid, mirroring the
|
|
152
|
+
* #HDR2 throw-on-invalid pattern.
|
|
153
|
+
*
|
|
154
|
+
* @param {object} merged
|
|
155
|
+
* @returns {{maxAge: number, includeSubDomains: boolean, preload: boolean}}
|
|
156
|
+
* @throws {Error} when maxAge is not a non-negative integer, or when
|
|
157
|
+
* preload=true is not paired with includeSubDomains=true
|
|
158
|
+
* and maxAge>=PRELOAD_MIN_MAX_AGE
|
|
159
|
+
* @inner
|
|
160
|
+
* @private
|
|
161
|
+
*/
|
|
162
|
+
function resolveOptions(merged) {
|
|
163
|
+
var maxAge = (typeof merged.maxAge === 'undefined' || merged.maxAge === null)
|
|
164
|
+
? DEFAULT_MAX_AGE
|
|
165
|
+
: merged.maxAge;
|
|
166
|
+
var includeSubDomains = toBool(merged.includeSubDomains, DEFAULT_INCLUDE_SUBDOMS);
|
|
167
|
+
var preload = toBool(merged.preload, DEFAULT_PRELOAD);
|
|
168
|
+
|
|
169
|
+
if (typeof maxAge !== 'number' || !isFinite(maxAge) || maxAge < 0 || Math.floor(maxAge) !== maxAge) {
|
|
170
|
+
throw new Error(
|
|
171
|
+
'[gina.plugins.Hsts] maxAge must be a non-negative integer (seconds); '
|
|
172
|
+
+ 'received ' + JSON.stringify(merged.maxAge) + '.'
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (preload) {
|
|
177
|
+
if (!includeSubDomains) {
|
|
178
|
+
throw new Error(
|
|
179
|
+
'[gina.plugins.Hsts] preload=true requires includeSubDomains=true '
|
|
180
|
+
+ 'per the HSTS preload-list submission requirements — see '
|
|
181
|
+
+ 'https://hstspreload.org/#deployment-recommendations'
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
if (maxAge < PRELOAD_MIN_MAX_AGE) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
'[gina.plugins.Hsts] preload=true requires maxAge>=' + PRELOAD_MIN_MAX_AGE
|
|
187
|
+
+ ' (1 year) per the HSTS preload-list submission requirements; '
|
|
188
|
+
+ 'received maxAge=' + maxAge + '. See '
|
|
189
|
+
+ 'https://hstspreload.org/#deployment-recommendations'
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return { maxAge: maxAge, includeSubDomains: includeSubDomains, preload: preload };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Build the header value string from a normalised triplet.
|
|
200
|
+
*
|
|
201
|
+
* Per RFC 6797 §6.1, `max-age` MUST appear first; the optional
|
|
202
|
+
* `includeSubDomains` and `preload` directives are appended in that
|
|
203
|
+
* order when their fields are true.
|
|
204
|
+
*
|
|
205
|
+
* @param {{maxAge: number, includeSubDomains: boolean, preload: boolean}} opts
|
|
206
|
+
* @returns {string}
|
|
207
|
+
* @inner
|
|
208
|
+
* @private
|
|
209
|
+
*/
|
|
210
|
+
function buildHeaderValue(opts) {
|
|
211
|
+
var parts = ['max-age=' + opts.maxAge];
|
|
212
|
+
if (opts.includeSubDomains) parts.push('includeSubDomains');
|
|
213
|
+
if (opts.preload) parts.push('preload');
|
|
214
|
+
return parts.join('; ');
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Return an express-compatible middleware that sets the
|
|
220
|
+
* `Strict-Transport-Security` response header.
|
|
221
|
+
*
|
|
222
|
+
* Idempotent — if the header is already set by an earlier middleware, the
|
|
223
|
+
* existing value is preserved and `next()` is called immediately.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* var hsts = require('gina').plugins.Hsts({
|
|
227
|
+
* maxAge: 63072000,
|
|
228
|
+
* includeSubDomains: true,
|
|
229
|
+
* preload: true
|
|
230
|
+
* });
|
|
231
|
+
* app.use(hsts);
|
|
232
|
+
*
|
|
233
|
+
* @param {object} [opts]
|
|
234
|
+
* @param {number} [opts.maxAge=15552000] — seconds (180 days default)
|
|
235
|
+
* @param {boolean} [opts.includeSubDomains=false]
|
|
236
|
+
* @param {boolean} [opts.preload=false] — preload-list opt-in
|
|
237
|
+
* @returns {function} — express middleware `(req, res, next) => void`
|
|
238
|
+
* @throws {Error} when maxAge is not a non-negative integer, or when
|
|
239
|
+
* preload=true is not paired with includeSubDomains=true
|
|
240
|
+
* and maxAge>=31536000 (1 year)
|
|
241
|
+
*/
|
|
242
|
+
function Hsts(opts) {
|
|
243
|
+
var defaults = resolveSettingsDefaults();
|
|
244
|
+
var merged = mergeOptions(opts, defaults);
|
|
245
|
+
var resolved = resolveOptions(merged);
|
|
246
|
+
var headerValue = buildHeaderValue(resolved);
|
|
247
|
+
|
|
248
|
+
return function ginaHsts(req, res, next) {
|
|
249
|
+
if (typeof res.getHeader === 'function' && res.getHeader(HEADER_NAME)) {
|
|
250
|
+
return next();
|
|
251
|
+
}
|
|
252
|
+
res.setHeader(HEADER_NAME, headerValue);
|
|
253
|
+
next();
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
// Exposed for unit testing. Do not rely on these in application code.
|
|
259
|
+
Hsts._HEADER_NAME = HEADER_NAME;
|
|
260
|
+
Hsts._DEFAULT_MAX_AGE = DEFAULT_MAX_AGE;
|
|
261
|
+
Hsts._DEFAULT_INCLUDE_SUBDOMS = DEFAULT_INCLUDE_SUBDOMS;
|
|
262
|
+
Hsts._DEFAULT_PRELOAD = DEFAULT_PRELOAD;
|
|
263
|
+
Hsts._PRELOAD_MIN_MAX_AGE = PRELOAD_MIN_MAX_AGE;
|
|
264
|
+
Hsts._resolveSettingsDefaults = resolveSettingsDefaults;
|
|
265
|
+
Hsts._mergeOptions = mergeOptions;
|
|
266
|
+
Hsts._resolveOptions = resolveOptions;
|
|
267
|
+
Hsts._buildHeaderValue = buildHeaderValue;
|
|
268
|
+
Hsts._toBool = toBool;
|
|
269
|
+
|
|
270
|
+
module.exports = Hsts;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Origin-Agent-Cluster Plugin (#HDR7)
|
|
2
|
+
|
|
3
|
+
Opt-in middleware that sets the `Origin-Agent-Cluster: ?1` response
|
|
4
|
+
header on every response, requesting that the browser place this page's
|
|
5
|
+
origin in its own agent cluster (origin-keyed) rather than the default
|
|
6
|
+
site-keyed (eTLD+1) cluster.
|
|
7
|
+
|
|
8
|
+
## Why
|
|
9
|
+
|
|
10
|
+
By default, two same-site cross-origin pages (e.g. `app.example.com`
|
|
11
|
+
and `marketing.example.com`) share an agent cluster — they can
|
|
12
|
+
synchronously script each other if either page sets `document.domain`.
|
|
13
|
+
Origin-Agent-Cluster opts the page out of this: it gets its own agent,
|
|
14
|
+
isolated from sibling-origin pages, and `document.domain` becomes a
|
|
15
|
+
no-op.
|
|
16
|
+
|
|
17
|
+
Two benefits:
|
|
18
|
+
|
|
19
|
+
1. **Spectre mitigation** — origin-keyed agents are placed in their own
|
|
20
|
+
OS process where possible, limiting the blast radius of side-channel
|
|
21
|
+
attacks that leak memory across same-site pages.
|
|
22
|
+
2. **Cleaner isolation contract** — defends against the rare-but-real
|
|
23
|
+
pattern where a less-trusted same-site origin tries to reach into a
|
|
24
|
+
trusted page's documents via `document.domain` tricks.
|
|
25
|
+
|
|
26
|
+
Cost is small: same-site cross-origin pages can no longer use
|
|
27
|
+
`document.domain` to share a same-origin context. Pages that rely on
|
|
28
|
+
this legacy pattern (rare in modern apps) should not opt in.
|
|
29
|
+
|
|
30
|
+
Per the [HTML spec](https://html.spec.whatwg.org/multipage/document-sequences.html#origin-keyed-agent-clusters)
|
|
31
|
+
and helmet convention, `?1` (boolean true per Structured Header Values
|
|
32
|
+
syntax) is the only value worth emitting. `?0` is the browser default;
|
|
33
|
+
emitting it is a no-op. There is no `enabled` flag in the configuration
|
|
34
|
+
surface — register the plugin to opt in, don't register to opt out.
|
|
35
|
+
|
|
36
|
+
## Adoption
|
|
37
|
+
|
|
38
|
+
One line in the bundle bootstrap (`bundles/<name>/index.js`), after the
|
|
39
|
+
express app is created:
|
|
40
|
+
|
|
41
|
+
```js
|
|
42
|
+
var express = require('express');
|
|
43
|
+
var originAgentCluster = require('gina').plugins.OriginAgentCluster();
|
|
44
|
+
var app = express();
|
|
45
|
+
|
|
46
|
+
app.use(originAgentCluster);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Order with other gina security plugins does not matter — the header is
|
|
50
|
+
emitted on the response, not consumed from the request.
|
|
51
|
+
|
|
52
|
+
## Configuration
|
|
53
|
+
|
|
54
|
+
In `bundles/<name>/config/settings.json`:
|
|
55
|
+
|
|
56
|
+
```jsonc
|
|
57
|
+
{
|
|
58
|
+
"originAgentCluster": {}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The block is reserved for future use (e.g. per-route opt-out). Today the
|
|
63
|
+
plugin has no tunable options — the only useful header value is `?1`,
|
|
64
|
+
and the header is unconditionally emitted on every response the
|
|
65
|
+
middleware sees.
|
|
66
|
+
|
|
67
|
+
## Browser support
|
|
68
|
+
|
|
69
|
+
Chrome 88+, Edge 88+, Firefox 109+, Safari 15+. Older browsers ignore
|
|
70
|
+
the header silently — safe to register unconditionally.
|
|
71
|
+
|
|
72
|
+
## Failure modes
|
|
73
|
+
|
|
74
|
+
| Condition | Outcome |
|
|
75
|
+
|----------------------------------------------------------|------------------------------------------------------|
|
|
76
|
+
| Plugin not registered | Header not emitted; browser uses default site-keyed agent |
|
|
77
|
+
| Header already set by an earlier middleware | Existing value preserved (idempotent) |
|
|
78
|
+
| Response already sent (`res.headersSent === true`) | Node's `setHeader` no-ops; request resumes |
|
|
79
|
+
| Browser predates the feature | Header ignored silently — harmless |
|
|
80
|
+
| Same-origin policy relies on `document.domain` | Will break; do not register the plugin |
|
|
81
|
+
|
|
82
|
+
The idempotent behaviour makes the plugin safe to register more than
|
|
83
|
+
once or alongside another middleware that emits the same header (e.g.
|
|
84
|
+
a generic helmet-style upstream gate) — the first writer wins.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gina-core-plugin-origin-agent-cluster",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Origin-Agent-Cluster response header middleware (#HDR7)",
|
|
5
|
+
"authors": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Maritn-Luther ETOUMAN",
|
|
8
|
+
"email": "contact@gina.io"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "Fabrice DELANEAU",
|
|
12
|
+
"email": "contact@gina.io"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=0.10.22"
|
|
18
|
+
},
|
|
19
|
+
"main": "src/main",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"readmeFilename": "README.md"
|
|
22
|
+
}
|