gina 0.5.4 → 0.5.5
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 +26 -0
- package/README.md +12 -12
- package/ROADMAP.md +11 -6
- package/bin/cli-debug +7 -1
- package/bin/gina +25 -4
- package/framework/v0.5.5/VERSION +1 -0
- package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/js/gina.js +85 -30
- package/framework/v0.5.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js +573 -0
- package/framework/v0.5.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.5.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.5.4 → v0.5.5}/core/config.js +18 -4
- package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.js +48 -6
- package/framework/{v0.5.4 → v0.5.5}/core/gna.js +70 -4
- package/framework/{v0.5.4 → v0.5.5}/core/server.isaac.js +115 -6
- package/framework/{v0.5.4 → v0.5.5}/core/server.js +74 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/archiver/src/main.js +109 -0
- package/framework/v0.5.5/lib/cmd/bundle/man.js +10 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/start.js +17 -3
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/status.js +22 -10
- package/framework/v0.5.5/lib/cmd/framework/add.js +498 -0
- package/framework/v0.5.5/lib/cmd/framework/arguments.json +13 -0
- package/framework/v0.5.5/lib/cmd/framework/help.txt +62 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/init.js +52 -10
- package/framework/v0.5.5/lib/cmd/framework/list.js +352 -0
- package/framework/v0.5.5/lib/cmd/framework/man.js +9 -0
- package/framework/v0.5.5/lib/cmd/framework/remove.js +411 -0
- package/framework/v0.5.5/lib/cmd/framework/reset.js +206 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/tail.js +9 -1
- package/framework/v0.5.5/lib/cmd/framework/update.js +477 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/version.js +12 -1
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/gina-framework.1.md +10 -1
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/helper.js +4 -2
- package/framework/v0.5.5/lib/cmd/man-render.js +144 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/arguments.json +2 -0
- package/framework/v0.5.5/lib/cmd/project/backup.js +228 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/help.txt +18 -8
- package/framework/v0.5.5/lib/cmd/project/man.js +10 -0
- package/framework/v0.5.5/lib/cmd/project/move.js +215 -0
- package/framework/v0.5.5/lib/cmd/project/restore.js +221 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/status.js +24 -12
- package/framework/v0.5.5/lib/cmd/service/man.js +10 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/index.js +8 -0
- package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/containers/mq/listener.js +6 -1
- package/framework/{v0.5.4 → v0.5.5}/lib/proc.js +7 -0
- package/framework/v0.5.5/lib/ws-query/package.json +10 -0
- package/framework/v0.5.5/lib/ws-query/src/main.js +145 -0
- package/framework/{v0.5.4 → v0.5.5}/package.json +2 -2
- package/gna.js +4 -4
- package/llms.txt +20 -4
- package/package.json +8 -6
- package/script/post_install.js +7 -1
- package/script/smoke_in_container.js +336 -0
- package/script/smoke_test_tarball.js +283 -0
- package/utils/helper.js +34 -7
- package/utils/runtime.js +103 -0
- package/framework/v0.5.4/VERSION +0 -1
- package/framework/v0.5.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -572
- package/framework/v0.5.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.5.4/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/v0.5.4/lib/cmd/framework/arguments.json +0 -7
- package/framework/v0.5.4/lib/cmd/framework/help.txt +0 -36
- package/framework/v0.5.4/lib/cmd/framework/update.js +0 -0
- package/framework/v0.5.4/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/AUTHORS +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/LICENSE +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/html/static.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/content.encoding +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.render-nunjucks-async.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.render-swig-async.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/dev/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/locales/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/locales/currency.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/locales/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/mime.types +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/model/entity.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/model/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/model/template/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/router.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/server.express.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/status.codes +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/_gitignore +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/conf/env.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/conf/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/console.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/context.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/data/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/data/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/json/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/json/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/path.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/prototypes.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/task.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/helpers/text.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/admin/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/admin/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/archiver/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/archiver/build.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/archiver/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/async/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/async/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cache/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cache/build.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cache/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/collection/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/collection/build.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/collection/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/config.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cron/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cron/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/domain/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/domain/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/generator/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/i18n/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/inherits/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/inherits/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/instrument/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/job/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/job/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/math/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/merge/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/merge/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/metrics/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/model.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/routing/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/routing/build.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/routing/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/secrets/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/session-store.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/shell.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/state.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/template-loaders/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/template-loaders/src/loaders/http.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/template-loaders/src/loaders/memory.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/template-loaders/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/url/README.md +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/url/index.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/url/routing.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/uuid/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/validator.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/watcher/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/watcher/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/ws-framing/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/ws-framing/src/main.js +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/ws-session/package.json +0 -0
- /package/framework/{v0.5.4 → v0.5.5}/lib/ws-session/src/main.js +0 -0
|
@@ -210,14 +210,20 @@ function Config(opt, contextResetNeeded) {
|
|
|
210
210
|
};
|
|
211
211
|
|
|
212
212
|
} catch(err) {
|
|
213
|
-
|
|
213
|
+
var _coreMsg = (err.stack||err.message);
|
|
214
|
+
console.error(_coreMsg);
|
|
215
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
216
|
+
try { fs.writeSync(2, _coreMsg + '\n'); } catch (_e) { /* best-effort */ }
|
|
214
217
|
process.exit(1)
|
|
215
218
|
}
|
|
216
219
|
|
|
217
220
|
loadBundlesConfiguration( function(err, file, routing) {
|
|
218
221
|
|
|
219
222
|
if (err) {
|
|
220
|
-
|
|
223
|
+
var _bundlesMsg = (err.stack||err.message);
|
|
224
|
+
console.error(_bundlesMsg);
|
|
225
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
226
|
+
try { fs.writeSync(2, _bundlesMsg + '\n'); } catch (_e) { /* best-effort */ }
|
|
221
227
|
setTimeout(() => {
|
|
222
228
|
process.exit(1);
|
|
223
229
|
}, 0);
|
|
@@ -361,8 +367,11 @@ function Config(opt, contextResetNeeded) {
|
|
|
361
367
|
try {
|
|
362
368
|
return self.envConf[bundle][env].server['coreConfiguration']
|
|
363
369
|
} catch(err) {
|
|
364
|
-
|
|
370
|
+
var _coreConfCtx = 'Could not get server core configuration for <'+ bundle +'>:<'+ env +'>';
|
|
371
|
+
console.debug(_coreConfCtx);
|
|
365
372
|
console.error(err.stack||err.message);
|
|
373
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
374
|
+
try { fs.writeSync(2, _coreConfCtx + '\n' + (err.stack||err.message) + '\n'); } catch (_e) { /* best-effort */ }
|
|
366
375
|
process.exit(1);
|
|
367
376
|
}
|
|
368
377
|
}
|
|
@@ -1029,6 +1038,8 @@ function Config(opt, contextResetNeeded) {
|
|
|
1029
1038
|
appPort = portsReverse[app+'@'+self.projectName][env][ newContent[app][env].server.protocol ][ newContent[app][env].server.scheme ];
|
|
1030
1039
|
} catch (err) {
|
|
1031
1040
|
console.emerg('[CONFIG][ settings.server.protocol ] Protocol or scheme settings inconsistency found in `'+ app +'/config/settings`. To fix this, try to run `gina project:import @'+ self.projectName +' --path='+ projectConf.path +'`\n\r'+ err.stack);
|
|
1041
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
1042
|
+
try { fs.writeSync(2, '[CONFIG][ settings.server.protocol ] Protocol or scheme settings inconsistency for `'+ app +'` — run `gina project:import @'+ self.projectName +'`\n'+ (err.stack||err.message) + '\n'); } catch (_e) { /* best-effort */ }
|
|
1032
1043
|
process.exit(1)
|
|
1033
1044
|
}
|
|
1034
1045
|
//I had to for this one...
|
|
@@ -1978,7 +1989,10 @@ function Config(opt, contextResetNeeded) {
|
|
|
1978
1989
|
) {
|
|
1979
1990
|
let ruleName = ( !/\@/.test(rule) ) ? rule +'@'+ bundle : rule;
|
|
1980
1991
|
err = new Error('['+ruleName+'] Bad routing syntax for `'+r+'` in requirements : must start with `/` or `validator::`');
|
|
1981
|
-
|
|
1992
|
+
var _routeMsg = (err.stack||err.message);
|
|
1993
|
+
console.emerg(_routeMsg);
|
|
1994
|
+
// Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
|
|
1995
|
+
try { fs.writeSync(2, _routeMsg + '\n'); } catch (_e) { /* best-effort */ }
|
|
1982
1996
|
process.exit(1);
|
|
1983
1997
|
}
|
|
1984
1998
|
}
|
|
@@ -2874,6 +2874,11 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
2874
2874
|
},
|
|
2875
2875
|
// Will try x3 (0, 1, 2). Hard ceiling is 10 (see retry handler) to bound timer accumulation under sustained failure.
|
|
2876
2876
|
maxRetry : 2,
|
|
2877
|
+
// #B53 — when true, allow auto-retry of a non-safe method (POST/PUT/PATCH/DELETE) after
|
|
2878
|
+
// a post-send transient failure. Default false: only safe methods (GET/HEAD/OPTIONS/TRACE)
|
|
2879
|
+
// auto-retry, so a request the upstream already executed is never silently re-run. Opt in
|
|
2880
|
+
// per call only when the target endpoint is genuinely replay-safe. See isRetryableMethod().
|
|
2881
|
+
retryUnsafe : false,
|
|
2877
2882
|
// Socket inactivity timeout — accepts "30s", "500ms", "1m" or a number (ms)
|
|
2878
2883
|
requestTimeout : "10s",
|
|
2879
2884
|
agent : false/**,
|
|
@@ -3358,6 +3363,37 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
3358
3363
|
// });
|
|
3359
3364
|
// };
|
|
3360
3365
|
|
|
3366
|
+
/**
|
|
3367
|
+
* #B53 — Idempotency guard for inter-bundle client retries.
|
|
3368
|
+
*
|
|
3369
|
+
* A transient failure can land AFTER the upstream bundle already executed its handler
|
|
3370
|
+
* (stream timeout, ECONNRESET, GOAWAY premature-close, proxy 502) — only the response is
|
|
3371
|
+
* lost, not the side effect. Auto-retrying then silently re-executes the request, so a
|
|
3372
|
+
* non-idempotent POST/PUT/PATCH/DELETE runs twice. Both client paths
|
|
3373
|
+
* (handleHTTP1ClientRequest / handleHTTP2ClientRequest) therefore re-send on a transient
|
|
3374
|
+
* failure only when replay is safe.
|
|
3375
|
+
*
|
|
3376
|
+
* Idempotency (PUT/DELETE) is a transport property, not a side-effect property — a PUT or
|
|
3377
|
+
* DELETE fronting a side-effecting handler is still unsafe to replay — so by default only
|
|
3378
|
+
* the HTTP "safe" methods (no side effects, idempotent) auto-retry. A caller that owns a
|
|
3379
|
+
* genuinely replay-safe non-safe endpoint opts in per-call with `retryUnsafe: true`.
|
|
3380
|
+
*
|
|
3381
|
+
* @inner
|
|
3382
|
+
* @param {string} method - HTTP method, any case (HTTP/2 `:method` is already upper-cased).
|
|
3383
|
+
* @param {boolean} [retryUnsafe] - When strictly `true`, allow re-sending any method.
|
|
3384
|
+
* @returns {boolean} `true` when the request may be safely re-sent on a transient failure.
|
|
3385
|
+
*
|
|
3386
|
+
* @example
|
|
3387
|
+
* isRetryableMethod('GET'); // → true (safe method)
|
|
3388
|
+
* isRetryableMethod('post'); // → false (non-idempotent, not opted in)
|
|
3389
|
+
* isRetryableMethod('POST', true); // → true (caller affirmed replay-safety)
|
|
3390
|
+
*/
|
|
3391
|
+
var SAFE_HTTP_METHODS = { GET: true, HEAD: true, OPTIONS: true, TRACE: true };
|
|
3392
|
+
var isRetryableMethod = function(method, retryUnsafe) {
|
|
3393
|
+
if (retryUnsafe === true) { return true; }
|
|
3394
|
+
return SAFE_HTTP_METHODS[ String(method || '').toUpperCase() ] === true;
|
|
3395
|
+
};
|
|
3396
|
+
|
|
3361
3397
|
var handleHTTP1ClientRequest = function(browser, options, callback, retryCount = 0) {
|
|
3362
3398
|
|
|
3363
3399
|
|
|
@@ -3502,7 +3538,11 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
3502
3538
|
req.on('error', function onError(err) {
|
|
3503
3539
|
|
|
3504
3540
|
// If conn is down (ECONNRESET, ETIMEDOUT),retry
|
|
3505
|
-
|
|
3541
|
+
// #B53 — but only re-send when replay is safe: a safe method, or a caller that opted
|
|
3542
|
+
// in via options.retryUnsafe. This handler also fires for post-send failures (the
|
|
3543
|
+
// requestTimeout below calls req.destroy() after the body is written), so an unguarded
|
|
3544
|
+
// retry would silently re-execute a non-idempotent request.
|
|
3545
|
+
if (retryCount < Math.min(options.maxRetry, 10) && isRetryableMethod(options.method, options.retryUnsafe)) {
|
|
3506
3546
|
const delay = 500 * (retryCount + 1); // Délai progressif
|
|
3507
3547
|
return setTimeout(() => handleHTTP1ClientRequest(browser, options, callback, retryCount + 1), delay);
|
|
3508
3548
|
}
|
|
@@ -3979,7 +4019,7 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
3979
4019
|
var _NON_HTTP_OPTS = new Set([
|
|
3980
4020
|
'_body', '_comment', 'ca', 'hostname', 'host', 'port',
|
|
3981
4021
|
'requestTimeout', 'keepAlive', 'maxSockets', 'keepAliveMsecs', 'maxFreeSockets',
|
|
3982
|
-
'rejectUnauthorized', 'maxRetry', 'agent', 'protocol', 'scheme',
|
|
4022
|
+
'rejectUnauthorized', 'maxRetry', 'retryUnsafe', 'agent', 'protocol', 'scheme',
|
|
3983
4023
|
'nameservers', 'settings', 'webroot', 'queryData', 'method', 'path'
|
|
3984
4024
|
]);
|
|
3985
4025
|
var headerKeys = Object.keys(headers);
|
|
@@ -4059,7 +4099,8 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4059
4099
|
var _tIdx = self.serverInstance._http2Sessions.indexOf(sessKey);
|
|
4060
4100
|
if (_tIdx !== -1) self.serverInstance._http2Sessions.splice(_tIdx, 1);
|
|
4061
4101
|
if (!client.destroyed) client.destroy(); // no error arg — suppresses session 'error' event
|
|
4062
|
-
|
|
4102
|
+
// #B53 — only re-send non-idempotent methods when the caller opted in (replay-safe).
|
|
4103
|
+
if (retryCount < HTTP2_MAX_RETRIES && isRetryableMethod(options[':method'], options.retryUnsafe)) {
|
|
4063
4104
|
options.queryData = options._body;
|
|
4064
4105
|
var _tNext = retryCount + 1;
|
|
4065
4106
|
if (_tNext > 1) {
|
|
@@ -4099,7 +4140,7 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4099
4140
|
|
|
4100
4141
|
// If the session closed exactly when we sent the request (Race Condition)
|
|
4101
4142
|
// Retry with a fresh connection (up to HTTP2_MAX_RETRIES, with backoff)
|
|
4102
|
-
if (retryCount < HTTP2_MAX_RETRIES && (errorCode === 'ERR_HTTP2_STREAM_ERROR' || errorCode === 'ECONNRESET')) {
|
|
4143
|
+
if (retryCount < HTTP2_MAX_RETRIES && (errorCode === 'ERR_HTTP2_STREAM_ERROR' || errorCode === 'ECONNRESET') && isRetryableMethod(options[':method'], options.retryUnsafe)) {
|
|
4103
4144
|
isFinished = true; // Mark current attempt as done
|
|
4104
4145
|
cache.delete(sessKey);
|
|
4105
4146
|
if (!client.destroyed) client.destroy();
|
|
@@ -4185,7 +4226,8 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4185
4226
|
if (isFinished) return;
|
|
4186
4227
|
isFinished = true;
|
|
4187
4228
|
console.warn('[HTTP2] Premature stream close on '+ options[':method'] +' '+ options[':path'] +' — GOAWAY / session reset (attempt '+ (retryCount + 1) +'/'+ (HTTP2_MAX_RETRIES + 1) +')');
|
|
4188
|
-
|
|
4229
|
+
// #B53 — only re-send non-idempotent methods when the caller opted in (replay-safe).
|
|
4230
|
+
if (retryCount < HTTP2_MAX_RETRIES && isRetryableMethod(options[':method'], options.retryUnsafe)) {
|
|
4189
4231
|
cache.delete(sessKey);
|
|
4190
4232
|
var _cIdx = self.serverInstance._http2Sessions.indexOf(sessKey);
|
|
4191
4233
|
if (_cIdx !== -1) self.serverInstance._http2Sessions.splice(_cIdx, 1);
|
|
@@ -4241,7 +4283,7 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
|
|
|
4241
4283
|
// drop between nginx and the bundle — transient on OrbStack ARM64 and in
|
|
4242
4284
|
// production after a keepalive expiry). Retry after a short delay to give
|
|
4243
4285
|
// nginx time to reconnect to the bundle before surfacing the error to the caller.
|
|
4244
|
-
if (httpStatus === 502 && retryCount < HTTP2_MAX_RETRIES) {
|
|
4286
|
+
if (httpStatus === 502 && retryCount < HTTP2_MAX_RETRIES && isRetryableMethod(options[':method'], options.retryUnsafe)) {
|
|
4245
4287
|
var _502Next = retryCount + 1;
|
|
4246
4288
|
console.warn('[HTTP2][RETRYING] 502 from '+ options[':authority'] + options[':path'] +' — retry '+ _502Next +'/'+ HTTP2_MAX_RETRIES +' in 2s');
|
|
4247
4289
|
setTimeout(function onHttp2RetryAfter502() {
|
|
@@ -184,6 +184,48 @@ if (process.argv.length >= 3 /**&& /gina$/.test(process.argv[1])*/ ) {
|
|
|
184
184
|
: _fwPath;
|
|
185
185
|
require('module').Module._initPaths();
|
|
186
186
|
}
|
|
187
|
+
|
|
188
|
+
// Bun reads NODE_PATH only at process start, and the Module._initPaths()
|
|
189
|
+
// call above is a callable no-op under it — so bare require('lib/<name>')
|
|
190
|
+
// from framework entities and controllers fails to resolve at request
|
|
191
|
+
// time. Re-implement NODE_PATH fallback semantics for Bun: when the
|
|
192
|
+
// default resolver cannot find a *bare* specifier, retry it against each
|
|
193
|
+
// NODE_PATH dir (the list now includes the framework path). isBun-gated,
|
|
194
|
+
// so Node keeps its native NODE_PATH / _initPaths resolution untouched
|
|
195
|
+
// (zero Node-side change — the shim is never installed under Node).
|
|
196
|
+
var _runtime = require(ctxObj.paths.gina.root + '/utils/runtime');
|
|
197
|
+
var _Module = require('module');
|
|
198
|
+
if ( _runtime.isBun() && !_Module._ginaBunResolvePatched ) {
|
|
199
|
+
_Module._ginaBunResolvePatched = true;
|
|
200
|
+
var _resolvePath = require('path');
|
|
201
|
+
var _ginaOrigResolve = _Module._resolveFilename;
|
|
202
|
+
var _ginaFallbackDirs = (process.env.NODE_PATH || '').split(_resolvePath.delimiter).filter(Boolean);
|
|
203
|
+
if ( _ginaFallbackDirs.indexOf(_fwPath) < 0 ) {
|
|
204
|
+
_ginaFallbackDirs.push(_fwPath);
|
|
205
|
+
}
|
|
206
|
+
_Module._resolveFilename = function (request, parent, isMain, options) {
|
|
207
|
+
try {
|
|
208
|
+
return _ginaOrigResolve.call(this, request, parent, isMain, options);
|
|
209
|
+
} catch (resolveErr) {
|
|
210
|
+
// Only bare specifiers fall back — never relative ('./' '../')
|
|
211
|
+
// or absolute ('/' '\' 'C:') requests.
|
|
212
|
+
if (
|
|
213
|
+
typeof request === 'string'
|
|
214
|
+
&& request.charAt(0) !== '.'
|
|
215
|
+
&& request.charAt(0) !== '/'
|
|
216
|
+
&& request.charAt(0) !== '\\'
|
|
217
|
+
&& !/^[A-Za-z]:/.test(request)
|
|
218
|
+
) {
|
|
219
|
+
for (var _gi = 0; _gi < _ginaFallbackDirs.length; _gi++) {
|
|
220
|
+
try {
|
|
221
|
+
return _ginaOrigResolve.call(this, _resolvePath.join(_ginaFallbackDirs[_gi], request), parent, isMain, options);
|
|
222
|
+
} catch (fallbackErr) { /* try the next NODE_PATH dir */ }
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
throw resolveErr;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
187
229
|
}
|
|
188
230
|
|
|
189
231
|
setContext('paths', ctxObj.paths);//And so on if you need to.
|
|
@@ -291,18 +333,42 @@ var env = (typeof(process.env.NODE_ENV) != 'undefined' && pr
|
|
|
291
333
|
, scope = (typeof(process.env.NODE_SCOPE) != 'undefined' && process.env.NODE_SCOPE) ? process.env.NODE_SCOPE : projects[projectName]['def_scope']
|
|
292
334
|
, isLocalScope = (scope === projects[projectName]['local_scope']) ? true : false
|
|
293
335
|
, isProductionScope = (scope === projects[projectName]['production_scope']) ? true : false
|
|
294
|
-
, port = reversePorts[process.env.NODE_BUNDLE +'@'+ process.env.NODE_PROJECT][env][projects[projectName]['def_protocol']][projects[projectName]['def_scheme']]
|
|
295
336
|
, scheme = projects[projectName]['def_scheme']
|
|
296
337
|
;
|
|
297
338
|
|
|
339
|
+
// Guard the ports.reverse.json lookup: a desynced/corrupt manifest (a missing
|
|
340
|
+
// bundle@project / env / protocol / scheme key) otherwise throws a cryptic
|
|
341
|
+
// `TypeError: Cannot read properties of undefined` at module load (bundle exit 1,
|
|
342
|
+
// no actionable reason). Fail fast with a clear, pipe-flushed diagnostic instead.
|
|
343
|
+
var _bundleKey = process.env.NODE_BUNDLE +'@'+ process.env.NODE_PROJECT
|
|
344
|
+
, _defProto = projects[projectName]['def_protocol']
|
|
345
|
+
, _byEnv = reversePorts[_bundleKey] && reversePorts[_bundleKey][env]
|
|
346
|
+
, _byProto = _byEnv && _byEnv[_defProto]
|
|
347
|
+
, port = ( _byProto && typeof(_byProto[scheme]) != 'undefined' ) ? _byProto[scheme] : null
|
|
348
|
+
;
|
|
349
|
+
if ( port == null ) {
|
|
350
|
+
var _portMsg = '[ FRAMEWORK ] could not resolve the listening port for [ '+ _bundleKey +' ] '
|
|
351
|
+
+ '(env: '+ env +', protocol: '+ _defProto +', scheme: '+ scheme +') — check '
|
|
352
|
+
+ GINA_HOMEDIR +'/ports.reverse.json';
|
|
353
|
+
console.emerg(_portMsg);
|
|
354
|
+
try { fs.writeSync(2, _portMsg + '\n'); } catch (_e) { /* best-effort */ }
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
|
|
298
358
|
gna.env = process.env.NODE_ENV = env;
|
|
299
359
|
gna.scope = process.env.NODE_SCOPE = scope;
|
|
300
360
|
gna.os.isWin32 = process.env.isWin32 = isWin32;
|
|
301
361
|
gna.isAborting = false;
|
|
302
362
|
//Cacheless is also defined in the main config : Config::isCacheless().
|
|
303
|
-
|
|
304
|
-
process.env
|
|
305
|
-
|
|
363
|
+
// Stored as STRING literals, not booleans: Node coerces a non-string
|
|
364
|
+
// process.env assignment to a string, but Bun preserves the original type —
|
|
365
|
+
// so a boolean here makes the downstream readers throw under Bun
|
|
366
|
+
// (`process.env.NODE_ENV_IS_DEV.toLowerCase()`) or compare wrong
|
|
367
|
+
// (`process.env.NODE_ENV_IS_DEV == 'false'` is never true for a boolean).
|
|
368
|
+
// 'true'/'false' are byte-identical to Node's implicit coercion.
|
|
369
|
+
process.env.NODE_ENV_IS_DEV = (/^true$/i.test(isDev)) ? 'true' : 'false';
|
|
370
|
+
process.env.NODE_SCOPE_IS_LOCAL = (/^true$/i.test(isLocalScope)) ? 'true' : 'false';
|
|
371
|
+
process.env.NODE_SCOPE_IS_PRODUCTION = (/^true$/i.test(isProductionScope)) ? 'true' : 'false';
|
|
306
372
|
process.env.NODE_PORT = parseInt(port);
|
|
307
373
|
// Proxy check thru proxy.json [Optional]
|
|
308
374
|
var proxyPathObj = new _(projects[projectName].path + '/proxy.json', true);
|
|
@@ -697,29 +697,138 @@ function ServerEngineClass(options) {
|
|
|
697
697
|
* default refusal table above keeps answering 501 for websocket
|
|
698
698
|
* streams when no consumer exists. With handlers registered, an
|
|
699
699
|
* accepted websocket stream is matched on its `:path` pathname
|
|
700
|
-
* (query string stripped):
|
|
701
|
-
*
|
|
702
|
-
*
|
|
700
|
+
* (query string stripped): an exact-path hit first, then (#H13
|
|
701
|
+
* slice 2) an ordered scan of `:param` patterns whose captured
|
|
702
|
+
* segments populate `request.params` (colon-stripped keys, the
|
|
703
|
+
* same shape an HTTP controller reads). A hit is answered
|
|
704
|
+
* `:status 200` via lib.wsSession.accept and handed to the handler
|
|
705
|
+
* as a live session; a miss is refused with 404. No express middleware runs
|
|
703
706
|
* on the CONNECT path — authentication is the handler's concern
|
|
704
707
|
* (it receives the full request for header/cookie inspection).
|
|
708
|
+
* Registering a path that already has a handler warns and overwrites
|
|
709
|
+
* (last-write-wins): a programmatic call overrides a routing.json
|
|
710
|
+
* `method:"ws"` declaration for the same path (declarations are
|
|
711
|
+
* registered at bundle bootstrap, before onInitialize).
|
|
712
|
+
*
|
|
713
|
+
* #H13 slice 3a — an optional 3rd argument carries per-route session
|
|
714
|
+
* options (maxPayload / protocol / closeTimeout) forwarded verbatim to
|
|
715
|
+
* lib.wsSession.accept; a routing.json `method:"ws"` route supplies them
|
|
716
|
+
* via `param.wsOptions`. Overwriting a path replaces handler AND options.
|
|
705
717
|
*/
|
|
706
718
|
server._wsHandlers = {};
|
|
707
|
-
|
|
719
|
+
// #H13 slice 3a — parallel exact-path → per-route options map. Kept
|
|
720
|
+
// separate from _wsHandlers so that stays a pure path→handler map (the
|
|
721
|
+
// collision guard tests the literal `_wsHandlers[wsPath]` shape).
|
|
722
|
+
server._wsHandlerOptions = {};
|
|
723
|
+
// #H13 slice 2 — ordered registry of `:param` patterns, scanned only
|
|
724
|
+
// on an exact-match miss. Each entry: { pattern, segments, handler }.
|
|
725
|
+
// First-registered wins among overlapping equal-length patterns —
|
|
726
|
+
// mirrors gina's HTTP router, which is first-match by declaration
|
|
727
|
+
// order (core/server.js routing loop breaks on the first matching
|
|
728
|
+
// route; there is no cross-route best-score selection). Keeping the
|
|
729
|
+
// same rule here means WS routing resolves consistently with HTTP.
|
|
730
|
+
server._wsParamHandlers = [];
|
|
731
|
+
|
|
732
|
+
// #H13 slice 2 — match a request pathname against the `:param`
|
|
733
|
+
// registry. Exact routes are resolved by the caller BEFORE this runs.
|
|
734
|
+
// Splits on '/' (keeping the leading '' from the leading slash, so
|
|
735
|
+
// pattern/request segments index-align, mirroring lib/routing). A
|
|
736
|
+
// strict segment-count gate, then per-segment: a literal must equal
|
|
737
|
+
// exactly; a `:name` segment captures any NON-EMPTY segment as
|
|
738
|
+
// `params[name]` (colon-stripped key + decodeURIComponent — the same
|
|
739
|
+
// shape an HTTP controller reads off req.params). Returns
|
|
740
|
+
// { handler, params } for the first matching pattern, else null.
|
|
741
|
+
server._wsMatchParam = function(pathname) {
|
|
742
|
+
var reqSegs = String(pathname || '').split('/');
|
|
743
|
+
for (var i = 0; i < server._wsParamHandlers.length; i++) {
|
|
744
|
+
var entry = server._wsParamHandlers[i];
|
|
745
|
+
if (entry.segments.length !== reqSegs.length) { continue; }
|
|
746
|
+
var params = {};
|
|
747
|
+
var ok = true;
|
|
748
|
+
for (var s = 0; s < entry.segments.length; s++) {
|
|
749
|
+
var pat = entry.segments[s];
|
|
750
|
+
if (pat.charAt(0) === ':') {
|
|
751
|
+
if (reqSegs[s] === '') { ok = false; break; } // reject empty captured segment
|
|
752
|
+
params[pat.substring(1)] = decodeURIComponent(reqSegs[s]);
|
|
753
|
+
} else if (pat !== reqSegs[s]) {
|
|
754
|
+
ok = false; break;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
if (ok) { return { handler: entry.handler, params: params, options: entry.options }; }
|
|
758
|
+
}
|
|
759
|
+
return null;
|
|
760
|
+
};
|
|
761
|
+
|
|
762
|
+
server.onWebSocket = function(wsPath, wsHandler, wsOptions) {
|
|
708
763
|
if (typeof wsPath !== 'string' || wsPath.length === 0 || typeof wsHandler !== 'function') {
|
|
709
764
|
throw new TypeError('onWebSocket(path, handler) requires a non-empty path string and a handler function');
|
|
710
765
|
}
|
|
711
|
-
server
|
|
766
|
+
// #H13 slice 3b — capture, once, the bundle/env this server serves
|
|
767
|
+
// (a server serves one bundle) for session.query. The routing.json
|
|
768
|
+
// registrar (core/server.js) sets server._wsBundle/_wsEnv explicitly
|
|
769
|
+
// from self.appName/self.env before its first call here; a purely
|
|
770
|
+
// programmatic caller (onInitialize) falls back to getContext, which
|
|
771
|
+
// is correct at boot. Capturing at registration avoids the shared
|
|
772
|
+
// ctx.bundle stack-walk mutation hazard that would bite a lazy
|
|
773
|
+
// connect/message-time read on a long-lived interleaved session.
|
|
774
|
+
if (typeof server._wsBundle === 'undefined') {
|
|
775
|
+
server._wsBundle = (typeof getContext === 'function') ? getContext('bundle') : null;
|
|
776
|
+
server._wsEnv = (typeof getContext === 'function') ? getContext('env') : null;
|
|
777
|
+
}
|
|
778
|
+
// #H13 slice 2 — a path with a `:` segment is a param pattern
|
|
779
|
+
// (same placeholder convention as lib/routing's hasParams: /\:/).
|
|
780
|
+
if ( /\:/.test(wsPath) ) {
|
|
781
|
+
var _existing = -1;
|
|
782
|
+
for (var _p = 0; _p < server._wsParamHandlers.length; _p++) {
|
|
783
|
+
if (server._wsParamHandlers[_p].pattern === wsPath) { _existing = _p; break; }
|
|
784
|
+
}
|
|
785
|
+
if (_existing > -1) {
|
|
786
|
+
console.warn('[ SERVER ] onWebSocket: pattern `'+ wsPath +'` already has a handler — overwriting');
|
|
787
|
+
server._wsParamHandlers[_existing].handler = wsHandler;
|
|
788
|
+
server._wsParamHandlers[_existing].options = wsOptions || null;
|
|
789
|
+
} else {
|
|
790
|
+
server._wsParamHandlers.push({ pattern: wsPath, segments: wsPath.split('/'), handler: wsHandler, options: wsOptions || null });
|
|
791
|
+
}
|
|
792
|
+
} else {
|
|
793
|
+
if ( typeof server._wsHandlers[wsPath] === 'function' ) {
|
|
794
|
+
console.warn('[ SERVER ] onWebSocket: path `'+ wsPath +'` already has a handler — overwriting');
|
|
795
|
+
}
|
|
796
|
+
server._wsHandlers[wsPath] = wsHandler;
|
|
797
|
+
server._wsHandlerOptions[wsPath] = wsOptions || null;
|
|
798
|
+
}
|
|
712
799
|
if (typeof server._extendedConnectHandler !== 'function') {
|
|
713
800
|
server._extendedConnectHandler = function(request, response) {
|
|
714
801
|
var _wsPathname = String(request.headers[':path'] || '').split('?')[0];
|
|
802
|
+
// Exact match wins (slice-1 precedence preserved).
|
|
715
803
|
var _wsTarget = server._wsHandlers[_wsPathname];
|
|
804
|
+
var _wsParams = null;
|
|
805
|
+
// #H13 slice 3a — per-route session options resolved alongside
|
|
806
|
+
// the handler: an exact hit reads the exact options map; a
|
|
807
|
+
// param hit takes the matched entry's options below.
|
|
808
|
+
var _wsOpts = server._wsHandlerOptions[_wsPathname] || null;
|
|
809
|
+
// #H13 slice 2 — param fallback only on an exact miss.
|
|
810
|
+
if (typeof _wsTarget !== 'function' && server._wsParamHandlers.length) {
|
|
811
|
+
var _m = server._wsMatchParam(_wsPathname);
|
|
812
|
+
if (_m) { _wsTarget = _m.handler; _wsParams = _m.params; _wsOpts = _m.options || null; }
|
|
813
|
+
}
|
|
716
814
|
if (typeof _wsTarget !== 'function') {
|
|
717
815
|
// No handler registered for this pathname.
|
|
718
816
|
response.writeHead(404);
|
|
719
817
|
response.end();
|
|
720
818
|
return;
|
|
721
819
|
}
|
|
722
|
-
|
|
820
|
+
// Populate request.params (named keys, colon-stripped) so a
|
|
821
|
+
// channel handler reads the same shape an HTTP controller does.
|
|
822
|
+
request.params = _wsParams || {};
|
|
823
|
+
var _wsSession = lib.wsSession.accept(request, _wsOpts || undefined);
|
|
824
|
+
// #H13 slice 3b — give the channel handler a cross-bundle HTTP
|
|
825
|
+
// capability (session.query(options[, data]) → Promise), mirroring
|
|
826
|
+
// a controller's self.query(). Attached AFTER accept so
|
|
827
|
+
// lib/ws-session stays controller-free. The bundle/env this server
|
|
828
|
+
// serves were captured at registration (server._wsBundle/_wsEnv) —
|
|
829
|
+
// never resolved lazily here, where the shared getContext('bundle')
|
|
830
|
+
// is rewritten by every getConfig/getLib stack-walk.
|
|
831
|
+
_wsSession.query = lib.wsQuery.build(server, server._wsBundle, server._wsEnv);
|
|
723
832
|
_wsTarget(_wsSession, request);
|
|
724
833
|
};
|
|
725
834
|
}
|
|
@@ -688,6 +688,80 @@ function Server(options) {
|
|
|
688
688
|
process.env.TZ = options.conf[self.appName][self.env].content.settings.region.timeZone;
|
|
689
689
|
}
|
|
690
690
|
|
|
691
|
+
// #H13 — register routing.json-declared WebSocket routes (`"method": "ws"`).
|
|
692
|
+
// Each such route names a connection-handler module via `param.wsHandler`,
|
|
693
|
+
// resolved under the bundle's `channels/` dir. We register through the
|
|
694
|
+
// engine's own `onWebSocket(path, handler)` (set up during `new Engine()`
|
|
695
|
+
// above): on an http/2 isaac bundle with `enableConnectProtocol` it wires
|
|
696
|
+
// the real dispatcher; otherwise it hits the warn-noop stub, so we never
|
|
697
|
+
// write a registry nothing reads. This runs BEFORE the `configured` emit
|
|
698
|
+
// (hence before the bundle's onInitialize), so a programmatic
|
|
699
|
+
// `app.onWebSocket()` in onInitialize overrides a declaration here.
|
|
700
|
+
// WS dispatch happens in the engine's extended-CONNECT handler — these
|
|
701
|
+
// routes never reach handle()/router.route (the `:4816` method filter +
|
|
702
|
+
// the method-keyed route cache keep a `ws` route from matching an HTTP
|
|
703
|
+
// request, and the radix-trie candidate is method-filtered in the loop).
|
|
704
|
+
var _wsRouting = serverOpt.routing || {};
|
|
705
|
+
var _wsRegistered = {};
|
|
706
|
+
var _wsUnsupportedWarned = false;
|
|
707
|
+
for (var _wsRule in _wsRouting) {
|
|
708
|
+
var _wsRoute = _wsRouting[_wsRule];
|
|
709
|
+
if ( typeof(_wsRoute) != 'object' || _wsRoute === null || !/^ws$/i.test(_wsRoute.method || '') ) {
|
|
710
|
+
continue;
|
|
711
|
+
}
|
|
712
|
+
if ( typeof(engine.instance.onWebSocket) != 'function' ) {
|
|
713
|
+
if ( !_wsUnsupportedWarned ) {
|
|
714
|
+
console.warn('[ SERVER ] WebSocket route(s) declared but the `'+ serverOpt.engine +'` engine has no WebSocket support (requires the isaac engine with http2Options.enableConnectProtocol = true)');
|
|
715
|
+
_wsUnsupportedWarned = true;
|
|
716
|
+
}
|
|
717
|
+
continue;
|
|
718
|
+
}
|
|
719
|
+
var _wsName = ( _wsRoute.param && typeof(_wsRoute.param.wsHandler) == 'string' && _wsRoute.param.wsHandler != '' )
|
|
720
|
+
? _wsRoute.param.wsHandler
|
|
721
|
+
: null;
|
|
722
|
+
if ( !_wsName ) {
|
|
723
|
+
throw new Error('[ SERVER ] WebSocket route `'+ _wsRule +'` must declare `param.wsHandler` (the channels/<name> module to handle it).');
|
|
724
|
+
}
|
|
725
|
+
// #H13 slice 3a — optional per-route session options (maxPayload /
|
|
726
|
+
// protocol / closeTimeout), threaded to lib.wsSession.accept via
|
|
727
|
+
// onWebSocket. Present-but-not-an-object fails loudly at boot (mirrors
|
|
728
|
+
// the wsHandler fail-fast); absent → null (accept defaults apply).
|
|
729
|
+
if ( _wsRoute.param && typeof(_wsRoute.param.wsOptions) != 'undefined'
|
|
730
|
+
&& ( typeof(_wsRoute.param.wsOptions) != 'object' || _wsRoute.param.wsOptions === null ) ) {
|
|
731
|
+
throw new Error('[ SERVER ] WebSocket route `'+ _wsRule +'`: `param.wsOptions` must be an object');
|
|
732
|
+
}
|
|
733
|
+
var _wsOptions = ( _wsRoute.param && typeof(_wsRoute.param.wsOptions) == 'object' && _wsRoute.param.wsOptions !== null )
|
|
734
|
+
? _wsRoute.param.wsOptions
|
|
735
|
+
: null;
|
|
736
|
+
var _wsFile = _(self.conf[self.appName][self.env].bundlesPath + '/' + self.appName + '/channels/' + _wsName + '.js', true);
|
|
737
|
+
var _wsHandlerFn = null;
|
|
738
|
+
try {
|
|
739
|
+
_wsHandlerFn = require(_wsFile);
|
|
740
|
+
} catch (_wsErr) {
|
|
741
|
+
throw new Error('[ SERVER ] WebSocket route `'+ _wsRule +'`: channel module `channels/'+ _wsName +'.js` could not be loaded ('+ _wsFile +'):\n'+ _wsErr.message);
|
|
742
|
+
}
|
|
743
|
+
if ( typeof(_wsHandlerFn) != 'function' ) {
|
|
744
|
+
throw new Error('[ SERVER ] WebSocket route `'+ _wsRule +'`: channel module `channels/'+ _wsName +'.js` must export a function (session, request).');
|
|
745
|
+
}
|
|
746
|
+
// A route URL may be comma-separated (multi-url) — register each.
|
|
747
|
+
var _wsUrls = String(_wsRoute.url || '').split(',');
|
|
748
|
+
for (var _wsi = 0, _wsLen = _wsUrls.length; _wsi < _wsLen; ++_wsi) {
|
|
749
|
+
var _wsUrl = _wsUrls[_wsi].trim();
|
|
750
|
+
if ( !_wsUrl ) { continue; }
|
|
751
|
+
if ( _wsRegistered[_wsUrl] ) {
|
|
752
|
+
console.warn('[ SERVER ] WebSocket path `'+ _wsUrl +'` is declared by more than one `method:"ws"` route — last wins (`'+ _wsRule +'`)');
|
|
753
|
+
}
|
|
754
|
+
_wsRegistered[_wsUrl] = true;
|
|
755
|
+
// #H13 slice 3b — record the bundle/env this server serves (a server
|
|
756
|
+
// serves one bundle) so the dispatcher can build session.query. Set
|
|
757
|
+
// explicitly here (self.appName/self.env are guaranteed correct at
|
|
758
|
+
// boot) before onWebSocket, so its getContext fallback is skipped.
|
|
759
|
+
engine.instance._wsBundle = self.appName;
|
|
760
|
+
engine.instance._wsEnv = self.env;
|
|
761
|
+
engine.instance.onWebSocket(_wsUrl, _wsHandlerFn, _wsOptions);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
691
765
|
self.emit('configured', false, engine.instance, engine.middleware, self.conf[self.appName][self.env]);
|
|
692
766
|
|
|
693
767
|
} catch (err) {
|
|
@@ -486,8 +486,117 @@ function Archiver() {
|
|
|
486
486
|
|
|
487
487
|
|
|
488
488
|
|
|
489
|
+
/**
|
|
490
|
+
* decompress
|
|
491
|
+
*
|
|
492
|
+
* Inverse of `compress()` — extracts a `.zip` archive into a target directory.
|
|
493
|
+
* Mirrors compress()'s completion contract: emits `archiver-decompress#complete`
|
|
494
|
+
* `(err, target)` on the singleton and returns an `{ onComplete: fn }` handle
|
|
495
|
+
* (a trailing callback is also accepted for `promisify`). Uses JSZip 3.x
|
|
496
|
+
* (`loadAsync` + per-entry `async('nodebuffer')`).
|
|
497
|
+
*
|
|
498
|
+
* @param {string} src - absolute path to the `.zip` archive
|
|
499
|
+
* @param {string} target - output directory (created if missing); entries are
|
|
500
|
+
* written at their archive-relative paths under it
|
|
501
|
+
* @param {object} [options] - reserved for future use
|
|
502
|
+
* @returns {{ onComplete: function }} completion handle
|
|
503
|
+
*
|
|
504
|
+
* @example
|
|
505
|
+
* lib.archiver.decompress('/dump/app.zip', '/srv/app/').onComplete(function (err, dir) {
|
|
506
|
+
* if (err) { return; }
|
|
507
|
+
* // dir now holds the extracted tree
|
|
508
|
+
* });
|
|
509
|
+
*/
|
|
489
510
|
this.decompress = function(src, target, options) {
|
|
490
511
|
|
|
512
|
+
var path = require('path');
|
|
513
|
+
var handle = {
|
|
514
|
+
onComplete: function onDecompressionCompleted(cb) {
|
|
515
|
+
self.once('archiver-decompress#complete', function (err, t) {
|
|
516
|
+
cb(err, t)
|
|
517
|
+
})
|
|
518
|
+
}
|
|
519
|
+
};
|
|
520
|
+
|
|
521
|
+
// Used for `promisify` — same trailing-callback contract as compress()
|
|
522
|
+
if ( typeof(arguments[arguments.length-1]) == 'function' ) {
|
|
523
|
+
var _pcb = arguments[arguments.length-1];
|
|
524
|
+
self.once('archiver-decompress#complete', function (err, t) {
|
|
525
|
+
return _pcb(err, t)
|
|
526
|
+
})
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
if ( !/\/$/.test(target) ) {
|
|
530
|
+
target += '/'
|
|
531
|
+
}
|
|
532
|
+
if ( !fs.existsSync(target) ) {
|
|
533
|
+
fs.mkdirSync(target, { recursive: true });
|
|
534
|
+
}
|
|
535
|
+
var targetAbs = path.resolve(target);
|
|
536
|
+
|
|
537
|
+
if ( !fs.existsSync(src) ) {
|
|
538
|
+
// defer so a synchronous error still reaches a listener attached
|
|
539
|
+
// via the returned handle's onComplete() on the same tick
|
|
540
|
+
process.nextTick(function () {
|
|
541
|
+
self.emit('archiver-decompress#complete', new Error('archive not found `'+ src +'`'), null);
|
|
542
|
+
});
|
|
543
|
+
return handle;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
try {
|
|
547
|
+
var buf = fs.readFileSync(src);
|
|
548
|
+
JSZip.loadAsync(buf).then(function (zip) {
|
|
549
|
+
|
|
550
|
+
var entries = [];
|
|
551
|
+
zip.forEach(function (relPath, entry) {
|
|
552
|
+
entries.push({ relPath: relPath, entry: entry });
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
var i = 0;
|
|
556
|
+
var next = function () {
|
|
557
|
+
if ( i >= entries.length ) {
|
|
558
|
+
self.emit('archiver-decompress#complete', false, target);
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
var it = entries[i++];
|
|
562
|
+
var dest = path.resolve(targetAbs, it.relPath);
|
|
563
|
+
|
|
564
|
+
// zip-slip guard: an entry must never escape the target dir
|
|
565
|
+
if ( dest !== targetAbs && dest.indexOf(targetAbs + path.sep) !== 0 ) {
|
|
566
|
+
self.emit('archiver-decompress#complete', new Error('unsafe entry path in archive: `'+ it.relPath +'`'), null);
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
if ( it.entry.dir ) {
|
|
571
|
+
if ( !fs.existsSync(dest) ) {
|
|
572
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
573
|
+
}
|
|
574
|
+
return next();
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
var parent = path.dirname(dest);
|
|
578
|
+
if ( !fs.existsSync(parent) ) {
|
|
579
|
+
fs.mkdirSync(parent, { recursive: true });
|
|
580
|
+
}
|
|
581
|
+
it.entry.async('nodebuffer').then(function (content) {
|
|
582
|
+
fs.writeFileSync(dest, content);
|
|
583
|
+
next();
|
|
584
|
+
}).catch(function (err) {
|
|
585
|
+
self.emit('archiver-decompress#complete', err, null);
|
|
586
|
+
});
|
|
587
|
+
};
|
|
588
|
+
next();
|
|
589
|
+
|
|
590
|
+
}).catch(function (err) {
|
|
591
|
+
self.emit('archiver-decompress#complete', err, null);
|
|
592
|
+
});
|
|
593
|
+
} catch (err) {
|
|
594
|
+
process.nextTick(function () {
|
|
595
|
+
self.emit('archiver-decompress#complete', err, null);
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
return handle;
|
|
491
600
|
}
|
|
492
601
|
|
|
493
602
|
this.compressFromStream = function(readStream, target, options) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module gina/lib/cmd/bundle/man
|
|
3
|
+
* @description `gina bundle:man` — shows the bundle manual. No
|
|
4
|
+
* `gina-bundle.1.md` source exists yet, so the shared engine falls back to
|
|
5
|
+
* `lib/cmd/bundle/help.txt`. Thin re-export of
|
|
6
|
+
* {@link module:gina/lib/cmd/man-render}, which picks the group from
|
|
7
|
+
* `opt.task.topic`.
|
|
8
|
+
*/
|
|
9
|
+
// alias
|
|
10
|
+
module.exports = require('../man-render');
|