gina 0.6.3 → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +32 -40
- package/ROADMAP.md +3 -1
- package/framework/v0.6.4/VERSION +1 -0
- package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/css/gina.min.css +1 -0
- package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/js/gina.js +1522 -79
- package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js +640 -0
- package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.6.3 → v0.6.4}/core/config.js +22 -4
- package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.js +62 -2
- package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.render-nunjucks.js +11 -3
- package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.render-swig.js +15 -1
- package/framework/{v0.6.3 → v0.6.4}/core/gna.js +33 -1
- package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/validator/src/main.js +892 -21
- package/framework/{v0.6.3 → v0.6.4}/core/server.js +60 -2
- package/framework/v0.6.4/core/template/_gitignore +27 -0
- package/framework/{v0.6.3 → v0.6.4}/lib/cmd/secrets/arguments.json +1 -0
- package/framework/v0.6.4/lib/cmd/secrets/check.js +861 -0
- package/framework/{v0.6.3 → v0.6.4}/lib/cmd/secrets/help.txt +29 -5
- package/framework/v0.6.4/lib/loading-state/package.json +7 -0
- package/framework/v0.6.4/lib/loading-state/src/main.js +366 -0
- package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/containers/mq/listener.js +23 -0
- package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/containers/mq/speaker.js +27 -0
- package/framework/v0.6.4/lib/secrets/src/backends/file.js +180 -0
- package/framework/v0.6.4/lib/secrets/src/env-file.js +220 -0
- package/framework/{v0.6.3 → v0.6.4}/lib/secrets/src/main.js +84 -1
- package/framework/{v0.6.3 → v0.6.4}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +7 -7
- package/package.json +3 -3
- package/schema/settings.json +14 -0
- package/framework/v0.6.3/VERSION +0 -1
- package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -1
- package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -625
- package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/v0.6.3/core/template/_gitignore +0 -19
- package/framework/v0.6.3/lib/cmd/secrets/check.js +0 -507
- /package/framework/{v0.6.3 → v0.6.4}/AUTHORS +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/LICENSE +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/html/static.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/duckdb/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/duckdb/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/mongodb/lib/job-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/redis/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/redis/lib/job-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/redis/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/sqlite/lib/job-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/content.encoding +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/controller/release-banner.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/dev/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/locales/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/locales/currency.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/locales/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/mime.types +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/model/entity.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/model/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/model/template/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/router.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/server.express.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/server.isaac.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/status.codes +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/conf/env.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/conf/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/console.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/context.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/data/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/data/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/json/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/json/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/path.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/prototypes.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/task.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/helpers/text.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/admin/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/archiver/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/archiver/build.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/archiver/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/async/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/async/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/audit/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/audit/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/audit-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/authn/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/authn/src/lockout.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/authn/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/authn/src/totp.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/authz-gate/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/authz-gate/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cache/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cache/build.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cache/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/audit/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/audit/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/audit/verify.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/man.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/bundle/types.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/cache/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/cache/clear.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/cache/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/infer.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/models.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/connector/test.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/container/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/container/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/container/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/container/man.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/container/ps.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/container/stop.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/inc/args.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/inc/namespace.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/inc/reference-scan.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/inc/scaffold.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/rename.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/controller/rm.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/man.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/reset.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/_host.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/build.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/man.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/rm.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/image/run.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/man-render.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/backup.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/man.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/restore.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/service/man.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/collection/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/collection/build.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/collection/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/config.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/connector-config/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/connector-config/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/connector-error/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/connector-error/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cron/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cron/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/domain/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/domain/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/dto/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/dto/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/dto-pipe/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/dto-pipe/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/dto-types/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/dto-types/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/generator/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/i18n/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/image-build/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/image-build/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inherits/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inherits/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inspector-events/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inspector-events/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/instrument/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/job/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/job/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/job-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/json-config-header/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/json-config-header/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/math/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/merge/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/merge/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/metrics/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/model.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/net-locality/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/net-locality/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/proc.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/release-watch/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/release-watch/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/render-cache/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/render-cache/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/render-cache-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/routing/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/routing/build.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/routing/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/secrets/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/session-store.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/shell.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/sqlite-driver.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/state.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/url/README.md +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/url/index.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/url/routing.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/uuid/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/validator.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/watcher/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/ws-query/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/ws-query/src/main.js +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.6.3 → v0.6.4}/lib/ws-session/src/main.js +0 -0
|
@@ -0,0 +1,861 @@
|
|
|
1
|
+
var fs = require('fs');
|
|
2
|
+
var console = lib.logger;
|
|
3
|
+
|
|
4
|
+
var CmdHelper = require('./../helper');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @module gina/lib/cmd/secrets/check
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Enumerates the `${secret:KEY}` placeholders each bundle requires (same
|
|
11
|
+
* walk as `secrets:scan`) and cross-references the *current* `process.env`,
|
|
12
|
+
* reporting each key as `SET` or `UNSET`. Exits non-zero when any required
|
|
13
|
+
* key is unset, so it can gate a CI / pre-deploy step.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* gina secrets:check
|
|
17
|
+
* gina secrets:check @<project>
|
|
18
|
+
* gina secrets:check <bundle> @<project>
|
|
19
|
+
* gina secrets:check @<project> --format=json
|
|
20
|
+
* gina secrets:check @<project> --scope=<scope>
|
|
21
|
+
* gina secrets:check @<project> --scope=<scope> --env-file=<path>
|
|
22
|
+
*
|
|
23
|
+
* "Set" matches the env backend's fail-closed rule exactly: a key counts
|
|
24
|
+
* as satisfied only when its value is a **non-empty string** — the same
|
|
25
|
+
* condition under which `secrets.resolve()` would succeed at bundle start.
|
|
26
|
+
* So an `UNSET` here is precisely a key that would throw at load.
|
|
27
|
+
*
|
|
28
|
+
* `--scope=<s>`: enumerate the *effective* keys for that scope by read-only
|
|
29
|
+
* overlaying the sibling `config_<s>/` dirs over the base (see `secrets:scan`).
|
|
30
|
+
* `--env-file=<path>`: stand in for the live `process.env` — e.g. a decrypted
|
|
31
|
+
* SOPS export or a CI-exported env. It occupies the *environment tier*, which
|
|
32
|
+
* outranks the file tier below, so an explicit file still wins.
|
|
33
|
+
*
|
|
34
|
+
* Two tiers, because the runtime has two. Since the file backend shipped, a
|
|
35
|
+
* bundle may declare `settings.secrets.file`, and `core/config.js` resolves
|
|
36
|
+
* placeholders against the environment first and those files second. Checking
|
|
37
|
+
* the environment alone therefore reported `UNSET` for a key the bundle would
|
|
38
|
+
* have started with — a false alarm on the very gate that exists to prevent
|
|
39
|
+
* surprises. This command now resolves the bundle's declared chain with the
|
|
40
|
+
* same `whisper` dictionary the runtime uses and consults it as the lower
|
|
41
|
+
* tier, so the two sides cannot disagree about what a file means (they share
|
|
42
|
+
* `lib/secrets`'s parser) nor about where it lives (they share the token
|
|
43
|
+
* substitution).
|
|
44
|
+
*
|
|
45
|
+
* Caveat: without `--env-file` this checks the env of THIS CLI process, not a
|
|
46
|
+
* detached bundle's runtime/container environment. Real value: a CI step that
|
|
47
|
+
* exports (or decrypts) the scope's secrets and runs `secrets:check --scope=…
|
|
48
|
+
* --env-file=…` before shipping. It cannot introspect an already-running
|
|
49
|
+
* bundle's env.
|
|
50
|
+
*
|
|
51
|
+
* Second caveat, and the reason the report names its assumptions: `${scope}`
|
|
52
|
+
* and `${env}` are *launch-time* values. The runtime reads `NODE_SCOPE` /
|
|
53
|
+
* `NODE_ENV` from whatever started the bundle; this process can only see
|
|
54
|
+
* `--scope` / `--env` or the project defaults. When a declared path embeds a
|
|
55
|
+
* token this command cannot resolve, it says so and skips the file tier
|
|
56
|
+
* rather than statting a literally-named path — which can only make the gate
|
|
57
|
+
* stricter than the runtime, never laxer.
|
|
58
|
+
*
|
|
59
|
+
* @class Check
|
|
60
|
+
* @constructor
|
|
61
|
+
* @param {object} opt - Parsed command-line options
|
|
62
|
+
* @param {object} opt.client - Socket client for terminal output
|
|
63
|
+
* @param {string[]} opt.argv - Full argv array
|
|
64
|
+
* @param {number} [opt.debugPort] - Node.js inspector port
|
|
65
|
+
* @param {boolean} [opt.debugBrkEnabled] - True when --inspect-brk is active
|
|
66
|
+
* @param {object} cmd - The cmd dispatcher object (lib/cmd/index.js)
|
|
67
|
+
*/
|
|
68
|
+
function Check(opt, cmd) {
|
|
69
|
+
var self = { format: 'text', anyUnset: false, scopeName: null, envName: null, envFile: null, envMap: null };
|
|
70
|
+
|
|
71
|
+
var secrets = lib.secrets;
|
|
72
|
+
var merge = lib.merge;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Matches any `${…}` token the substitution pass did not resolve. Mirrors
|
|
76
|
+
* the guard in `lib/secrets/src/main.js` so this command rejects exactly
|
|
77
|
+
* what the runtime would reject.
|
|
78
|
+
*
|
|
79
|
+
* @inner
|
|
80
|
+
* @constant
|
|
81
|
+
* @type {RegExp}
|
|
82
|
+
*/
|
|
83
|
+
var UNRESOLVED_TOKEN = /\$\{[^}]*\}/;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Config files are JSON. The loader globs every `.json` in a config
|
|
87
|
+
* dir; this matches that, then drops dotfiles and `* copy` siblings.
|
|
88
|
+
*
|
|
89
|
+
* @inner
|
|
90
|
+
* @constant
|
|
91
|
+
* @type {RegExp}
|
|
92
|
+
*/
|
|
93
|
+
var JSON_EXT = /\.json$/;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Parses `--format`, resolves project + optional bundle via CmdHelper,
|
|
97
|
+
* dispatches to the right checker, and exits non-zero if any required
|
|
98
|
+
* secret is unset.
|
|
99
|
+
*
|
|
100
|
+
* @inner
|
|
101
|
+
* @private
|
|
102
|
+
*/
|
|
103
|
+
var init = function () {
|
|
104
|
+
new CmdHelper(self, opt.client, { port: opt.debugPort, brkEnabled: opt.debugBrkEnabled });
|
|
105
|
+
if ( !isCmdConfigured() ) return false;
|
|
106
|
+
|
|
107
|
+
self.anyUnset = false;
|
|
108
|
+
|
|
109
|
+
for (var i = 3, len = process.argv.length; i < len; i++) {
|
|
110
|
+
var arg = process.argv[i];
|
|
111
|
+
if ( /^\-\-format\=/.test(arg) ) {
|
|
112
|
+
self.format = arg.split(/\=/)[1] || 'text';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (self.format !== 'text' && self.format !== 'json') {
|
|
116
|
+
console.error('--format must be `text` or `json` (got `' + self.format + '`)');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// --scope + --env-file are declared in arguments.json and captured into
|
|
122
|
+
// self.params by CmdHelper (filterArgs skips them for GINA_ mapping but
|
|
123
|
+
// leaves them in argv for getParams — same path bundle:* --scope uses).
|
|
124
|
+
self.scopeName = (self.params && self.params.scope) ? self.params.scope : null;
|
|
125
|
+
self.envFile = (self.params && self.params['env-file']) ? self.params['env-file'] : null;
|
|
126
|
+
// `--env` is not one of the task prefixes CmdHelper re-applies to
|
|
127
|
+
// `defaultEnv` (it does that only for start/stop/restart/build/deploy),
|
|
128
|
+
// so read it off params exactly as --scope is read above. It is needed
|
|
129
|
+
// because a project declares `homedir` per bundle AND per env.
|
|
130
|
+
self.envName = (self.params && self.params.env) ? self.params.env : (self.defaultEnv || null);
|
|
131
|
+
// The scope a declared `secrets.file` path is resolved WITH is a
|
|
132
|
+
// separate concern from `self.scopeName`, which selects the read-only
|
|
133
|
+
// `config_<scope>/` overlay. Defaulting `scopeName` itself would start
|
|
134
|
+
// applying that overlay to every bare `scan`/`check` — a behaviour
|
|
135
|
+
// change nobody asked for — so the assumed scope lives in its own slot
|
|
136
|
+
// and falls back to the project default, matching what the runtime
|
|
137
|
+
// would use when no launcher overrides NODE_SCOPE.
|
|
138
|
+
self.scopeAssumed = self.scopeName || self.defaultScope || null;
|
|
139
|
+
if (self.envFile) {
|
|
140
|
+
self.envMap = loadEnvFile(_(self.envFile, true));
|
|
141
|
+
if (self.envMap === null) {
|
|
142
|
+
console.error('--env-file not readable: ' + self.envFile);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
var bundleFilter = self.name || null;
|
|
149
|
+
|
|
150
|
+
if ( typeof(self.projectName) == 'undefined' || self.projectName == null ) {
|
|
151
|
+
if (bundleFilter) {
|
|
152
|
+
console.error('`secrets:check <bundle>` requires `@<project>`. Did you forget `@<project_name>`?');
|
|
153
|
+
process.exit(1);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
checkAll();
|
|
157
|
+
process.exit(self.anyUnset ? 1 : 0);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if ( typeof(self.projects[self.projectName]) == 'undefined' ) {
|
|
162
|
+
console.error('Project @' + self.projectName + ' is not registered. Run `gina project:list` to see registered projects.');
|
|
163
|
+
process.exit(1);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (bundleFilter) {
|
|
168
|
+
var manifest = loadManifest(self.projects[self.projectName].path);
|
|
169
|
+
if (manifest && manifest.bundles && !manifest.bundles[bundleFilter]) {
|
|
170
|
+
console.error('Bundle [ ' + bundleFilter + ' ] is not registered inside `@' + self.projectName + '`.');
|
|
171
|
+
process.exit(1);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
checkBundleOnly(self.projectName, bundleFilter);
|
|
175
|
+
} else {
|
|
176
|
+
checkProjectOnly(self.projectName);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
process.exit(self.anyUnset ? 1 : 0);
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Reads a JSON file with comment tolerance via `requireJSON`. Returns
|
|
184
|
+
* `null` on any I/O or parse error.
|
|
185
|
+
*
|
|
186
|
+
* @inner
|
|
187
|
+
* @private
|
|
188
|
+
* @param {string} filePath
|
|
189
|
+
* @returns {object|null}
|
|
190
|
+
*/
|
|
191
|
+
var readJsonSafe = function (filePath) {
|
|
192
|
+
try {
|
|
193
|
+
if ( !fs.existsSync(filePath) ) return null;
|
|
194
|
+
return requireJSON(filePath);
|
|
195
|
+
} catch (e) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Parses a `.env`-style file into a `{ KEY: value }` map. Lines are
|
|
202
|
+
* `KEY=value`; blank lines and `#` comments are skipped, an optional
|
|
203
|
+
* `export ` prefix is stripped, and surrounding single/double quotes are
|
|
204
|
+
* removed. Returns `null` when the file cannot be read (so the caller can
|
|
205
|
+
* surface the error). Used by `--env-file`: validate a scope's exported /
|
|
206
|
+
* decrypted env (e.g. SOPS output) instead of the live `process.env`.
|
|
207
|
+
*
|
|
208
|
+
* Delegates to `lib.secrets.parseEnvFile` rather than parsing here: this
|
|
209
|
+
* handler answers "would a bundle started here resolve its placeholders?",
|
|
210
|
+
* so it must read a file byte-for-byte the way the runtime resolver would.
|
|
211
|
+
* A second copy of the parser could drift on a quoted value or a CRLF line
|
|
212
|
+
* ending and report a clean bill of health for a file the runtime then
|
|
213
|
+
* read differently — the exact false-green this command exists to prevent.
|
|
214
|
+
*
|
|
215
|
+
* @inner
|
|
216
|
+
* @private
|
|
217
|
+
* @param {string} filePath
|
|
218
|
+
* @returns {Object<string,string>|null}
|
|
219
|
+
*/
|
|
220
|
+
var loadEnvFile = function (filePath) {
|
|
221
|
+
return secrets.parseEnvFile(filePath);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Reads one named config file with the `--scope` overlay applied, using
|
|
226
|
+
* the same merge direction as `collectKeysFromConfigDir` (scope wins,
|
|
227
|
+
* base back-fills, `override=false` stated explicitly).
|
|
228
|
+
*
|
|
229
|
+
* @inner
|
|
230
|
+
* @private
|
|
231
|
+
* @param {string} absDir - Absolute base config directory
|
|
232
|
+
* @param {string} name - File name, e.g. `settings.json`
|
|
233
|
+
* @returns {object|null}
|
|
234
|
+
*/
|
|
235
|
+
var readScopedConfig = function (absDir, name) {
|
|
236
|
+
var base = readJsonSafe(_(absDir + '/' + name, true));
|
|
237
|
+
var scope = self.scopeName
|
|
238
|
+
? readJsonSafe(_(absDir + '_' + self.scopeName + '/' + name, true))
|
|
239
|
+
: null;
|
|
240
|
+
if (!scope) return base;
|
|
241
|
+
return merge(JSON.clone(scope), base || {}, false);
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* The effective `settings.json` for a bundle — `shared/config/` first with
|
|
246
|
+
* the bundle's own on top. That direction mirrors the loader, which does
|
|
247
|
+
* `merge(sharedMain, jsonFile, true)` (`core/config.js`): the bundle's own
|
|
248
|
+
* file wins on a conflicting key. Both sides get the `--scope` overlay.
|
|
249
|
+
*
|
|
250
|
+
* @inner
|
|
251
|
+
* @private
|
|
252
|
+
* @param {string} projectPath
|
|
253
|
+
* @param {object|null} manifest
|
|
254
|
+
* @param {string} bundleName
|
|
255
|
+
* @returns {object|null}
|
|
256
|
+
*/
|
|
257
|
+
var readEffectiveSettings = function (projectPath, manifest, bundleName) {
|
|
258
|
+
var bundleSrc = resolveBundleSrc(manifest, bundleName);
|
|
259
|
+
var shared = readScopedConfig(_(projectPath + '/shared/config', true), 'settings.json');
|
|
260
|
+
var own = readScopedConfig(_(projectPath + '/' + bundleSrc + '/config', true), 'settings.json');
|
|
261
|
+
if (!shared) return own;
|
|
262
|
+
if (!own) return shared;
|
|
263
|
+
return merge(JSON.clone(shared), own, true);
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Rebuilds the subset of the runtime's substitution dictionary that a
|
|
268
|
+
* secrets-file path may legitimately use. Deliberately partial: only keys
|
|
269
|
+
* whose value this process can derive to the *same string* the runtime
|
|
270
|
+
* derives are included.
|
|
271
|
+
*
|
|
272
|
+
* A key is set only when its value is a non-empty string. That is not
|
|
273
|
+
* defensive tidiness — it is the contract. An absent key leaves its token
|
|
274
|
+
* verbatim, which the caller then rejects loudly; an **empty** value is
|
|
275
|
+
* substituted silently, so `${scope}` with `scope: ''` would collapse
|
|
276
|
+
* `<home>/<scope>/secrets.env` to the base path and read the wrong file
|
|
277
|
+
* without a word.
|
|
278
|
+
*
|
|
279
|
+
* `homedir` is read from the project's own `env.json` (`<bundle>.<env>`),
|
|
280
|
+
* falling back to the framework template's `~/.<projectName>` — the same
|
|
281
|
+
* two sources, in the same order, as `core/config.js`. It is emphatically
|
|
282
|
+
* NOT `projects.json`'s `homedir` field: that is a CLI-level concept the
|
|
283
|
+
* config loader never reads, and using it here would put this command on a
|
|
284
|
+
* different path from the bundle it is meant to be validating.
|
|
285
|
+
*
|
|
286
|
+
* @inner
|
|
287
|
+
* @private
|
|
288
|
+
* @param {string} projectPath
|
|
289
|
+
* @param {object|null} manifest - The project manifest, for the version tokens
|
|
290
|
+
* @param {string} bundleName
|
|
291
|
+
* @returns {Object<string,string>}
|
|
292
|
+
*/
|
|
293
|
+
var buildReps = function (projectPath, manifest, bundleName) {
|
|
294
|
+
var reps = {};
|
|
295
|
+
var put = function (key, value) {
|
|
296
|
+
if (typeof value === 'string' && value !== '') reps[key] = value;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
// Resolve the name from the PATH rather than trusting `self.projectName`:
|
|
300
|
+
// the no-argument form iterates every registered project, and on that
|
|
301
|
+
// branch `self.projectName` is undefined by definition. Using it there
|
|
302
|
+
// built `~/.undefined` — a real, stat-able, wrong path that reported
|
|
303
|
+
// every layer ABSENT instead of failing loudly.
|
|
304
|
+
var projectName = self.projectName;
|
|
305
|
+
for (var pn in (self.projects || {})) {
|
|
306
|
+
if (self.projects[pn] && self.projects[pn].path === projectPath) {
|
|
307
|
+
projectName = pn;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
put('projectName', projectName);
|
|
313
|
+
// `${project}` is the project's PATH, not its name (getPath('project')).
|
|
314
|
+
put('project', projectPath);
|
|
315
|
+
put('projectPath', projectPath);
|
|
316
|
+
put('executionPath', projectPath);
|
|
317
|
+
put('root', projectPath);
|
|
318
|
+
put('bundle', bundleName);
|
|
319
|
+
put('frameworkDir', (typeof getEnvVar === 'function') ? getEnvVar('GINA_FRAMEWORK_DIR') : null);
|
|
320
|
+
put('scope', self.scopeAssumed);
|
|
321
|
+
put('env', self.envName);
|
|
322
|
+
|
|
323
|
+
// Version tokens. The runtime gets these without listing them in the
|
|
324
|
+
// bundle-config dictionary: `core/template/conf/env.json` declares
|
|
325
|
+
// `projectVersion` / `projectVersionMajor` as per-bundle scalars, the
|
|
326
|
+
// env-loading pass resolves them from the manifest, and the scalar
|
|
327
|
+
// harvest then copies them into the dictionary that substitutes config.
|
|
328
|
+
// Omitting them here made a path like `${homedir}/v${projectVersionMajor}/…`
|
|
329
|
+
// unresolvable on this side while the bundle booted from it fine —
|
|
330
|
+
// the file tier would be skipped and its keys reported UNSET, which is
|
|
331
|
+
// the false alarm this command exists to prevent.
|
|
332
|
+
if (manifest && typeof manifest.version === 'string' && manifest.version !== '') {
|
|
333
|
+
put('projectVersion', manifest.version);
|
|
334
|
+
put('projectVersionMajor', manifest.version.split(/\./g)[0]);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
var declared = null;
|
|
338
|
+
var envData = readJsonSafe(_(projectPath + '/env.json', true));
|
|
339
|
+
if (envData && envData[bundleName] && envData[bundleName][self.envName]) {
|
|
340
|
+
declared = envData[bundleName][self.envName].homedir;
|
|
341
|
+
}
|
|
342
|
+
// `~` is expanded by whisper's own OS pass, not by `_()`, so the
|
|
343
|
+
// template default is handed over verbatim exactly as the loader does.
|
|
344
|
+
put('homedir', (typeof declared === 'string' && declared !== '')
|
|
345
|
+
? declared
|
|
346
|
+
: (projectName ? '~/.' + projectName : null));
|
|
347
|
+
|
|
348
|
+
return reps;
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Resolves a bundle's declared `settings.secrets.file` chain and layers the
|
|
353
|
+
* readable files into one map, later entries winning — the same ordering
|
|
354
|
+
* `lib/secrets/backends/file.js` applies.
|
|
355
|
+
*
|
|
356
|
+
* Validation mirrors `secrets.selectBackend` so this command accepts and
|
|
357
|
+
* rejects exactly what a boot would: a non-string or empty entry, a
|
|
358
|
+
* `${secret:…}` placeholder (unresolvable by definition — the backend that
|
|
359
|
+
* would resolve it is the one being built), and any token the dictionary
|
|
360
|
+
* did not know.
|
|
361
|
+
*
|
|
362
|
+
* @inner
|
|
363
|
+
* @private
|
|
364
|
+
* @param {string} projectPath
|
|
365
|
+
* @param {object|null} manifest
|
|
366
|
+
* @param {string} bundleName
|
|
367
|
+
* @returns {{declared:boolean, layers:Array<{path:string, found:boolean, unreadable:boolean, code:(string|null), keys:number}>, map:(object|null), origin:(object|null), errors:string[]}}
|
|
368
|
+
* A layer is `unreadable` when it exists but could not be opened (`code` is the
|
|
369
|
+
* `fs` error, e.g. `'EACCES'`). That case also pushes an entry onto `errors`,
|
|
370
|
+
* because the runtime refuses to boot on it (#B267) — reporting it as a mere
|
|
371
|
+
* absence would green-light a config that cannot start.
|
|
372
|
+
*/
|
|
373
|
+
var resolveSecretsFileChain = function (projectPath, manifest, bundleName) {
|
|
374
|
+
var out = { declared: false, layers: [], map: null, origin: null, errors: [] };
|
|
375
|
+
|
|
376
|
+
var settings = readEffectiveSettings(projectPath, manifest, bundleName);
|
|
377
|
+
var declared = (settings && settings.secrets && typeof settings.secrets === 'object')
|
|
378
|
+
? settings.secrets.file
|
|
379
|
+
: undefined;
|
|
380
|
+
if (typeof declared === 'undefined' || declared === null) return out;
|
|
381
|
+
|
|
382
|
+
var raw = Array.isArray(declared) ? declared : [declared];
|
|
383
|
+
if (!raw.length) return out;
|
|
384
|
+
out.declared = true;
|
|
385
|
+
|
|
386
|
+
for (var i = 0; i < raw.length; i++) {
|
|
387
|
+
if (typeof raw[i] !== 'string' || raw[i] === '') {
|
|
388
|
+
out.errors.push('`settings.secrets.file` must be a non-empty string or an array of them');
|
|
389
|
+
return out;
|
|
390
|
+
}
|
|
391
|
+
if (raw[i].indexOf('${secret:') > -1) {
|
|
392
|
+
out.errors.push('`settings.secrets.file` cannot contain a `${secret:…}` placeholder');
|
|
393
|
+
return out;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
var resolved;
|
|
398
|
+
try {
|
|
399
|
+
resolved = whisper(buildReps(projectPath, manifest, bundleName), JSON.clone(raw));
|
|
400
|
+
} catch (whisperErr) {
|
|
401
|
+
out.errors.push('could not substitute tokens in `settings.secrets.file`: ' + whisperErr.message);
|
|
402
|
+
return out;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
var map = Object.create(null);
|
|
406
|
+
var origin = Object.create(null);
|
|
407
|
+
for (var p = 0; p < resolved.length; p++) {
|
|
408
|
+
var path = resolved[p];
|
|
409
|
+
if (UNRESOLVED_TOKEN.test(path)) {
|
|
410
|
+
// Skip the whole tier rather than stat a literally-named path.
|
|
411
|
+
// Under-reading can only make this gate stricter than the
|
|
412
|
+
// runtime; guessing could make it laxer, which is the failure
|
|
413
|
+
// this command exists to prevent.
|
|
414
|
+
out.errors.push('unresolved token in `' + path + '`'
|
|
415
|
+
+ ' — pass --scope/--env if it names one, since the runtime'
|
|
416
|
+
+ ' reads those from whatever launches the bundle');
|
|
417
|
+
return out;
|
|
418
|
+
}
|
|
419
|
+
var layerRead = secrets.readEnvFile(path);
|
|
420
|
+
out.layers.push({
|
|
421
|
+
path : path,
|
|
422
|
+
found : layerRead.found,
|
|
423
|
+
unreadable : (!layerRead.found && layerRead.code !== 'ENOENT'),
|
|
424
|
+
code : layerRead.code,
|
|
425
|
+
keys : layerRead.found ? Object.keys(layerRead.map).length : 0
|
|
426
|
+
});
|
|
427
|
+
if (!layerRead.found) {
|
|
428
|
+
// #B267 parity — the runtime REFUSES to boot on a declared path that
|
|
429
|
+
// exists but cannot be read. Reporting that as a plain absence here
|
|
430
|
+
// would hand back a clean bill of health for a config that cannot
|
|
431
|
+
// boot at all, which is precisely the checker-vs-runtime disagreement
|
|
432
|
+
// this command exists to prevent.
|
|
433
|
+
if (layerRead.code !== 'ENOENT') {
|
|
434
|
+
out.errors.push('`' + path + '` exists but cannot be read ('
|
|
435
|
+
+ layerRead.code + ') — the runtime REFUSES to boot on this;'
|
|
436
|
+
+ ' fix the file permissions or ownership');
|
|
437
|
+
}
|
|
438
|
+
continue; // absent file: contributes nothing, not an error
|
|
439
|
+
}
|
|
440
|
+
for (var key in layerRead.map) {
|
|
441
|
+
map[key] = layerRead.map[key]; // later path wins
|
|
442
|
+
origin[key] = path;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
out.map = map;
|
|
447
|
+
out.origin = origin;
|
|
448
|
+
return out;
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Loads `<projectPath>/manifest.json`. Returns `null` on failure.
|
|
453
|
+
*
|
|
454
|
+
* @inner
|
|
455
|
+
* @private
|
|
456
|
+
* @param {string} projectPath
|
|
457
|
+
* @returns {object|null}
|
|
458
|
+
*/
|
|
459
|
+
var loadManifest = function (projectPath) {
|
|
460
|
+
return readJsonSafe(_(projectPath + '/manifest.json', true));
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Resolves a bundle's source-dir (relative to the project root) from
|
|
465
|
+
* the manifest, mirroring `bundle:openapi`. Falls back to the bundle
|
|
466
|
+
* name when `src` is absent.
|
|
467
|
+
*
|
|
468
|
+
* @inner
|
|
469
|
+
* @private
|
|
470
|
+
* @param {object|null} manifest
|
|
471
|
+
* @param {string} bundleName
|
|
472
|
+
* @returns {string}
|
|
473
|
+
*/
|
|
474
|
+
var resolveBundleSrc = function (manifest, bundleName) {
|
|
475
|
+
if ( manifest && manifest.bundles && manifest.bundles[bundleName] && manifest.bundles[bundleName].src ) {
|
|
476
|
+
return manifest.bundles[bundleName].src;
|
|
477
|
+
}
|
|
478
|
+
return bundleName;
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Lists the `.json` files in `dir`, skipping dotfiles and `* copy`
|
|
483
|
+
* siblings. Empty when the dir is absent.
|
|
484
|
+
*
|
|
485
|
+
* @inner
|
|
486
|
+
* @private
|
|
487
|
+
* @param {string} dir - Absolute config directory
|
|
488
|
+
* @returns {string[]}
|
|
489
|
+
*/
|
|
490
|
+
var listJsonFiles = function (dir) {
|
|
491
|
+
if ( !fs.existsSync(dir) ) return [];
|
|
492
|
+
var entries;
|
|
493
|
+
try { entries = fs.readdirSync(dir); } catch (e) { return []; }
|
|
494
|
+
var out = [];
|
|
495
|
+
for (var i = 0; i < entries.length; i++) {
|
|
496
|
+
var name = entries[i];
|
|
497
|
+
if ( /^\./.test(name) ) continue;
|
|
498
|
+
if ( /\s+copy/i.test(name) ) continue;
|
|
499
|
+
if ( !JSON_EXT.test(name) ) continue;
|
|
500
|
+
out.push(name);
|
|
501
|
+
}
|
|
502
|
+
out.sort();
|
|
503
|
+
return out;
|
|
504
|
+
};
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Reads every `.json` under `absDir`, enumerates its required secret
|
|
508
|
+
* keys, and adds them to `keySet` (a null-proto set). Mutates `keySet`.
|
|
509
|
+
*
|
|
510
|
+
* When `--scope=<s>` is active, the sibling `<absDir>_<scope>/` dir is
|
|
511
|
+
* read-only deep-merged over the base per config file (scope wins) before
|
|
512
|
+
* enumeration — mirroring a deploy's per-scope overlay — so the keys are
|
|
513
|
+
* the *effective* ones that scope will require. Read-only introspection;
|
|
514
|
+
* never touches the runtime config loader.
|
|
515
|
+
*
|
|
516
|
+
* @inner
|
|
517
|
+
* @private
|
|
518
|
+
* @param {string} absDir - Absolute base config directory to read
|
|
519
|
+
* @param {object} keySet - Mutable null-proto set; key name -> true
|
|
520
|
+
*/
|
|
521
|
+
var collectKeysFromConfigDir = function (absDir, keySet) {
|
|
522
|
+
var scopeAbsDir = self.scopeName ? (absDir + '_' + self.scopeName) : null;
|
|
523
|
+
var baseNames = listJsonFiles(absDir);
|
|
524
|
+
var scopeNames = scopeAbsDir ? listJsonFiles(scopeAbsDir) : [];
|
|
525
|
+
|
|
526
|
+
var names = baseNames.slice();
|
|
527
|
+
for (var s = 0; s < scopeNames.length; s++) {
|
|
528
|
+
if (names.indexOf(scopeNames[s]) < 0) names.push(scopeNames[s]);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
for (var f = 0; f < names.length; f++) {
|
|
532
|
+
var name = names[f];
|
|
533
|
+
var baseContent = (baseNames.indexOf(name) > -1) ? readJsonSafe(_(absDir + '/' + name, true)) : null;
|
|
534
|
+
var scopeContent = (scopeAbsDir && scopeNames.indexOf(name) > -1) ? readJsonSafe(_(scopeAbsDir + '/' + name, true)) : null;
|
|
535
|
+
// scope deep-merges over base (scope wins); override=false is explicit (not
|
|
536
|
+
// merge's default) so scope precedence stays correct even if lib/merge's
|
|
537
|
+
// default override ever changes.
|
|
538
|
+
var effective = scopeContent ? merge(JSON.clone(scopeContent), baseContent || {}, false) : baseContent;
|
|
539
|
+
if (!effective) continue;
|
|
540
|
+
var keys = secrets.getRequiredKeys(effective);
|
|
541
|
+
for (var k = 0; k < keys.length; k++) {
|
|
542
|
+
keySet[keys[k]] = true;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Computes the shared-config key set once per project. The loader
|
|
549
|
+
* merges `shared/config/` into every bundle, so these keys are
|
|
550
|
+
* required by each bundle.
|
|
551
|
+
*
|
|
552
|
+
* @inner
|
|
553
|
+
* @private
|
|
554
|
+
* @param {string} projectPath
|
|
555
|
+
* @returns {object} Null-proto set; key name -> true
|
|
556
|
+
*/
|
|
557
|
+
var computeSharedKeys = function (projectPath) {
|
|
558
|
+
var keySet = Object.create(null);
|
|
559
|
+
collectKeysFromConfigDir(_(projectPath + '/shared/config', true), keySet);
|
|
560
|
+
return keySet;
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Resolves one key across both tiers in the runtime's order: the
|
|
565
|
+
* environment first, the declared file chain second. "Set" stays the env
|
|
566
|
+
* backend's fail-closed rule at every tier — a non-empty string — so an
|
|
567
|
+
* `UNSET` here is still precisely a key that would throw at bundle start.
|
|
568
|
+
*
|
|
569
|
+
* The environment tier is the `--env-file` map when one was given,
|
|
570
|
+
* otherwise the live `process.env`. Because that tier outranks the files,
|
|
571
|
+
* an explicit `--env-file` still wins over a declared chain, which is what
|
|
572
|
+
* it means to stand in for the environment.
|
|
573
|
+
*
|
|
574
|
+
* Naming the winning source is the point of the return shape: `SET` alone
|
|
575
|
+
* cannot tell an operator whether the value came from the environment they
|
|
576
|
+
* are about to deploy with or from a plaintext file sitting on this disk —
|
|
577
|
+
* and those have very different consequences.
|
|
578
|
+
*
|
|
579
|
+
* @inner
|
|
580
|
+
* @private
|
|
581
|
+
* @param {string} key
|
|
582
|
+
* @param {object|null} chain - Resolved chain from `resolveSecretsFileChain`
|
|
583
|
+
* @returns {{set:boolean, source:(string|null), from:(string|null)}}
|
|
584
|
+
*/
|
|
585
|
+
var lookupSecret = function (key, chain) {
|
|
586
|
+
var source = self.envMap || process.env;
|
|
587
|
+
if (typeof source[key] === 'string' && source[key] !== '') {
|
|
588
|
+
return { set: true, source: self.envFile ? 'env-file' : 'env', from: self.envFile || null };
|
|
589
|
+
}
|
|
590
|
+
if (chain && chain.map) {
|
|
591
|
+
var value = chain.map[key];
|
|
592
|
+
if (typeof value === 'string' && value !== '') {
|
|
593
|
+
return { set: true, source: 'file', from: chain.origin[key] };
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
return { set: false, source: null, from: null };
|
|
597
|
+
};
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Builds a check report for one bundle: every required key with its
|
|
601
|
+
* `SET`/`UNSET` status against both tiers, plus the resolved
|
|
602
|
+
* `settings.secrets.file` chain that formed the lower one. Flips
|
|
603
|
+
* `self.anyUnset` when a key is missing.
|
|
604
|
+
*
|
|
605
|
+
* The chain is resolved per bundle, not per project: `settings.json` is a
|
|
606
|
+
* per-bundle file and a declared path may embed `${bundle}`.
|
|
607
|
+
*
|
|
608
|
+
* @inner
|
|
609
|
+
* @private
|
|
610
|
+
* @param {string} projectPath
|
|
611
|
+
* @param {object|null} manifest
|
|
612
|
+
* @param {string} bundleName
|
|
613
|
+
* @param {object} sharedKeys - Pre-computed shared key set
|
|
614
|
+
* @returns {{bundle:string, totalKeys:number, set:number, unset:number, keys:Array<{key:string, set:boolean, source:(string|null), from:(string|null)}>, secretsFile:object}}
|
|
615
|
+
*/
|
|
616
|
+
var checkBundle = function (projectPath, manifest, bundleName, sharedKeys) {
|
|
617
|
+
var keySet = Object.create(null);
|
|
618
|
+
for (var sk in sharedKeys) {
|
|
619
|
+
keySet[sk] = true;
|
|
620
|
+
}
|
|
621
|
+
var bundleSrc = resolveBundleSrc(manifest, bundleName);
|
|
622
|
+
collectKeysFromConfigDir(_(projectPath + '/' + bundleSrc + '/config', true), keySet);
|
|
623
|
+
|
|
624
|
+
var chain = resolveSecretsFileChain(projectPath, manifest, bundleName);
|
|
625
|
+
|
|
626
|
+
var keys = Object.keys(keySet).sort();
|
|
627
|
+
var statuses = [];
|
|
628
|
+
var setCount = 0;
|
|
629
|
+
for (var k = 0; k < keys.length; k++) {
|
|
630
|
+
var hit = lookupSecret(keys[k], chain);
|
|
631
|
+
if (hit.set) { setCount++; } else { self.anyUnset = true; }
|
|
632
|
+
statuses.push({ key: keys[k], set: hit.set, source: hit.source, from: hit.from });
|
|
633
|
+
}
|
|
634
|
+
return {
|
|
635
|
+
bundle : bundleName,
|
|
636
|
+
totalKeys : keys.length,
|
|
637
|
+
set : setCount,
|
|
638
|
+
unset : keys.length - setCount,
|
|
639
|
+
keys : statuses,
|
|
640
|
+
secretsFile : {
|
|
641
|
+
declared : chain.declared,
|
|
642
|
+
assumedScope : self.scopeAssumed || null,
|
|
643
|
+
assumedEnv : self.envName || null,
|
|
644
|
+
layers : chain.layers,
|
|
645
|
+
errors : chain.errors
|
|
646
|
+
}
|
|
647
|
+
};
|
|
648
|
+
};
|
|
649
|
+
|
|
650
|
+
/**
|
|
651
|
+
* Iterates every registered project, checking all bundles in each.
|
|
652
|
+
*
|
|
653
|
+
* @inner
|
|
654
|
+
* @private
|
|
655
|
+
*/
|
|
656
|
+
var checkAll = function () {
|
|
657
|
+
var report = { projects: [] };
|
|
658
|
+
var names = Object.keys(self.projects).sort();
|
|
659
|
+
for (var i = 0; i < names.length; i++) {
|
|
660
|
+
var pp = self.projects[names[i]];
|
|
661
|
+
var mf = loadManifest(pp.path);
|
|
662
|
+
if (!mf || !mf.bundles) continue;
|
|
663
|
+
var sharedKeys = computeSharedKeys(pp.path);
|
|
664
|
+
var entry = { project: names[i], bundles: [] };
|
|
665
|
+
var bnames = Object.keys(mf.bundles).sort();
|
|
666
|
+
for (var b = 0; b < bnames.length; b++) {
|
|
667
|
+
entry.bundles.push(checkBundle(pp.path, mf, bnames[b], sharedKeys));
|
|
668
|
+
}
|
|
669
|
+
report.projects.push(entry);
|
|
670
|
+
}
|
|
671
|
+
emit(report);
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Checks every bundle in a single named project.
|
|
676
|
+
*
|
|
677
|
+
* @inner
|
|
678
|
+
* @private
|
|
679
|
+
* @param {string} projectName
|
|
680
|
+
*/
|
|
681
|
+
var checkProjectOnly = function (projectName) {
|
|
682
|
+
var project = self.projects[projectName];
|
|
683
|
+
var manifest = loadManifest(project.path);
|
|
684
|
+
if (!manifest || !manifest.bundles) {
|
|
685
|
+
console.error('Project @' + projectName + ' has no manifest.json or no bundles registered.');
|
|
686
|
+
process.exit(1);
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
689
|
+
var sharedKeys = computeSharedKeys(project.path);
|
|
690
|
+
var bundles = Object.keys(manifest.bundles).sort();
|
|
691
|
+
var report = { project: projectName, bundles: [] };
|
|
692
|
+
for (var i = 0; i < bundles.length; i++) {
|
|
693
|
+
report.bundles.push(checkBundle(project.path, manifest, bundles[i], sharedKeys));
|
|
694
|
+
}
|
|
695
|
+
emit(report);
|
|
696
|
+
};
|
|
697
|
+
|
|
698
|
+
/**
|
|
699
|
+
* Checks a single bundle in a single project.
|
|
700
|
+
*
|
|
701
|
+
* @inner
|
|
702
|
+
* @private
|
|
703
|
+
* @param {string} projectName
|
|
704
|
+
* @param {string} bundleName
|
|
705
|
+
*/
|
|
706
|
+
var checkBundleOnly = function (projectName, bundleName) {
|
|
707
|
+
var project = self.projects[projectName];
|
|
708
|
+
var manifest = loadManifest(project.path);
|
|
709
|
+
var sharedKeys = computeSharedKeys(project.path);
|
|
710
|
+
var report = { project: projectName, bundles: [checkBundle(project.path, manifest, bundleName, sharedKeys)] };
|
|
711
|
+
emit(report);
|
|
712
|
+
};
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* Dispatches to the JSON or text renderer based on `self.format`.
|
|
716
|
+
*
|
|
717
|
+
* @inner
|
|
718
|
+
* @private
|
|
719
|
+
* @param {object} report
|
|
720
|
+
*/
|
|
721
|
+
var emit = function (report) {
|
|
722
|
+
if (self.format === 'json') {
|
|
723
|
+
console.log(JSON.stringify(report, null, 2));
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
emitText(report);
|
|
727
|
+
};
|
|
728
|
+
|
|
729
|
+
/**
|
|
730
|
+
* Renders the human-readable text report.
|
|
731
|
+
*
|
|
732
|
+
* @inner
|
|
733
|
+
* @private
|
|
734
|
+
* @param {object} report
|
|
735
|
+
*/
|
|
736
|
+
var emitText = function (report) {
|
|
737
|
+
var projects = report.projects
|
|
738
|
+
? report.projects
|
|
739
|
+
: [{ project: report.project, bundles: report.bundles }];
|
|
740
|
+
for (var p = 0; p < projects.length; p++) {
|
|
741
|
+
var proj = projects[p];
|
|
742
|
+
console.log('\n@' + proj.project
|
|
743
|
+
+ (self.scopeName ? ' (scope: ' + self.scopeName + ')' : '')
|
|
744
|
+
+ (self.envFile ? ' [env: ' + self.envFile + ']' : '')
|
|
745
|
+
+ ':');
|
|
746
|
+
if (proj.bundles.length === 0) {
|
|
747
|
+
console.log(' (no bundles)');
|
|
748
|
+
continue;
|
|
749
|
+
}
|
|
750
|
+
for (var b = 0; b < proj.bundles.length; b++) {
|
|
751
|
+
emitTextBundle(proj.bundles[b]);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
};
|
|
755
|
+
|
|
756
|
+
/**
|
|
757
|
+
* Renders one bundle's SET/UNSET block.
|
|
758
|
+
*
|
|
759
|
+
* @inner
|
|
760
|
+
* @private
|
|
761
|
+
* @param {object} br - One bundle report from `checkBundle`
|
|
762
|
+
*/
|
|
763
|
+
var emitTextBundle = function (br) {
|
|
764
|
+
console.log(' ' + br.bundle + ':');
|
|
765
|
+
emitTextChain(br.secretsFile);
|
|
766
|
+
if (br.totalKeys === 0) {
|
|
767
|
+
console.log(' No ${secret:KEY} placeholders found in config.');
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
var width = 0;
|
|
771
|
+
for (var w = 0; w < br.keys.length; w++) {
|
|
772
|
+
if (br.keys[w].key.length > width) width = br.keys[w].key.length;
|
|
773
|
+
}
|
|
774
|
+
for (var k = 0; k < br.keys.length; k++) {
|
|
775
|
+
console.log(' ' + padRight(br.keys[k].key, width) + ' '
|
|
776
|
+
+ padRight(br.keys[k].set ? 'SET' : 'UNSET', 5) + ' '
|
|
777
|
+
+ sourceLabel(br.keys[k], br.secretsFile));
|
|
778
|
+
}
|
|
779
|
+
console.log(' (' + br.totalKeys + ' required: ' + br.set + ' set, ' + br.unset + ' unset)');
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Renders the resolved `settings.secrets.file` block for one bundle, and
|
|
784
|
+
* nothing at all when the bundle declares no chain — an undeclared bundle
|
|
785
|
+
* behaves exactly as before the file tier existed, and its report should
|
|
786
|
+
* look that way too.
|
|
787
|
+
*
|
|
788
|
+
* The assumed scope/env line is not decoration: those are launch-time
|
|
789
|
+
* values this process cannot read, so the report has to say which ones it
|
|
790
|
+
* substituted or a reader cannot tell whether the paths below are the ones
|
|
791
|
+
* their bundle will actually open.
|
|
792
|
+
*
|
|
793
|
+
* @inner
|
|
794
|
+
* @private
|
|
795
|
+
* @param {object} sf - The `secretsFile` block from `checkBundle`
|
|
796
|
+
*/
|
|
797
|
+
var emitTextChain = function (sf) {
|
|
798
|
+
if (!sf || !sf.declared) return;
|
|
799
|
+
|
|
800
|
+
var assumed = [];
|
|
801
|
+
if (sf.assumedScope) assumed.push('scope=' + sf.assumedScope);
|
|
802
|
+
if (sf.assumedEnv) assumed.push('env=' + sf.assumedEnv);
|
|
803
|
+
console.log(' settings.secrets.file'
|
|
804
|
+
+ (assumed.length ? ' (assuming ' + assumed.join(', ') + ')' : '') + ':');
|
|
805
|
+
|
|
806
|
+
for (var e = 0; e < sf.errors.length; e++) {
|
|
807
|
+
console.log(' ! ' + sf.errors[e]);
|
|
808
|
+
}
|
|
809
|
+
if (sf.errors.length) {
|
|
810
|
+
console.log(' ! file tier skipped — keys below are checked against the environment only');
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
for (var i = 0; i < sf.layers.length; i++) {
|
|
814
|
+
console.log(' [' + (i + 1) + '] ' + sf.layers[i].path + ' '
|
|
815
|
+
+ (sf.layers[i].found
|
|
816
|
+
? 'loaded (' + sf.layers[i].keys + ' keys)'
|
|
817
|
+
: (sf.layers[i].unreadable
|
|
818
|
+
? 'UNREADABLE (' + sf.layers[i].code + ')'
|
|
819
|
+
: 'ABSENT')));
|
|
820
|
+
}
|
|
821
|
+
};
|
|
822
|
+
|
|
823
|
+
/**
|
|
824
|
+
* Names the tier a key was satisfied from. An empty label for `UNSET`
|
|
825
|
+
* keeps the column honest — there is no source to name.
|
|
826
|
+
*
|
|
827
|
+
* @inner
|
|
828
|
+
* @private
|
|
829
|
+
* @param {object} entry - One `{key, set, source, from}` status
|
|
830
|
+
* @param {object} sf - The `secretsFile` block, for layer numbering
|
|
831
|
+
* @returns {string}
|
|
832
|
+
*/
|
|
833
|
+
var sourceLabel = function (entry, sf) {
|
|
834
|
+
if (!entry.set) return '';
|
|
835
|
+
if (entry.source !== 'file') return entry.source;
|
|
836
|
+
var layers = (sf && sf.layers) ? sf.layers : [];
|
|
837
|
+
for (var i = 0; i < layers.length; i++) {
|
|
838
|
+
if (layers[i].path === entry.from) return 'file[' + (i + 1) + ']';
|
|
839
|
+
}
|
|
840
|
+
return 'file';
|
|
841
|
+
};
|
|
842
|
+
|
|
843
|
+
/**
|
|
844
|
+
* Right-pads `s` with spaces to reach `n` characters.
|
|
845
|
+
*
|
|
846
|
+
* @inner
|
|
847
|
+
* @private
|
|
848
|
+
* @param {string} s
|
|
849
|
+
* @param {number} n
|
|
850
|
+
* @returns {string}
|
|
851
|
+
*/
|
|
852
|
+
var padRight = function (s, n) {
|
|
853
|
+
var o = String(s || '');
|
|
854
|
+
while (o.length < n) o += ' ';
|
|
855
|
+
return o;
|
|
856
|
+
};
|
|
857
|
+
|
|
858
|
+
init();
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
module.exports = Check;
|