gina 0.3.15-alpha.1 → 0.3.15-alpha.3
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 +24 -0
- package/framework/v0.3.15-alpha.3/VERSION +1 -0
- package/framework/v0.3.15-alpha.3/core/plugins/index.js +75 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/README.md +243 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coep/README.md +134 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coep/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coep/src/main.js +200 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coop/README.md +145 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coop/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coop/src/main.js +219 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/corp/README.md +139 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/corp/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/corp/src/main.js +204 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/csp/README.md +201 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/csp/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/csp/src/main.js +461 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hide-powered-by/README.md +117 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hide-powered-by/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hide-powered-by/src/main.js +167 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hsts/README.md +145 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hsts/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hsts/src/main.js +272 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/origin-agent-cluster/README.md +85 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/origin-agent-cluster/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +155 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/referrer-policy/README.md +98 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/referrer-policy/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/referrer-policy/src/main.js +200 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/src/main.js +340 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-content-type-options/README.md +65 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-content-type-options/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-content-type-options/src/main.js +147 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +104 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +193 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-download-options/README.md +88 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-download-options/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-download-options/src/main.js +161 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-frame-options/README.md +95 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-frame-options/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-frame-options/src/main.js +192 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +136 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +202 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-xss-protection/README.md +107 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-xss-protection/package.json +22 -0
- package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-xss-protection/src/main.js +161 -0
- package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/server.isaac.js +62 -57
- package/framework/v0.3.15-alpha.3/core/template/boilerplate/bundle/index.js +272 -0
- package/framework/v0.3.15-alpha.3/core/template/conf/settings.json +420 -0
- package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +58 -27
- package/package.json +2 -2
- package/script/check_no_local_leak.js +1 -1
- package/framework/v0.3.15-alpha.1/VERSION +0 -1
- package/framework/v0.3.15-alpha.1/core/plugins/index.js +0 -45
- package/framework/v0.3.15-alpha.1/core/template/boilerplate/bundle/index.js +0 -87
- package/framework/v0.3.15-alpha.1/core/template/conf/settings.json +0 -176
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/AUTHORS +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/html/static.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/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.3}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/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.3}/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.3}/core/config.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.v2.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/content.encoding +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/gna.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/currency.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/mime.types +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/entity.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/template/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/router.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/server.express.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/server.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/status.codes +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/_gitignore +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/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.3}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/env.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/console.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/context.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/path.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/prototypes.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/task.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/text.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/async/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/async/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/config.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cron/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cron/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/generator/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/i18n/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/math/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/merge/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/merge/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/metrics/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/model.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/proc.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/build.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/secrets/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/session-store.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/shell.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/state.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/url/README.md +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/url/index.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/url/routing.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/uuid/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/validator.js +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/watcher/package.json +0 -0
- /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/watcher/src/main.js +0 -0
package/ROADMAP.md
CHANGED
|
@@ -156,6 +156,30 @@ 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** (targeted at `0.4.0-alpha`) covers CSP + COEP/COOP/CORP + combined wrapper — CSP (#HDR5), COEP (#HDR6), COOP (#HDR13), CORP (#HDR14) and the `SecurityHeaders` combined wrapper (#HDR15) all shipped 2026-05-17 — **Phase 2 closed**. 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)** — Opt-in plugin `gina.plugins.HidePoweredBy()` removes the `X-Powered-By` response header that gina emits by default at `server.js:2425` (plus `env.json > response.header`). Reduces the attacker's reconnaissance surface — they no longer learn the server stack identity from the response header. **Different SHAPE from the other HDR plugins**: REMOVE (`res.removeHeader`) not SET. No tunable options today (mirrors helmet's no-opts shape). **Two-engine pairing**: Phase 1 covers the Express engine (`server.js:2425` setHeader fires in early framework middleware before user `app.use()` mounts, so `removeHeader` succeeds). Isaac's 15 direct `response.writeHead({ 'X-Powered-By': ... })` call sites bypass the setHeader/removeHeader interface, so the middleware can't reach them on Isaac. **Phase 2 (shipped 2026-05-17) closed the Isaac gap** via the framework-level `server.hidePoweredBy: true` settings flag (default `false`) that the Isaac engine reads at boot — `_setPoweredByHeader(headers)` closure inside `onPath` wraps 14 object-literal sites + 1 inline `if (!options.hidePoweredBy)` guard at the routing.json setHeader site. Bundles pick the right shape: Express → middleware; Isaac → flag; belt-and-suspenders → both (each no-op on the other engine). Idempotent — `removeHeader` is a no-op when the header is absent. 37 unit tests. **Opens Phase 1.5 (helmet-parity gap-fill).** | `0.3.16-alpha` | 2026-05-17 |
|
|
171
|
+
| ✅ | **Phase 1.5 — `X-DNS-Prefetch-Control` (#HDR9)** — Opt-in plugin `gina.plugins.XDnsPrefetchControl({ value })`. Settings: `xDnsPrefetchControl.value` is one of two tokens (`"on"`, `"off"`); default `"off"` matches helmet (privacy-respecting choice — browser does not pre-resolve DNS for unclicked links, so the resolver only sees hostnames the user actually navigates to). **API-shape divergence from helmet**: helmet uses `{ allow: boolean }`; gina uses `{ value: 'on' \| 'off' }` matching the existing single-token-enum convention (HDR2 / HDR3 / HDR6 / HDR13 / HDR14). README documents the helmet-to-gina mapping for migrators. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR14 Corp single-enum plugin shape exactly (`resolveSettingsDefaults` + `mergeOptions` + `resolveValue` throw-on-invalid + idempotent first-writer-wins middleware via `res.getHeader`). Marginal practical value in 2026 — modern Chrome / Firefox have their own DNS-prefetch heuristics that mostly ignore the header; defense-in-depth + helmet-parity narrative. 57 unit tests including a negative-invariant lock on the helmet-shape `{ allow: true }` silent-fallback (it does NOT enable DNS prefetching in gina — emits default `off`). | `0.3.16-alpha` | 2026-05-17 |
|
|
172
|
+
| ✅ | **Phase 1.5 — `X-XSS-Protection: 0` (#HDR10)** — Opt-in plugin `gina.plugins.XXssProtection()` emits the literal header `X-XSS-Protection: 0` to DISABLE Chrome's legacy XSS auditor (the auditor itself had its own vulnerabilities; disabling is the modern recommendation per MDN). **The value `0` is deliberate — not a typo**: HEADER_VALUE is the literal string `"0"`, with a negative-invariant test pinning that the value is NOT any `"1"` enable variant. No tunable options (mirrors helmet's no-opts shape + the #HDR1 XContentTypeOptions plugin shape). Use #HDR5 Csp with a strong policy for the actual XSS defense; this header is defense-in-depth + helmet-parity narrative only. Browser status in 2026: Chrome dropped the auditor in v78 (2019); Edge follows Chrome; Firefox / Safari never implemented; IE11 honoured but is EOL. Idempotent — first-writer-wins via `res.getHeader`; if an upstream middleware accidentally emits the unsafe `"1; mode=block"`, this plugin does NOT override it (mount BEFORE the upstream to win). Mirrors the #HDR1 XContentTypeOptions plugin shape (no opts, single fixed value, same `resolveSettingsDefaults` + `mergeOptions` helpers). 37 unit tests including the negative-invariant lock on no-"1"-variant + the string-not-number "0" emission lock. | `0.3.16-alpha` | 2026-05-17 |
|
|
173
|
+
| ✅ | **Phase 1.5 — `X-Download-Options: noopen` (#HDR11)** — Opt-in plugin `gina.plugins.XDownloadOptions()` emits the literal header `X-Download-Options: noopen` on every response. IE-legacy: prevents IE8+ from opening downloads in the site's security context (an old IE vulnerability shape where the "Open" button on a download dialog opened the file in the SITE's origin, allowing XSS-equivalent via downloaded HTML from a trusted site). `noopen` is the only valid value per MSDN. No tunable options (mirrors helmet's no-opts shape + the #HDR1 / #HDR10 plugin shape). Modern browsers (Chrome / Firefox / Safari / Edge) ignore the header silently; only IE10 / IE11 honour it (both EOL since June 2022). Effectively no-op in modern browsers; defense-in-depth + helmet-parity narrative. Idempotent — first-writer-wins via `res.getHeader`. Mirrors the #HDR1 XContentTypeOptions plugin shape exactly. 35 unit tests. | `0.3.16-alpha` | 2026-05-17 |
|
|
174
|
+
| ✅ | **Phase 1.5 — `X-Permitted-Cross-Domain-Policies` (#HDR12)** — Opt-in plugin `gina.plugins.XPermittedCrossDomainPolicies({ value })` emits the `X-Permitted-Cross-Domain-Policies` response header on every response. Settings: `xPermittedCrossDomainPolicies.value` is one of four Adobe spec tokens (`"none"`, `"master-only"`, `"by-content-type"`, `"all"`); default `"none"` matches helmet (most restrictive — no Flash/PDF cross-domain policy files honoured). **API-shape divergence from helmet**: helmet uses `{ permittedPolicies: <enum> }`; gina uses `{ value: <enum> }` matching the existing single-token-enum convention (HDR2 / HDR3 / HDR6 / HDR9 / HDR13 / HDR14). README documents the helmet-to-gina mapping. Mirrors the #HDR14 Corp single-enum plugin shape exactly (`resolveSettingsDefaults` + `mergeOptions` + `resolveValue` throw-on-invalid + idempotent first-writer-wins via `res.getHeader`). Flash EOL since December 2020; Adobe Reader historically honoured the header but most modern PDF readers ignore it; defense-in-depth + helmet-parity narrative. 60 unit tests including a negative-invariant lock on the helmet-shape `{ permittedPolicies }` silent-fallback (it does NOT switch the gina default — emits default `"none"`). **Closes Phase 1.5.** | `0.3.16-alpha` | 2026-05-17 |
|
|
175
|
+
| ✅ | **`Content-Security-Policy` middleware (Phase 2 — static directives)** — Opt-in plugin `gina.plugins.Csp({ directives, reportOnly })`. **Opens Phase 2** of the security-headers track. v0 ships static directives only; per-response nonce wiring requires template-render integration and defers to a future CSP-aware view-layer plugin. Strict whitelist of 27 CSP Level 3 standard directives — unknown directive names throw at factory call time (CSP typos are silent at the browser; fail-fast catches them). Value parsing accepts arrays of source-list tokens (joined with space), pre-formatted strings, `true` (boolean-only directives + `sandbox`), or `false` (omit). `reportOnly: true` emits `Content-Security-Policy-Report-Only` for non-enforcing migration testing. `directives` is required — no sensible cross-bundle default. Mirrors the HDR1-7 shape (idempotent first-writer-wins via `res.getHeader`). 92 unit tests; full suite 5768/5768. HDR6 Coep/Coop/Corp three-plugin split (per wrapper-consistency design) + HDR15 `SecurityHeaders` combined wrapper composing HDR1-7 + HDR5 + HDR6/13/14 to follow. | `0.4.0-alpha` | 2026-05-17 |
|
|
176
|
+
| ✅ | **`Cross-Origin-Embedder-Policy` (COEP) middleware (Phase 2)** — Opt-in plugin `gina.plugins.Coep({ value })`. Settings: `coep.value` is one of three W3C HTML spec tokens (`"require-corp"`, `"credentialless"`, `"unsafe-none"`); default `"require-corp"` matches helmet. Required (paired with `Coop: same-origin` / #HDR13) to enable SharedArrayBuffer and high-resolution `performance.now()` in the page. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR3 ReferrerPolicy single-enum shape with throw-on-invalid validation. The `require-corp` default BREAKS embeds without matching CORP/CORS headers — README walks users through the three escape hatches (set CORP via #HDR14, downgrade to `credentialless`, downgrade to `unsafe-none`). Idempotent — first-writer-wins. 56 unit tests. **First of the three Phase 2 cross-origin policies**; HDR13 Coop and HDR14 Corp to follow, then HDR15 SecurityHeaders combined wrapper closes Phase 2. | `0.4.0-alpha` | 2026-05-17 |
|
|
177
|
+
| ✅ | **`Cross-Origin-Opener-Policy` (COOP) middleware (Phase 2)** — Opt-in plugin `gina.plugins.Coop({ value })`. Settings: `coop.value` is one of four W3C HTML spec tokens (`"same-origin"`, `"same-origin-allow-popups"`, `"noopener-allow-popups"`, `"unsafe-none"`); default `"same-origin"` matches helmet. Required (paired with `Coep: require-corp` / #HDR6) to enable cross-origin isolation. Same-origin isolates `window.opener` references on top-level navigation; same-origin-allow-popups is more compat-friendly for OAuth popup flows. The fourth token `noopener-allow-popups` (W3C spec addition, Chrome 119+/Firefox 131+) severs `window.opener` for popups even at same-origin while keeping the popup window open. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR6 Coep single-enum shape. The `same-origin` default BREAKS OAuth popup flows where the popup needs to call back into the opener — README walks users through the three escape hatches. Idempotent — first-writer-wins. 61 unit tests. **Second of the three Phase 2 cross-origin policies**; HDR14 Corp follows, then HDR15 SecurityHeaders combined wrapper closes Phase 2. | `0.4.0-alpha` | 2026-05-17 |
|
|
178
|
+
| ✅ | **`Cross-Origin-Resource-Policy` (CORP) middleware (Phase 2)** — Opt-in plugin `gina.plugins.Corp({ value })`. Settings: `corp.value` is one of three W3C HTML spec tokens (`"same-origin"`, `"same-site"`, `"cross-origin"`); default `"same-origin"` matches helmet's per-middleware default. Resource-side complement to #HDR6 Coep's `require-corp` enforcement — cross-origin embeds under `Coep: require-corp` require the embed-target bundle to set `Corp: cross-origin` (or wider) to load. Most restrictive practical default; defends against side-channel attacks that load a resource cross-origin to measure size/timing for fingerprinting. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR6 Coep + #HDR13 Coop single-enum shape. The `same-origin` default BREAKS cross-origin embeds when the resource serves at a separate origin from the embedding page — README walks users through the three escape hatches (pick `same-site` for first-party multi-subdomain setups, pick `cross-origin` for publicly-embeddable CDN assets, per-bundle scoping where the page bundle keeps strict + the CDN bundle adopts `cross-origin`). Idempotent — first-writer-wins. 60 unit tests. **Third and final of the three Phase 2 cross-origin policies**; HDR15 SecurityHeaders combined wrapper follows as the closing slice. | `0.4.0-alpha` | 2026-05-17 |
|
|
179
|
+
| ✅ | **`SecurityHeaders` combined wrapper (Phase 2 — closes #HDR + Phase 1.5 extension)** — Opt-in plugin `gina.plugins.SecurityHeaders({...})` composes the full HDR1-14 set in a single mount with one `settings.json` block (`securityHeaders.*`). **Batteries-included safe set**: calling `SecurityHeaders()` with no opts mounts the **12 non-footgun plugins** (xContentTypeOptions, xFrameOptions, referrerPolicy, hsts, originAgentCluster, hidePoweredBy, xDnsPrefetchControl, xXssProtection, xDownloadOptions, xPermittedCrossDomainPolicies, coop, corp) with per-plugin defaults. CSP (#HDR5) and COEP (#HDR6) are opt-in only (CSP throws on missing directives; COEP `require-corp` breaks embeds without CORP). Per-sub-config explicit opt-out via `<key>: false` or `null` (e.g. `SecurityHeaders({ hsts: false })` for HTTP-only bundles). Individual plugins remain mountable independently as power-user escape hatches — the idempotent first-writer-wins pattern means no double-emit when stacking. Mirrors helmet's `helmet()` orchestrator. **Originally shipped 2026-05-17 with 9 sub-plugins** (HDR1-7 + HDR5 + HDR6/13/14) closing Phase 2; **extended 2026-05-17 to 14 sub-plugins** when Phase 1.5 (HDR8-12) closed — wrapper safe-set grew from 7 to 12 plugins. 92 unit tests (was 83 + 9 for the HDR8-12 sub-config opt-out + override coverage). **Closes Phase 2 + Phase 1.5 extension.** | `0.4.0-alpha` | 2026-05-17 |
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
159
183
|
## Secrets & Configuration
|
|
160
184
|
|
|
161
185
|
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.3
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Gina.Core.Plugins Class
|
|
11
|
+
*
|
|
12
|
+
* @package Gina.Core
|
|
13
|
+
* @author Rhinostone <contact@gina.io>
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
function Plugins() {
|
|
17
|
+
|
|
18
|
+
var _require = function(path) {
|
|
19
|
+
var isCacheless = (process.env.NODE_ENV_IS_DEV == 'false') ? false : true;
|
|
20
|
+
if (isCacheless) {
|
|
21
|
+
try {
|
|
22
|
+
delete require.cache[require.resolve(path)];
|
|
23
|
+
return require(path)
|
|
24
|
+
} catch (err) {
|
|
25
|
+
throw err
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
} else {
|
|
29
|
+
return require(path)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
var self = {
|
|
35
|
+
Validator : _require('./lib/validator'),
|
|
36
|
+
// #CSRF1 — hardened session-cookie wrapper around express-session.
|
|
37
|
+
Session : _require('./lib/session'),
|
|
38
|
+
// #CSRF2 — signed double-submit token CSRF middleware.
|
|
39
|
+
Csrf : _require('./lib/csrf'),
|
|
40
|
+
// #HDR1 — X-Content-Type-Options: nosniff response header.
|
|
41
|
+
XContentTypeOptions : _require('./lib/security-headers/x-content-type-options'),
|
|
42
|
+
// #HDR2 — X-Frame-Options clickjacking-defense response header.
|
|
43
|
+
XFrameOptions : _require('./lib/security-headers/x-frame-options'),
|
|
44
|
+
// #HDR3 — Referrer-Policy response header.
|
|
45
|
+
ReferrerPolicy : _require('./lib/security-headers/referrer-policy'),
|
|
46
|
+
// #HDR4 — HSTS (Strict-Transport-Security) response header.
|
|
47
|
+
Hsts : _require('./lib/security-headers/hsts'),
|
|
48
|
+
// #HDR5 — Content-Security-Policy response header.
|
|
49
|
+
Csp : _require('./lib/security-headers/csp'),
|
|
50
|
+
// #HDR6 — Cross-Origin-Embedder-Policy response header.
|
|
51
|
+
Coep : _require('./lib/security-headers/coep'),
|
|
52
|
+
// #HDR7 — Origin-Agent-Cluster response header (origin-keyed isolation).
|
|
53
|
+
OriginAgentCluster : _require('./lib/security-headers/origin-agent-cluster'),
|
|
54
|
+
// #HDR8 — X-Powered-By response-header removal (helmet-parity gap-fill, opens Phase 1.5).
|
|
55
|
+
HidePoweredBy : _require('./lib/security-headers/hide-powered-by'),
|
|
56
|
+
// #HDR9 — X-DNS-Prefetch-Control response header (helmet-parity gap-fill).
|
|
57
|
+
XDnsPrefetchControl : _require('./lib/security-headers/x-dns-prefetch-control'),
|
|
58
|
+
// #HDR10 — X-XSS-Protection: 0 response header — DISABLES Chrome legacy XSS auditor (helmet-parity).
|
|
59
|
+
XXssProtection : _require('./lib/security-headers/x-xss-protection'),
|
|
60
|
+
// #HDR11 — X-Download-Options: noopen response header — IE-legacy (helmet-parity).
|
|
61
|
+
XDownloadOptions : _require('./lib/security-headers/x-download-options'),
|
|
62
|
+
// #HDR12 — X-Permitted-Cross-Domain-Policies response header — Adobe Flash/PDF legacy (closes Phase 1.5).
|
|
63
|
+
XPermittedCrossDomainPolicies : _require('./lib/security-headers/x-permitted-cross-domain-policies'),
|
|
64
|
+
// #HDR13 — Cross-Origin-Opener-Policy response header.
|
|
65
|
+
Coop : _require('./lib/security-headers/coop'),
|
|
66
|
+
// #HDR14 — Cross-Origin-Resource-Policy response header.
|
|
67
|
+
Corp : _require('./lib/security-headers/corp'),
|
|
68
|
+
// #HDR15 — Security Headers combined wrapper (composes HDR1-7 + HDR5 + HDR6/13/14).
|
|
69
|
+
SecurityHeaders : _require('./lib/security-headers')
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
return self
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
module.exports = Plugins()
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Security Headers Combined Wrapper (#HDR15)
|
|
2
|
+
|
|
3
|
+
Opt-in middleware that composes the fourteen per-header security
|
|
4
|
+
plugins into a single mount point with one `settings.json` block.
|
|
5
|
+
Closes Phase 2 of the gina Web Security Headers track; extended with
|
|
6
|
+
the Phase 1.5 helmet-parity plugins (HDR8-12) post-Phase-1.5-closure.
|
|
7
|
+
|
|
8
|
+
## Why
|
|
9
|
+
|
|
10
|
+
The individual `#HDR` plugins are deliberately single-concern — each
|
|
11
|
+
emits one response header, reads one settings.json key, has its own
|
|
12
|
+
README. That makes each plugin easy to reason about but verbose to
|
|
13
|
+
adopt: bundles wanting all fourteen end up with fourteen `require(...)`
|
|
14
|
+
calls, fourteen `app.use(...)` mounts, and fourteen settings.json
|
|
15
|
+
blocks.
|
|
16
|
+
|
|
17
|
+
`gina.plugins.SecurityHeaders({...})` is the one-mount + one-config
|
|
18
|
+
convenience layer over the fourteen. Mirrors helmet's `helmet()` shape
|
|
19
|
+
so bundles migrating from helmet find the API familiar.
|
|
20
|
+
|
|
21
|
+
## Adoption
|
|
22
|
+
|
|
23
|
+
### Default — batteries-included safe set
|
|
24
|
+
|
|
25
|
+
One block in the bundle bootstrap (`bundles/<name>/index.js`):
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
var myapp = require('gina');
|
|
29
|
+
var securityHeaders = require('gina').plugins.SecurityHeaders();
|
|
30
|
+
|
|
31
|
+
myapp.onInitialize(function(event, app) {
|
|
32
|
+
app.use(securityHeaders);
|
|
33
|
+
event.emit('complete', app);
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
With no opts, mounts the **twelve non-footgun plugins** with their
|
|
38
|
+
per-plugin defaults:
|
|
39
|
+
|
|
40
|
+
| Sub-plugin | Header | Default value |
|
|
41
|
+
|-------------------------------------------|-------------------------------------|----------------------------------------------|
|
|
42
|
+
| `XContentTypeOptions` (HDR1) | `X-Content-Type-Options` | `nosniff` |
|
|
43
|
+
| `XFrameOptions` (HDR2) | `X-Frame-Options` | `SAMEORIGIN` |
|
|
44
|
+
| `ReferrerPolicy` (HDR3) | `Referrer-Policy` | `strict-origin-when-cross-origin` |
|
|
45
|
+
| `Hsts` (HDR4) | `Strict-Transport-Security` | `max-age=15552000` (180 days) |
|
|
46
|
+
| `OriginAgentCluster` (HDR7) | `Origin-Agent-Cluster` | `?1` |
|
|
47
|
+
| `HidePoweredBy` (HDR8) | `X-Powered-By` | **REMOVED** (Express engine only) |
|
|
48
|
+
| `XDnsPrefetchControl` (HDR9) | `X-DNS-Prefetch-Control` | `off` |
|
|
49
|
+
| `XXssProtection` (HDR10) | `X-XSS-Protection` | `0` (deliberately disables Chrome auditor) |
|
|
50
|
+
| `XDownloadOptions` (HDR11) | `X-Download-Options` | `noopen` (IE-legacy) |
|
|
51
|
+
| `XPermittedCrossDomainPolicies` (HDR12) | `X-Permitted-Cross-Domain-Policies` | `none` (Flash/PDF-legacy) |
|
|
52
|
+
| `Coop` (HDR13) | `Cross-Origin-Opener-Policy` | `same-origin` |
|
|
53
|
+
| `Corp` (HDR14) | `Cross-Origin-Resource-Policy` | `same-origin` |
|
|
54
|
+
|
|
55
|
+
The two **opt-in-only plugins** (#HDR5 Csp + #HDR6 Coep) are NOT
|
|
56
|
+
mounted by default because they have known footguns:
|
|
57
|
+
|
|
58
|
+
- **CSP** (#HDR5) throws on missing directives — there's no sensible
|
|
59
|
+
cross-bundle default since every bundle has its own resource graph.
|
|
60
|
+
- **COEP** (#HDR6) default `require-corp` BREAKS pages that load
|
|
61
|
+
cross-origin resources without matching CORP / CORS headers.
|
|
62
|
+
|
|
63
|
+
Bundles that want either must opt in explicitly (see below).
|
|
64
|
+
|
|
65
|
+
### Opt in to CSP and COEP
|
|
66
|
+
|
|
67
|
+
```js
|
|
68
|
+
var securityHeaders = require('gina').plugins.SecurityHeaders({
|
|
69
|
+
csp: {
|
|
70
|
+
directives: {
|
|
71
|
+
'default-src': ["'self'"],
|
|
72
|
+
'script-src': ["'self'", 'https://cdn.example.com'],
|
|
73
|
+
'style-src': ["'self'", "'unsafe-inline'"],
|
|
74
|
+
'img-src': ["'self'", 'data:']
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
coep: true // require-corp default
|
|
78
|
+
});
|
|
79
|
+
app.use(securityHeaders);
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`csp: { directives: {...} }` is required when opting in — `csp: {}`
|
|
83
|
+
or `csp: true` will throw at factory call time (CSP needs directives,
|
|
84
|
+
this is a config error). Use `csp: false` (or omit the key) to keep
|
|
85
|
+
CSP off.
|
|
86
|
+
|
|
87
|
+
### Opt out of a safe-set plugin
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
var securityHeaders = require('gina').plugins.SecurityHeaders({
|
|
91
|
+
hsts: false // HTTP-only bundle — HSTS is a no-op anyway
|
|
92
|
+
});
|
|
93
|
+
app.use(securityHeaders);
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Per-sub-config `false` (or `null`) skips that plugin even when it's
|
|
97
|
+
in the safe set. Useful for:
|
|
98
|
+
|
|
99
|
+
- HTTP-only bundles (skip HSTS)
|
|
100
|
+
- Bundles relying on `document.domain` (skip OriginAgentCluster)
|
|
101
|
+
- Multi-domain bundles with permissive cross-origin needs (skip Coop /
|
|
102
|
+
Corp, set explicit policy elsewhere)
|
|
103
|
+
|
|
104
|
+
### Override defaults on a safe-set plugin
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
var securityHeaders = require('gina').plugins.SecurityHeaders({
|
|
108
|
+
xFrameOptions: { value: 'DENY' }, // override SAMEORIGIN default
|
|
109
|
+
referrerPolicy: { value: 'no-referrer' },
|
|
110
|
+
hsts: { maxAge: 31536000, includeSubDomains: true, preload: true }
|
|
111
|
+
});
|
|
112
|
+
app.use(securityHeaders);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Sub-config objects replace the per-plugin defaults wholesale (shallow
|
|
116
|
+
merge — the standalone plugins' own settings.json reads still apply
|
|
117
|
+
underneath, see "Settings precedence" below).
|
|
118
|
+
|
|
119
|
+
## Configuration
|
|
120
|
+
|
|
121
|
+
In `bundles/<name>/config/settings.json`:
|
|
122
|
+
|
|
123
|
+
```jsonc
|
|
124
|
+
{
|
|
125
|
+
"securityHeaders": {
|
|
126
|
+
"xContentTypeOptions": true,
|
|
127
|
+
"xFrameOptions": { "value": "SAMEORIGIN" },
|
|
128
|
+
"referrerPolicy": { "value": "strict-origin-when-cross-origin" },
|
|
129
|
+
"hsts": { "maxAge": 15552000, "includeSubDomains": false, "preload": false },
|
|
130
|
+
"originAgentCluster": true,
|
|
131
|
+
"hidePoweredBy": true,
|
|
132
|
+
"xDnsPrefetchControl": { "value": "off" },
|
|
133
|
+
"xXssProtection": true,
|
|
134
|
+
"xDownloadOptions": true,
|
|
135
|
+
"xPermittedCrossDomainPolicies": { "value": "none" },
|
|
136
|
+
"coop": { "value": "same-origin" },
|
|
137
|
+
"corp": { "value": "same-origin" },
|
|
138
|
+
|
|
139
|
+
"csp": { "directives": { "default-src": ["'self'"] } },
|
|
140
|
+
"coep": { "value": "require-corp" }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
All sub-config keys are optional. Sub-configs absent from `settings.json`
|
|
146
|
+
fall back to the per-plugin defaults (safe-set plugins are mounted;
|
|
147
|
+
CSP / COEP stay opt-in-only).
|
|
148
|
+
|
|
149
|
+
### Per-sub-config shapes
|
|
150
|
+
|
|
151
|
+
| Sub-config key | Value shape | Mount behaviour |
|
|
152
|
+
|-----------------------------------|--------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
|
|
153
|
+
| `xContentTypeOptions` | `true` / `false` / `null` / `{}` | Default mount; `false` or `null` opts out |
|
|
154
|
+
| `xFrameOptions` | `{ value: 'DENY' \| 'SAMEORIGIN' }` / `true` / `false` / `null` / `{}` | Default mount with SAMEORIGIN |
|
|
155
|
+
| `referrerPolicy` | `{ value: '<one-of-8-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with strict-origin-when-cross-origin |
|
|
156
|
+
| `hsts` | `{ maxAge, includeSubDomains, preload }` / `true` / `false` / `null` / `{}` | Default mount with 180-day maxAge |
|
|
157
|
+
| `csp` | `{ directives: {...}, reportOnly: false }` / `false` / `null` | Opt-in only; throws on `{}` or `true` (no directives) |
|
|
158
|
+
| `coep` | `{ value: '<one-of-3-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Opt-in only; default require-corp |
|
|
159
|
+
| `originAgentCluster` | `true` / `false` / `null` / `{}` | Default mount |
|
|
160
|
+
| `hidePoweredBy` | `true` / `false` / `null` / `{}` | Default mount (Express engine only; Isaac engine writeHead path unaffected) |
|
|
161
|
+
| `xDnsPrefetchControl` | `{ value: 'on' \| 'off' }` / `true` / `false` / `null` / `{}` | Default mount with `off` |
|
|
162
|
+
| `xXssProtection` | `true` / `false` / `null` / `{}` | Default mount (emits literal `0` to DISABLE Chrome legacy auditor) |
|
|
163
|
+
| `xDownloadOptions` | `true` / `false` / `null` / `{}` | Default mount (emits `noopen`; IE-legacy) |
|
|
164
|
+
| `xPermittedCrossDomainPolicies` | `{ value: '<one-of-4-Adobe-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with `none` |
|
|
165
|
+
| `coop` | `{ value: '<one-of-4-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with same-origin |
|
|
166
|
+
| `corp` | `{ value: '<one-of-3-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with same-origin |
|
|
167
|
+
|
|
168
|
+
## Settings precedence
|
|
169
|
+
|
|
170
|
+
Three layers, lowest-to-highest:
|
|
171
|
+
|
|
172
|
+
1. **Per-plugin defaults** (in each plugin's source — e.g. `xFrameOptions` defaults to `SAMEORIGIN`).
|
|
173
|
+
2. **`settings.json > <key>.*`** (each standalone plugin reads its own settings key — e.g. `xFrameOptions.value` in `settings.json`).
|
|
174
|
+
3. **`settings.json > securityHeaders.<key>.*`** (the wrapper reads this and passes to the per-plugin factory).
|
|
175
|
+
4. **Wrapper opts (`SecurityHeaders({...})`)** (caller opts override everything).
|
|
176
|
+
|
|
177
|
+
The wrapper passes its resolved sub-config to each per-plugin factory
|
|
178
|
+
as `opts`. The per-plugin factory merges its own settings reads, then
|
|
179
|
+
those opts win.
|
|
180
|
+
|
|
181
|
+
## Power-user escape hatch — individual plugins still mountable
|
|
182
|
+
|
|
183
|
+
The standalone plugins continue to work independently:
|
|
184
|
+
|
|
185
|
+
```js
|
|
186
|
+
var csp = require('gina').plugins.Csp({
|
|
187
|
+
directives: {
|
|
188
|
+
'default-src': ["'self'"],
|
|
189
|
+
'script-src': ["'self'", "'nonce-XXXXX'"]
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
app.use(csp);
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Each plugin uses the **idempotent first-writer-wins** pattern (via
|
|
196
|
+
`res.getHeader`), so stacking the wrapper with an upstream individual
|
|
197
|
+
mount produces no double-emit — the first one to set the header wins,
|
|
198
|
+
the second skips.
|
|
199
|
+
|
|
200
|
+
This means you can mix-and-match: use `SecurityHeaders()` for the
|
|
201
|
+
seven safe-set plugins, mount `gina.plugins.Csp()` separately with a
|
|
202
|
+
per-request nonce, mount nothing for COEP. All three behaviours
|
|
203
|
+
coexist cleanly.
|
|
204
|
+
|
|
205
|
+
## Per-sub-plugin references
|
|
206
|
+
|
|
207
|
+
For the full details on each per-header plugin's behaviour, tradeoffs,
|
|
208
|
+
and failure modes, see the standalone READMEs:
|
|
209
|
+
|
|
210
|
+
- [`gina-core-plugin-x-content-type-options`](../x-content-type-options/README.md) (HDR1)
|
|
211
|
+
- [`gina-core-plugin-x-frame-options`](../x-frame-options/README.md) (HDR2)
|
|
212
|
+
- [`gina-core-plugin-referrer-policy`](../referrer-policy/README.md) (HDR3)
|
|
213
|
+
- [`gina-core-plugin-hsts`](../hsts/README.md) (HDR4)
|
|
214
|
+
- [`gina-core-plugin-csp`](../csp/README.md) (HDR5)
|
|
215
|
+
- [`gina-core-plugin-coep`](../coep/README.md) (HDR6)
|
|
216
|
+
- [`gina-core-plugin-origin-agent-cluster`](../origin-agent-cluster/README.md) (HDR7)
|
|
217
|
+
- [`gina-core-plugin-hide-powered-by`](../hide-powered-by/README.md) (HDR8)
|
|
218
|
+
- [`gina-core-plugin-x-dns-prefetch-control`](../x-dns-prefetch-control/README.md) (HDR9)
|
|
219
|
+
- [`gina-core-plugin-x-xss-protection`](../x-xss-protection/README.md) (HDR10)
|
|
220
|
+
- [`gina-core-plugin-x-download-options`](../x-download-options/README.md) (HDR11)
|
|
221
|
+
- [`gina-core-plugin-x-permitted-cross-domain-policies`](../x-permitted-cross-domain-policies/README.md) (HDR12)
|
|
222
|
+
- [`gina-core-plugin-coop`](../coop/README.md) (HDR13)
|
|
223
|
+
- [`gina-core-plugin-corp`](../corp/README.md) (HDR14)
|
|
224
|
+
|
|
225
|
+
## Failure modes
|
|
226
|
+
|
|
227
|
+
| Condition | Outcome |
|
|
228
|
+
|----------------------------------------------------------------------------|-------------------------------------------------------------------------------|
|
|
229
|
+
| Plugin not registered | No security headers emitted; browsers apply their built-in defaults |
|
|
230
|
+
| `SecurityHeaders()` with no opts | Safe-set mounted (HDR1/2/3/4/7/13/14); CSP and COEP skipped |
|
|
231
|
+
| Sub-config = `false` or `null` | That plugin skipped — explicit opt-out |
|
|
232
|
+
| Sub-config = `true` | That plugin mounted with per-plugin defaults (boolean shorthand) |
|
|
233
|
+
| Sub-config = `{}` | Same as `true` for safe-set plugins. CSP throws (directives required); COEP mounts with `require-corp` default. |
|
|
234
|
+
| Sub-config = object with invalid keys/values | Per-plugin factory throws at call time (matches standalone behaviour) |
|
|
235
|
+
| Sub-config = string / number / array / function | Wrapper throws at call time with the offending sub-config key in the message |
|
|
236
|
+
| Header already set by an earlier middleware | Existing value preserved (idempotent first-writer-wins, per-plugin) |
|
|
237
|
+
| Response already sent (`res.headersSent === true`) | Node's `setHeader` no-ops; request resumes |
|
|
238
|
+
| Stacked with an upstream individual `gina.plugins.<X>` mount | First writer wins; the second skip is a no-op |
|
|
239
|
+
|
|
240
|
+
The fail-fast posture (throws at factory call time for invalid
|
|
241
|
+
sub-configs) is inherited from each per-plugin factory. A
|
|
242
|
+
misconfigured bundle won't start — the throw points at the specific
|
|
243
|
+
sub-config that's wrong, with the plugin's standalone error message.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Cross-Origin-Embedder-Policy Plugin (#HDR6)
|
|
2
|
+
|
|
3
|
+
Opt-in middleware that sets the `Cross-Origin-Embedder-Policy` (COEP)
|
|
4
|
+
response header on every response, controlling which cross-origin
|
|
5
|
+
resources the page may embed.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
COEP is half of the "cross-origin isolation" pair (the other half is
|
|
10
|
+
`Cross-Origin-Opener-Policy` / #HDR13). Setting both to their strictest
|
|
11
|
+
values (`COEP: require-corp` + `COOP: same-origin`) unlocks features
|
|
12
|
+
that browsers gate behind cross-origin isolation:
|
|
13
|
+
|
|
14
|
+
- `SharedArrayBuffer` — required by WebAssembly threads, `OffscreenCanvas`
|
|
15
|
+
with multi-threaded rendering, and any code that needs zero-copy
|
|
16
|
+
shared memory between worker threads.
|
|
17
|
+
- High-resolution `performance.now()` — sub-millisecond timer precision
|
|
18
|
+
needed for accurate performance profiling. Without isolation, browsers
|
|
19
|
+
coarsen the resolution to mitigate Spectre side-channel attacks.
|
|
20
|
+
|
|
21
|
+
COEP also independently provides defense-in-depth against cross-site
|
|
22
|
+
script injection: with `require-corp` set, the browser refuses to
|
|
23
|
+
load any cross-origin resource that doesn't explicitly opt in via
|
|
24
|
+
`Cross-Origin-Resource-Policy` (CORP) or CORS. An attacker who can
|
|
25
|
+
inject a `<script src="https://evil.com/x.js">` tag can't load the
|
|
26
|
+
script unless evil.com returns the matching CORP or CORS header.
|
|
27
|
+
|
|
28
|
+
Browser support: Chrome 83+, Edge 83+, Firefox 79+, Safari 15.2+.
|
|
29
|
+
|
|
30
|
+
## Adoption
|
|
31
|
+
|
|
32
|
+
One block in the bundle bootstrap (`bundles/<name>/index.js`):
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
var myapp = require('gina');
|
|
36
|
+
var coep = require('gina').plugins.Coep();
|
|
37
|
+
|
|
38
|
+
myapp.onInitialize(function(event, app) {
|
|
39
|
+
app.use(coep);
|
|
40
|
+
event.emit('complete', app);
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Order with other gina security plugins does not matter — the header is
|
|
45
|
+
emitted on the response, not consumed from the request.
|
|
46
|
+
|
|
47
|
+
## Configuration
|
|
48
|
+
|
|
49
|
+
In `bundles/<name>/config/settings.json`:
|
|
50
|
+
|
|
51
|
+
```jsonc
|
|
52
|
+
{
|
|
53
|
+
"coep": {
|
|
54
|
+
"value": "require-corp"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Field | Type | Default | Valid values |
|
|
60
|
+
|---------|--------|----------------|----------------------------------------------------|
|
|
61
|
+
| `value` | string | `require-corp` | `require-corp`, `credentialless`, `unsafe-none` |
|
|
62
|
+
|
|
63
|
+
### Three values per the W3C HTML spec
|
|
64
|
+
|
|
65
|
+
| Token | Behaviour |
|
|
66
|
+
|------------------|--------------------------------------------------------------------------------------------|
|
|
67
|
+
| `require-corp` | **Default**. Cross-origin resources must opt-in via CORP or CORS, otherwise blocked. Required (paired with `COOP: same-origin`) for `SharedArrayBuffer` and high-res `performance.now()`. |
|
|
68
|
+
| `credentialless` | Cross-origin no-CORS requests sent WITHOUT credentials (cookies, HTTP auth). Less restrictive than `require-corp` but still gates the cross-origin-isolation combo. |
|
|
69
|
+
| `unsafe-none` | Browser default. No restrictions; equivalent to not setting the header. Use to explicitly opt OUT (e.g. to override a stricter upstream default). |
|
|
70
|
+
|
|
71
|
+
Caller-supplied options always win over settings:
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
var coep = require('gina').plugins.Coep({ value: 'credentialless' });
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Tokens are case-insensitive at this layer — values are normalised to
|
|
78
|
+
lowercase before validation and emission. The spec defines them as
|
|
79
|
+
lowercase enumerated strings; browsers parse case-sensitively, so the
|
|
80
|
+
emitted header is always lowercase.
|
|
81
|
+
|
|
82
|
+
## Tradeoff with the `require-corp` default
|
|
83
|
+
|
|
84
|
+
The strict default `require-corp` enables the SharedArrayBuffer +
|
|
85
|
+
cross-origin-isolation combo, but BREAKS pages that load cross-origin
|
|
86
|
+
resources (images, fonts, scripts on a CDN, embedded videos) that
|
|
87
|
+
don't carry the matching `Cross-Origin-Resource-Policy` (CORP) or
|
|
88
|
+
CORS header. Symptoms: blocked resources appear as failed network
|
|
89
|
+
requests in DevTools with a
|
|
90
|
+
`NotSameOriginAfterDefaultedToSameOriginByCoep` error.
|
|
91
|
+
|
|
92
|
+
Options when `require-corp` breaks an embed:
|
|
93
|
+
|
|
94
|
+
1. **Set CORP on the embedded resource** (preferred) — if you control
|
|
95
|
+
the origin serving the embed, add `Cross-Origin-Resource-Policy:
|
|
96
|
+
cross-origin` (or use #HDR14 `gina.plugins.Corp()` on that bundle).
|
|
97
|
+
2. **Downgrade to `credentialless`** — cookies and HTTP auth are
|
|
98
|
+
stripped on cross-origin no-CORS requests, but no explicit CORP
|
|
99
|
+
header is required. Compatible with most public CDN content
|
|
100
|
+
(fonts, images) that don't need credentials.
|
|
101
|
+
3. **Downgrade to `unsafe-none`** — gives up cross-origin isolation
|
|
102
|
+
entirely. The page can embed anything but loses SharedArrayBuffer
|
|
103
|
+
and high-res timers.
|
|
104
|
+
|
|
105
|
+
## Pair with COOP for the SharedArrayBuffer combo
|
|
106
|
+
|
|
107
|
+
To enable `SharedArrayBuffer` and the rest of the
|
|
108
|
+
cross-origin-isolated-context features, register BOTH plugins together:
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
var coep = require('gina').plugins.Coep(); // require-corp (default)
|
|
112
|
+
var coop = require('gina').plugins.Coop({ value: 'same-origin' }); // default
|
|
113
|
+
app.use(coep);
|
|
114
|
+
app.use(coop);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The page becomes cross-origin-isolated and `window.crossOriginIsolated`
|
|
118
|
+
returns `true`. See the W3C HTML spec section on
|
|
119
|
+
[cross-origin isolation](https://html.spec.whatwg.org/multipage/browsers.html#cross-origin-isolated)
|
|
120
|
+
for the full feature gate.
|
|
121
|
+
|
|
122
|
+
## Failure modes
|
|
123
|
+
|
|
124
|
+
| Condition | Outcome |
|
|
125
|
+
|----------------------------------------------------------|------------------------------------------------------|
|
|
126
|
+
| `value` omitted | Defaults to `require-corp` |
|
|
127
|
+
| `value` is not one of the 3 W3C tokens | Factory throws at call time (bundle won't start) |
|
|
128
|
+
| Plugin not registered | Header not emitted; browser uses default behaviour |
|
|
129
|
+
| Header already set by an earlier middleware | Existing value preserved (idempotent) |
|
|
130
|
+
| Response already sent (`res.headersSent === true`) | Node's `setHeader` no-ops; request resumes |
|
|
131
|
+
|
|
132
|
+
The idempotent behaviour makes the plugin safe to register more than
|
|
133
|
+
once or alongside another middleware that emits the same header — the
|
|
134
|
+
first writer wins.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gina-core-plugin-coep",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Cross-Origin-Embedder-Policy response header middleware (#HDR6)",
|
|
5
|
+
"authors": [
|
|
6
|
+
{
|
|
7
|
+
"name": "Martin-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
|
+
}
|