gina 0.4.5 → 0.4.6
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 +36 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +10 -8
- package/ROADMAP.md +2 -2
- package/framework/v0.4.6/VERSION +1 -0
- package/framework/v0.4.6/core/asset/plugin/dist/vendor/gina/css/gina.min.css +1 -0
- package/framework/v0.4.6/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- package/framework/v0.4.6/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +62 -0
- package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/js/gina.js +934 -42
- package/framework/v0.4.6/core/asset/plugin/dist/vendor/gina/js/gina.min.js +571 -0
- package/framework/v0.4.6/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.4.6/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.4.5 → v0.4.6}/core/controller/controller.js +62 -6
- package/framework/v0.4.6/core/controller/controller.render-nunjucks-async.js +788 -0
- package/framework/v0.4.6/core/controller/controller.render-swig-async.js +664 -0
- package/framework/{v0.4.5 → v0.4.6}/core/controller/controller.render-swig.js +52 -5
- package/framework/{v0.4.5 → v0.4.6}/core/gna.js +24 -0
- package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/csp/README.md +35 -0
- package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/csp/src/main.js +136 -2
- package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/storage/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/validator/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/validator/src/main.js +17 -4
- package/framework/{v0.4.5 → v0.4.6}/core/server.isaac.js +2 -2
- package/framework/{v0.4.5 → v0.4.6}/core/server.js +273 -97
- package/framework/{v0.4.5 → v0.4.6}/helpers/data/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/helpers/data/src/main.js +58 -3
- package/framework/{v0.4.5 → v0.4.6}/helpers/json/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/helpers/plugins/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/archiver/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/cache/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/link.js +16 -5
- package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/msg.json +1 -1
- package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/restart.js +11 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/start.js +5 -1
- package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/version.js +24 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/cmd/helper.js +28 -9
- package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/add.js +29 -13
- package/framework/{v0.4.5 → v0.4.6}/lib/collection/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/cron/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/domain/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/index.js +7 -0
- package/framework/{v0.4.5 → v0.4.6}/lib/inherits/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/logger/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/merge/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/model.js +17 -0
- package/framework/{v0.4.5 → v0.4.6}/lib/nunjucks-filters/src/main.js +37 -11
- package/framework/{v0.4.5 → v0.4.6}/lib/routing/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/routing/src/main.js +4 -4
- package/framework/{v0.4.5 → v0.4.6}/lib/swig-filters/package.json +0 -3
- package/framework/{v0.4.5 → v0.4.6}/lib/swig-filters/src/main.js +45 -6
- package/framework/v0.4.6/lib/template-loaders/package.json +17 -0
- package/framework/v0.4.6/lib/template-loaders/src/loaders/http.js +272 -0
- package/framework/v0.4.6/lib/template-loaders/src/loaders/memory.js +75 -0
- package/framework/v0.4.6/lib/template-loaders/src/main.js +134 -0
- package/framework/{v0.4.5 → v0.4.6}/package.json +2 -2
- package/gna.js +4 -4
- package/llms.txt +32 -44
- package/package.json +6 -3
- package/playwright.config.js +35 -0
- package/schema/settings.json +105 -0
- package/types/gna.d.ts +1 -1
- package/framework/v0.4.5/VERSION +0 -1
- package/framework/v0.4.5/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -1
- package/framework/v0.4.5/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- package/framework/v0.4.5/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- package/framework/v0.4.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -555
- package/framework/v0.4.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.4.5/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/AUTHORS +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/LICENSE +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/html/static.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/config.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/content.encoding +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/controller/controller.render-nunjucks.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/controller/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/dev/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/locales/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/locales/currency.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/locales/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/mime.types +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/model/entity.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/model/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/model/template/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/router.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/server.express.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/status.codes +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/_gitignore +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/conf/env.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/conf/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/console.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/context.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/data/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/json/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/path.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/prototypes.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/task.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/helpers/text.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/archiver/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/archiver/build.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/async/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/async/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cache/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cache/build.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/minion/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/minion/kill.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/minion/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/protocol/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/protocol/remove.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/service/start.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd-status-format/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cmd-status-format/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/collection/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/collection/build.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/config.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cron/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/domain/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/generator/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/i18n/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/inherits/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/instrument/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/job/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/job/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/math/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/merge/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/metrics/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/proc.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/routing/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/routing/build.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/secrets/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/session-store.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/shell.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/state.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/url/README.md +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/url/index.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/url/routing.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/uuid/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/validator.js +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/watcher/package.json +0 -0
- /package/framework/{v0.4.5 → v0.4.6}/lib/watcher/src/main.js +0 -0
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the gina package.
|
|
3
|
+
* Copyright (c) 2009-2026 Rhinostone <contact@gina.io>
|
|
4
|
+
*
|
|
5
|
+
* For the full copyright and license information, please view the LICENSE
|
|
6
|
+
* file that was distributed with this source code.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @module controller.render-swig-async
|
|
11
|
+
* @description Render delegate for swig bundles configured with a custom async
|
|
12
|
+
* template loader (`settings.template.swig.loader`). controller.js selects this
|
|
13
|
+
* delegate when `process.gina._swigLoaders[<templateRoot>].loader.async === true`;
|
|
14
|
+
* every other swig bundle keeps the byte-identical filesystem path
|
|
15
|
+
* (controller.render-swig.js).
|
|
16
|
+
*
|
|
17
|
+
* Unlike render-swig.js — which self-reads the template from disk, pre-resolves
|
|
18
|
+
* `{% extends %}`, and compiles a string — this delegate renders through an
|
|
19
|
+
* ISOLATED per-bundle `new swig.Swig({ loader })` instance. swig's async
|
|
20
|
+
* codegen drives `resolve -> load` for the page template AND its whole
|
|
21
|
+
* transitive `extends` / `include` / `import` chain through the custom loader,
|
|
22
|
+
* so templates can live off-disk (remote / CDN / object-storage / in-memory).
|
|
23
|
+
* The per-bundle instance is what keeps multiple bundles in one process from
|
|
24
|
+
* colliding on the swig process-singleton's shared loader (#TPL1).
|
|
25
|
+
*
|
|
26
|
+
* MVP scope (Slice 1): per-bundle engine isolation + loader pipeline + gina
|
|
27
|
+
* filter registration + render + HTTP/1.1 & HTTP/2 send + post-render asset
|
|
28
|
+
* injection — the gina client bundle / CSS / JS are injected via injectAssets()
|
|
29
|
+
* plus the gina-bootstrap whisper pass, mirroring render-nunjucks.js, so an
|
|
30
|
+
* off-disk full page ships the client runtime and is production-usable.
|
|
31
|
+
* Deferred to follow-up slices (mirroring the render-nunjucks N2 -> #NJ
|
|
32
|
+
* build-out): Inspector dev-payload, static HTML cache writes, error-template
|
|
33
|
+
* routing, and Early Hints.
|
|
34
|
+
*
|
|
35
|
+
* #TPL1 Tier-2 (this slice): the gina filters are registered ONCE on the shared
|
|
36
|
+
* per-bundle engine and read per-request context from `process.gina._renderALS`
|
|
37
|
+
* at call time, closing the #B25 cross-request filter-table race; an opt-in
|
|
38
|
+
* (`settings.template.swig.loader.cache`, dev-disabled) compiled-fn memo per
|
|
39
|
+
* template root reintroduces cross-request compile reuse.
|
|
40
|
+
*
|
|
41
|
+
* @package gina.framework
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
const libRef = require('./../../lib') || require.cache[require.resolve('./../../lib')];
|
|
45
|
+
const merge = libRef.merge;
|
|
46
|
+
// Collection — filters the asset list to common-only when rendering without a
|
|
47
|
+
// layout (isWithoutLayout XHR/popin responses), mirroring render-nunjucks.js /
|
|
48
|
+
// render-swig.js. Fetched via the lib registry so dev-mode hot-reload evictions
|
|
49
|
+
// of lib/index.js don't poison the reference across requests.
|
|
50
|
+
const Collection = libRef.Collection;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Lazily construct the process-wide render-context AsyncLocalStorage, parked on
|
|
54
|
+
* `process.gina` so it survives dev-mode `require.cache` eviction of this
|
|
55
|
+
* delegate (mirrors `process.gina._reqALS` / `_queryALS`). The async delegates
|
|
56
|
+
* wrap their awaited render in
|
|
57
|
+
* `_renderALS.run({ options, isProxyHost, throwError, req, res }, …)` so the
|
|
58
|
+
* once-registered, context-free gina filters (getUrl/getWebroot/t/tIcu) read the
|
|
59
|
+
* right request's context at call time — closing the #B25 shared-filter-table
|
|
60
|
+
* race and enabling a shared engine + compiled-fn cache (#TPL1 Tier-2).
|
|
61
|
+
*
|
|
62
|
+
* @inner
|
|
63
|
+
* @returns {AsyncLocalStorage} the shared render-context store
|
|
64
|
+
*/
|
|
65
|
+
function getRenderALS() {
|
|
66
|
+
if (!process.gina._renderALS) {
|
|
67
|
+
var AsyncLocalStorage = require('async_hooks').AsyncLocalStorage;
|
|
68
|
+
process.gina._renderALS = new AsyncLocalStorage();
|
|
69
|
+
}
|
|
70
|
+
return process.gina._renderALS;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Per-bundle isolated swig engine + compiled-fn cache. Key: the bundle template
|
|
75
|
+
* root. Value: `{ engine, compiled }` — `engine` is a `new swig.Swig({ loader })`
|
|
76
|
+
* instance with its OWN options.loader, cache, filters and tags (so multiple
|
|
77
|
+
* bundles sharing one process never collide on a shared loader, which a
|
|
78
|
+
* per-bundle `swig.setDefaults({ loader })` on the process-singleton would
|
|
79
|
+
* cause); `compiled` is the #TPL1 Tier-2 per-template compiled-fn memo (consulted
|
|
80
|
+
* per render only when the bundle opts into `loader.cache` and not in dev).
|
|
81
|
+
*
|
|
82
|
+
* The gina filters are registered ONCE here (not per request): they are
|
|
83
|
+
* context-free and read per-request context from `process.gina._renderALS` at
|
|
84
|
+
* call time, so the shared filter table can't bleed context across interleaved
|
|
85
|
+
* async renders (#B25).
|
|
86
|
+
*
|
|
87
|
+
* Stored on `process.gina` so it survives dev-mode `refreshCoreDependencies()`
|
|
88
|
+
* evictions of controller.js + this delegate. The whole registry (engines AND
|
|
89
|
+
* their compiled-fn memos) is dropped when the resolved swig MODULE is
|
|
90
|
+
* hot-swapped (`_swigEnginesOwner !== swigMod`) — compiled fns are bound to the
|
|
91
|
+
* module that built them — mirroring render-nunjucks.js `_nunjucksEnvsOwner`.
|
|
92
|
+
*
|
|
93
|
+
* @inner
|
|
94
|
+
* @param {*} swigMod - The resolved swig module (exposes `.Swig`)
|
|
95
|
+
* @param {string} templateRoot - Registry key (bundle template root)
|
|
96
|
+
* @param {object} loader - Guarded async loader (from `process.gina._swigLoaders`)
|
|
97
|
+
* @param {boolean} autoescape - Per-bundle autoescape (captured by initSwigEngine)
|
|
98
|
+
* @param {function} SwigFilters - The SwigFilters factory (from `deps`), registered once
|
|
99
|
+
* @param {function} throwError - `self.throwError`, carried into the filter set
|
|
100
|
+
* @returns {{engine:*, compiled:Map}} The cached-or-built engine + its compiled-fn memo
|
|
101
|
+
*/
|
|
102
|
+
function getSwigEngine(swigMod, templateRoot, loader, autoescape, SwigFilters, throwError) {
|
|
103
|
+
if (!process.gina._swigEngines) {
|
|
104
|
+
process.gina._swigEngines = Object.create(null);
|
|
105
|
+
}
|
|
106
|
+
// Drop all cached engines (and their compiled-fn memos) when the swig module
|
|
107
|
+
// was hot-swapped (dev-mode project-swig refresh) — instances and compiled
|
|
108
|
+
// fns are bound to the module that built them.
|
|
109
|
+
if (process.gina._swigEnginesOwner !== swigMod) {
|
|
110
|
+
process.gina._swigEngines = Object.create(null);
|
|
111
|
+
process.gina._swigEnginesOwner = swigMod;
|
|
112
|
+
}
|
|
113
|
+
var key = templateRoot;
|
|
114
|
+
if (!process.gina._swigEngines[key]) {
|
|
115
|
+
var engine = new swigMod.Swig({
|
|
116
|
+
loader: loader,
|
|
117
|
+
autoescape: (autoescape === true),
|
|
118
|
+
// swig forces cache:false for async-compiled templates anyway; the
|
|
119
|
+
// gina Tier-2 compiled-fn reuse is the per-entry `compiled` Map below.
|
|
120
|
+
cache: false
|
|
121
|
+
});
|
|
122
|
+
// #B25 / #TPL1 Tier-2 — register the gina filters ONCE on the shared
|
|
123
|
+
// engine (context-free; per-request context flows via _renderALS).
|
|
124
|
+
registerGinaFilters(engine, SwigFilters, throwError);
|
|
125
|
+
process.gina._swigEngines[key] = {
|
|
126
|
+
engine: engine,
|
|
127
|
+
compiled: new Map()
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return process.gina._swigEngines[key];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Resolve the loader identifier for the page template, relative to the bundle
|
|
135
|
+
* template root. Same shape as render-nunjucks.js `resolveTemplatePath()`:
|
|
136
|
+
* honours a `self.setTemplate()` override, the namespace sub-directory, and the
|
|
137
|
+
* extension append. No CVE path check here — the loader wrapper guards every
|
|
138
|
+
* `resolve()`.
|
|
139
|
+
*
|
|
140
|
+
* @inner
|
|
141
|
+
* @param {object} data - Template data (`data.page.view.file` / `.ext`)
|
|
142
|
+
* @param {object} localOptions - Controller options (`.namespace`, `._templateOverride`)
|
|
143
|
+
* @returns {string} Loader identifier (path relative to the template root)
|
|
144
|
+
*/
|
|
145
|
+
function resolveTemplatePath(data, localOptions) {
|
|
146
|
+
// Runtime override from self.setTemplate(file, ext) fully replaces the
|
|
147
|
+
// rule's default path (no namespace prefixing).
|
|
148
|
+
if (localOptions && localOptions._templateOverride && localOptions._templateOverride.file) {
|
|
149
|
+
var ovFile = localOptions._templateOverride.file;
|
|
150
|
+
var ovExt = localOptions._templateOverride.ext || data.page.view.ext || '';
|
|
151
|
+
if (ovExt && !ovFile.endsWith(ovExt)) { ovFile += ovExt; }
|
|
152
|
+
return ovFile;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
var file = data.page.view.file;
|
|
156
|
+
var ext = data.page.view.ext || '';
|
|
157
|
+
|
|
158
|
+
if (localOptions.namespace) {
|
|
159
|
+
var effective = file || localOptions.namespace;
|
|
160
|
+
if (effective === localOptions.namespace) { effective = 'index'; }
|
|
161
|
+
// Drop a redundant `<namespace>-` prefix from the file segment so a
|
|
162
|
+
// route named `<namespace>-<action>` resolves to `<namespace>/<action>`.
|
|
163
|
+
var nsPrefix = localOptions.namespace + '-';
|
|
164
|
+
if (effective.length > nsPrefix.length && effective.indexOf(nsPrefix) === 0) {
|
|
165
|
+
effective = effective.substring(nsPrefix.length);
|
|
166
|
+
}
|
|
167
|
+
var rel = localOptions.namespace + '/' + effective;
|
|
168
|
+
if (ext && !rel.endsWith(ext)) { rel += ext; }
|
|
169
|
+
return rel;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
var relRoot = file;
|
|
173
|
+
if (ext && !relRoot.endsWith(ext)) { relRoot += ext; }
|
|
174
|
+
return relRoot;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Compute the per-request proxy-host decision from the raw request headers and
|
|
179
|
+
* the resolved bundle options. Extracted so the render path can stash it in the
|
|
180
|
+
* `_renderALS` store (the gina filters read `ctx.isProxyHost` from there).
|
|
181
|
+
* Mirrors the isProxyHost derivation in render-swig.js / render-nunjucks.js.
|
|
182
|
+
*
|
|
183
|
+
* @inner
|
|
184
|
+
* @param {object} req - Request (raw headers)
|
|
185
|
+
* @param {object} localOptions - Controller options (`.conf`, hostname/port)
|
|
186
|
+
* @returns {boolean} true when the request appears to arrive via a reverse proxy
|
|
187
|
+
*/
|
|
188
|
+
function computeIsProxyHost(req, localOptions) {
|
|
189
|
+
var localRequestPort = req.headers.port || req.headers[':port'];
|
|
190
|
+
return (
|
|
191
|
+
typeof(req.headers.host) != 'undefined'
|
|
192
|
+
&& typeof(localRequestPort) != 'undefined'
|
|
193
|
+
&& (localRequestPort === '80' || localRequestPort === '443' || localRequestPort === 80 || localRequestPort === 443)
|
|
194
|
+
&& localOptions.conf.server.scheme +'://'+ req.headers.host+':'+ localRequestPort != localOptions.conf.hostname.replace(/\:\d+$/, '') +':'+ localOptions.conf.server.port
|
|
195
|
+
||
|
|
196
|
+
typeof(req.headers[':authority']) != 'undefined'
|
|
197
|
+
&& localOptions.conf.server.scheme +'://'+ req.headers[':authority'] != localOptions.conf.hostname
|
|
198
|
+
||
|
|
199
|
+
typeof(req.headers.host) != 'undefined'
|
|
200
|
+
&& typeof(localRequestPort) != 'undefined'
|
|
201
|
+
&& (localRequestPort === '80' || localRequestPort === '443' || localRequestPort === 80 || localRequestPort === 443)
|
|
202
|
+
&& req.headers.host == localOptions.conf.host
|
|
203
|
+
||
|
|
204
|
+
typeof(req.headers['x-nginx-proxy']) != 'undefined'
|
|
205
|
+
&& String(req.headers['x-nginx-proxy']).toLowerCase() === 'true'
|
|
206
|
+
||
|
|
207
|
+
typeof(process.gina) != 'undefined' && typeof(process.gina.PROXY_HOSTNAME) != 'undefined'
|
|
208
|
+
) ? true : false;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Register gina's SwigFilters on the shared per-bundle engine, ONCE (not per
|
|
213
|
+
* request). The filters are context-free: getUrl / getWebroot / t / tIcu read
|
|
214
|
+
* per-request context from `process.gina._renderALS` at call time, so a single
|
|
215
|
+
* shared filter table can't bleed one request's context into another's
|
|
216
|
+
* interleaved async render (#B25). The build-time conf is therefore empty —
|
|
217
|
+
* everything flows through the ALS store stamped by the render `.run()` wrap.
|
|
218
|
+
*
|
|
219
|
+
* @inner
|
|
220
|
+
* @param {*} engine - The per-bundle swig engine instance
|
|
221
|
+
* @param {function} SwigFilters - The SwigFilters factory (from `deps`)
|
|
222
|
+
* @param {function} throwError - `self.throwError`, carried for the singleton-fallback path
|
|
223
|
+
* @returns {void}
|
|
224
|
+
*/
|
|
225
|
+
function registerGinaFilters(engine, SwigFilters, throwError) {
|
|
226
|
+
var filters = SwigFilters({ options: {}, isProxyHost: false, throwError: throwError });
|
|
227
|
+
|
|
228
|
+
for (var name in filters) {
|
|
229
|
+
if (typeof filters[name] === 'function' && name !== 'getConfig') {
|
|
230
|
+
engine.setFilter(name, filters[name]);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Send the rendered HTML, covering HEAD + HTTP/2 stream + HTTP/1.1 in the
|
|
237
|
+
* four-way branch from class.controller.md §7b. Ported verbatim from
|
|
238
|
+
* render-nunjucks.js `sendHtmlResponse()` (the proven separate-delegate send).
|
|
239
|
+
*
|
|
240
|
+
* @inner
|
|
241
|
+
* @param {object} local - Per-request closure (for `_trailers`)
|
|
242
|
+
* @param {string} html - Final HTML string
|
|
243
|
+
* @param {object} req - Request (captured)
|
|
244
|
+
* @param {object} res - Response (captured)
|
|
245
|
+
* @returns {void}
|
|
246
|
+
*/
|
|
247
|
+
function sendHtmlResponse(local, html, req, res) {
|
|
248
|
+
if (res.headersSent) { return; }
|
|
249
|
+
|
|
250
|
+
var statusCode = res.statusCode || 200;
|
|
251
|
+
var stream = (res && typeof res.stream !== 'undefined') ? res.stream : null;
|
|
252
|
+
var isHead = /^HEAD$/i.test(req.method);
|
|
253
|
+
// #H10 — opt-in HTTP/2 response trailers (registered via self.sendTrailers()).
|
|
254
|
+
var _trailers = (local && local._trailers && typeof(local._trailers) === 'object') ? local._trailers : null;
|
|
255
|
+
var byteLength = Buffer.byteLength(html, 'utf8');
|
|
256
|
+
|
|
257
|
+
if (!res.getHeader('content-type')) {
|
|
258
|
+
res.setHeader('content-type', 'text/html; charset=utf-8');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (isHead) {
|
|
262
|
+
if (stream) {
|
|
263
|
+
// Case 1: HEAD + HTTP/2
|
|
264
|
+
if (stream.destroyed || stream.closed) {
|
|
265
|
+
try { console.warn('[render-swig-async] stream already destroyed on HEAD — client disconnected ('+ req.url +')'); } catch (e) {}
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (!stream.headersSent) {
|
|
269
|
+
var _headH2 = {
|
|
270
|
+
'content-type': res.getHeader('content-type'),
|
|
271
|
+
'content-length': byteLength,
|
|
272
|
+
':status': statusCode
|
|
273
|
+
};
|
|
274
|
+
var _pendingHeadH2 = res.getHeaders ? res.getHeaders() : {};
|
|
275
|
+
for (var _hh2k in _pendingHeadH2) {
|
|
276
|
+
if (!(_hh2k in _headH2)) { _headH2[_hh2k] = _pendingHeadH2[_hh2k]; }
|
|
277
|
+
}
|
|
278
|
+
stream.respond(_headH2);
|
|
279
|
+
}
|
|
280
|
+
stream.end();
|
|
281
|
+
res.headersSent = true;
|
|
282
|
+
} else {
|
|
283
|
+
// Case 2: HEAD + HTTP/1.1
|
|
284
|
+
res.setHeader('content-length', byteLength);
|
|
285
|
+
res.writeHead(statusCode);
|
|
286
|
+
res.end();
|
|
287
|
+
}
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (stream) {
|
|
292
|
+
// Case 3: body + HTTP/2
|
|
293
|
+
if (stream.destroyed || stream.closed) {
|
|
294
|
+
try { console.warn('[render-swig-async] stream already destroyed — client disconnected before response ('+ req.url +')'); } catch (e) {}
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (!stream.headersSent) {
|
|
298
|
+
var _streamHeaders = {
|
|
299
|
+
'content-type': res.getHeader('content-type'),
|
|
300
|
+
':status': statusCode
|
|
301
|
+
};
|
|
302
|
+
var _pendingHeaders = res.getHeaders ? res.getHeaders() : {};
|
|
303
|
+
for (var _shk in _pendingHeaders) {
|
|
304
|
+
if (!(_shk in _streamHeaders)) { _streamHeaders[_shk] = _pendingHeaders[_shk]; }
|
|
305
|
+
}
|
|
306
|
+
if (_trailers) {
|
|
307
|
+
stream.once('wantTrailers', function() {
|
|
308
|
+
try { if (!stream.destroyed && !stream.closed) stream.sendTrailers(_trailers); } catch (_e) { /* best-effort */ }
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
stream.respond(_streamHeaders, _trailers ? { waitForTrailers: true } : undefined);
|
|
312
|
+
}
|
|
313
|
+
stream.end(html);
|
|
314
|
+
res.headersSent = true;
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Case 4: body + HTTP/1.1
|
|
319
|
+
res.writeHead(statusCode);
|
|
320
|
+
res.end(html);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Post-render asset injection. Inserts the bundle's stylesheets / scripts, the
|
|
325
|
+
* external plugins, and the gina client bootstrap (`gina.onload.min.js`) onto
|
|
326
|
+
* the `</head>` / `</body>` anchors of the rendered HTML. Direct port of
|
|
327
|
+
* render-nunjucks.js `injectAssets()` — the async swig delegate renders through
|
|
328
|
+
* the engine API (no FS `getAssets()` machinery), so it injects post-render the
|
|
329
|
+
* same way the nunjucks delegate does.
|
|
330
|
+
*
|
|
331
|
+
* Honours `javascriptsDeferEnabled` (scripts in `<head>` vs before `</body>`)
|
|
332
|
+
* and `javascriptsExcluded === '**'` (suppresses the bootstrap). Skips any
|
|
333
|
+
* asset already present in the HTML (idempotent) and any fragment missing the
|
|
334
|
+
* `</head>`/`</body>` anchor (HEAD responses, partial renders) — returning the
|
|
335
|
+
* HTML unchanged rather than growing truncated markup.
|
|
336
|
+
*
|
|
337
|
+
* @inner
|
|
338
|
+
* @param {string} html - Rendered HTML from the swig async engine
|
|
339
|
+
* @param {object} data - Template data (`data.page.view.stylesheets`/`.scripts`)
|
|
340
|
+
* @param {object} localOptions - Controller options (`template.ginaLoader`, `.externalPlugins`, …)
|
|
341
|
+
* @param {string} [cspNonce] - #HDR5 per-request CSP nonce; stamps the bootstrap <script>
|
|
342
|
+
* @returns {string} HTML with asset tags injected where appropriate
|
|
343
|
+
*/
|
|
344
|
+
function injectAssets(html, data, localOptions, cspNonce) {
|
|
345
|
+
if (typeof html !== 'string' || html.length === 0) { return html; }
|
|
346
|
+
if (!data || !data.page || !data.page.view) { return html; }
|
|
347
|
+
|
|
348
|
+
var stylesheetsHtml = data.page.view.stylesheets || '';
|
|
349
|
+
var scriptsHtml = data.page.view.scripts || '';
|
|
350
|
+
var tpl = localOptions && localOptions.template;
|
|
351
|
+
var isDeferMode = !!(tpl && tpl.javascriptsDeferEnabled);
|
|
352
|
+
var jsExcluded = tpl && tpl.javascriptsExcluded;
|
|
353
|
+
var ginaLoader = tpl && tpl.ginaLoader;
|
|
354
|
+
// #HDR5 — stamp the bootstrap <script> with the per-request nonce when present.
|
|
355
|
+
// The loader is a cached, immutable string; .replace() returns a fresh copy.
|
|
356
|
+
if (cspNonce && typeof ginaLoader === 'string') {
|
|
357
|
+
ginaLoader = ginaLoader.replace(
|
|
358
|
+
'<script type="text/javascript">',
|
|
359
|
+
'<script type="text/javascript" nonce="' + cspNonce + '">'
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
var externalPlugins = (tpl && Array.isArray(tpl.externalPlugins)) ? tpl.externalPlugins : [];
|
|
363
|
+
var hasHead = /<\/head>/i.test(html);
|
|
364
|
+
var hasBody = /<\/body>/i.test(html);
|
|
365
|
+
|
|
366
|
+
if (stylesheetsHtml && hasHead && html.indexOf(stylesheetsHtml) === -1) {
|
|
367
|
+
html = html.replace(/<\/head>/i, '\n\t' + stylesheetsHtml + '\n</head>');
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
if (scriptsHtml && html.indexOf(scriptsHtml) === -1) {
|
|
371
|
+
if (isDeferMode && hasHead) {
|
|
372
|
+
html = html.replace(/<\/head>/i, '\t' + scriptsHtml + '\n</head>');
|
|
373
|
+
} else if (hasBody) {
|
|
374
|
+
html = html.replace(/<\/body>/i, '\t' + scriptsHtml + '\n</body>');
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
if (externalPlugins.length > 0 && hasHead) {
|
|
379
|
+
var extHtml = externalPlugins.join('');
|
|
380
|
+
if (extHtml && html.indexOf(extHtml) === -1) {
|
|
381
|
+
html = html.replace(/<\/head>/i, '\t' + extHtml + '\n</head>');
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (
|
|
386
|
+
ginaLoader
|
|
387
|
+
&& jsExcluded !== '**'
|
|
388
|
+
&& hasHead
|
|
389
|
+
&& !/window\.onGinaLoaded/.test(html)
|
|
390
|
+
) {
|
|
391
|
+
html = html.replace(/<\/head>/i, '\t' + ginaLoader + '\n</head>');
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return html;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Async-loader swig render delegate. Signature matches the other delegates so
|
|
399
|
+
* controller.js can dispatch to it interchangeably.
|
|
400
|
+
*
|
|
401
|
+
* @param {object} userData - Controller-supplied template data
|
|
402
|
+
* @param {boolean=} displayInspector - Dev Inspector toggle (deferred — unused in the MVP)
|
|
403
|
+
* @param {object=} errOptions - Options when invoked from the error pipeline
|
|
404
|
+
* @param {object} deps - Injected controller refs ({ self, local, getData, hasViews, setResources, headersSent, SwigFilters, swig })
|
|
405
|
+
* @returns {Promise<void>}
|
|
406
|
+
*
|
|
407
|
+
* @example
|
|
408
|
+
* // Selected automatically by controller.js when the bundle configures
|
|
409
|
+
* // settings.template.swig.loader; the controller action just calls self.render(data).
|
|
410
|
+
*/
|
|
411
|
+
module.exports = async function renderSwigAsync(userData, displayInspector, errOptions, deps) {
|
|
412
|
+
var self = deps.self;
|
|
413
|
+
var local = deps.local;
|
|
414
|
+
var getData = deps.getData;
|
|
415
|
+
var hasViews = deps.hasViews;
|
|
416
|
+
var headersSent = deps.headersSent;
|
|
417
|
+
var SwigFilters = deps.SwigFilters;
|
|
418
|
+
var setResources = deps.setResources; // #TPL1 — populates data.page.view.stylesheets/.scripts for asset injection
|
|
419
|
+
var swigMod = deps.swig; // the resolved swig MODULE (exposes .Swig)
|
|
420
|
+
|
|
421
|
+
// Function-scoped captures of the per-request refs (#M1 race fix — mirror of
|
|
422
|
+
// render-nunjucks/render-swig). This render awaits (getTemplate + execute);
|
|
423
|
+
// capturing isolates post-await reads from a concurrent throwError null-out
|
|
424
|
+
// on the controller closure.
|
|
425
|
+
var req = local.req;
|
|
426
|
+
var res = local.res;
|
|
427
|
+
var _next = local.next;
|
|
428
|
+
|
|
429
|
+
// No-view short-circuit (e.g. redirect responses reach render() without a
|
|
430
|
+
// configured template).
|
|
431
|
+
if (!hasViews || !hasViews()) {
|
|
432
|
+
sendHtmlResponse(local, '', req, res);
|
|
433
|
+
local.req = null;
|
|
434
|
+
local.res = null;
|
|
435
|
+
local.next = null;
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// If the pipeline already sent headers (an upstream throwError beat us), stop.
|
|
440
|
+
if (headersSent && headersSent()) { return; }
|
|
441
|
+
|
|
442
|
+
var localOptions = errOptions || local.options;
|
|
443
|
+
|
|
444
|
+
var data;
|
|
445
|
+
try {
|
|
446
|
+
data = getData();
|
|
447
|
+
} catch (dataErr) {
|
|
448
|
+
return self.throwError(dataErr);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Error-interception — render(err) with a non-2xx status + an error object
|
|
452
|
+
// routes to the framework error page rather than rendering. Mirrors
|
|
453
|
+
// render-swig.js / render-nunjucks.js.
|
|
454
|
+
if (
|
|
455
|
+
!localOptions.isRenderingCustomError
|
|
456
|
+
&& data && data.page && data.page.data
|
|
457
|
+
&& typeof(data.page.data.status) !== 'undefined'
|
|
458
|
+
&& !String(data.page.data.status).startsWith('2')
|
|
459
|
+
&& typeof(data.page.data.error) !== 'undefined'
|
|
460
|
+
) {
|
|
461
|
+
var errorObject = {
|
|
462
|
+
status: data.page.data.status,
|
|
463
|
+
error: data.page.data.error || data.page.data.message,
|
|
464
|
+
message: data.page.data.message || data.page.data.error,
|
|
465
|
+
stack: data.page.data.stack
|
|
466
|
+
};
|
|
467
|
+
try {
|
|
468
|
+
console.error('[render-swig-async] ' + data.page.data.status + ' from upstream — routing to throwError');
|
|
469
|
+
} catch (e) { /* ignore */ }
|
|
470
|
+
return self.throwError(errorObject);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Registry key — the SAME expression initSwigEngine used to stash the loader
|
|
474
|
+
// (conf.content.templates._common.html), so the two sides never diverge.
|
|
475
|
+
var loaderKey = localOptions.conf
|
|
476
|
+
&& localOptions.conf.content
|
|
477
|
+
&& localOptions.conf.content.templates
|
|
478
|
+
&& localOptions.conf.content.templates._common
|
|
479
|
+
&& localOptions.conf.content.templates._common.html;
|
|
480
|
+
|
|
481
|
+
var stash = (loaderKey && process.gina._swigLoaders) ? process.gina._swigLoaders[loaderKey] : null;
|
|
482
|
+
if (!stash || !stash.loader) {
|
|
483
|
+
return self.throwError(new Error(
|
|
484
|
+
'[render-swig-async] no async swig loader registered for bundle ' + localOptions.bundle +
|
|
485
|
+
' — initSwigEngine did not build one (was settings.template.swig.loader removed at runtime?)'
|
|
486
|
+
));
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Merge user data into the render context — mirror render-nunjucks.js:
|
|
490
|
+
// (a) branching stash (userData without a `page` key -> data.page.data),
|
|
491
|
+
// (b) top-level merge with per-key `page` handling (preserves page.view etc.),
|
|
492
|
+
// (c) framework-data restore (re-overlay getData() so page.environment /
|
|
493
|
+
// page.view / page.data.session survive a partial page.* from the controller).
|
|
494
|
+
if (userData && typeof(userData) === 'object') {
|
|
495
|
+
if (!userData.page) {
|
|
496
|
+
if (!data.page.data) { data.page.data = {}; }
|
|
497
|
+
Object.keys(userData).forEach(function (k) {
|
|
498
|
+
data.page.data[k] = userData[k];
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
Object.keys(userData).forEach(function (k) {
|
|
502
|
+
if (k === 'page' && data.page && typeof userData.page === 'object') {
|
|
503
|
+
Object.keys(userData.page).forEach(function (pk) {
|
|
504
|
+
data.page[pk] = userData.page[pk];
|
|
505
|
+
});
|
|
506
|
+
} else {
|
|
507
|
+
data[k] = userData[k];
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
data = merge(data, getData());
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
var engineEntry, engine;
|
|
514
|
+
try {
|
|
515
|
+
engineEntry = getSwigEngine(swigMod, loaderKey, stash.loader, stash.autoescape, SwigFilters, self.throwError);
|
|
516
|
+
engine = engineEntry.engine;
|
|
517
|
+
} catch (engErr) {
|
|
518
|
+
return self.throwError(engErr);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// #TPL1 asset injection — populate data.page.view.stylesheets / .scripts so
|
|
522
|
+
// injectAssets() (post-render) can auto-inject the gina client bundle, CSS
|
|
523
|
+
// and JS into the off-disk render. Mirrors render-nunjucks.js: isWithoutLayout
|
|
524
|
+
// (XHR/popin) responses filter the asset list to common-only via Collection.
|
|
525
|
+
if (typeof setResources === 'function') {
|
|
526
|
+
try {
|
|
527
|
+
var isWithoutLayout = !!localOptions.isWithoutLayout;
|
|
528
|
+
var localTemplateConf = localOptions.template;
|
|
529
|
+
if (isWithoutLayout && localTemplateConf) {
|
|
530
|
+
localTemplateConf = JSON.clone(localTemplateConf);
|
|
531
|
+
if (Collection && Array.isArray(localTemplateConf.javascripts)) {
|
|
532
|
+
localTemplateConf.javascripts = new Collection(localTemplateConf.javascripts)
|
|
533
|
+
.find({ isCommon: false }, { isCommon: true, name: 'gina' });
|
|
534
|
+
}
|
|
535
|
+
if (Collection && Array.isArray(localTemplateConf.stylesheets)) {
|
|
536
|
+
localTemplateConf.stylesheets = new Collection(localTemplateConf.stylesheets)
|
|
537
|
+
.find({ isCommon: false }, { isCommon: true, name: 'gina' });
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
setResources(localTemplateConf);
|
|
541
|
+
// Re-overlay getData() so the freshly-set page.view.stylesheets /
|
|
542
|
+
// .scripts reach `data` — the render-swig.js:609 "needed !!" step:
|
|
543
|
+
// setResources writes via the controller's set() into local.userData,
|
|
544
|
+
// getData() rebuilds the data object, and merge fills the new keys.
|
|
545
|
+
data = merge(data, getData());
|
|
546
|
+
} catch (resourcesErr) {
|
|
547
|
+
try { console.warn('[render-swig-async] setResources failed: ' + (resourcesErr.message || resourcesErr)); } catch (e) {}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// #HDR5/#HDR16 — per-request CSP nonce (set on req by gina.plugins.Csp({useNonce:true})).
|
|
552
|
+
// Passed to injectAssets() so the injected gina bootstrap <script> carries a
|
|
553
|
+
// matching nonce, and exposed as {{ page.cspNonce }} for app templates
|
|
554
|
+
// (mirrors render-swig.js:903). Absent when the bundle sets no nonce.
|
|
555
|
+
var _cspNonce = (req && req._ginaCspNonce) ? req._ginaCspNonce : null;
|
|
556
|
+
if (_cspNonce) {
|
|
557
|
+
if (!data.page) { data.page = {}; }
|
|
558
|
+
data.page.cspNonce = _cspNonce;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
var templateName;
|
|
562
|
+
try {
|
|
563
|
+
templateName = resolveTemplatePath(data, localOptions);
|
|
564
|
+
} catch (pathErr) {
|
|
565
|
+
return self.throwError(pathErr);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
var html;
|
|
569
|
+
try {
|
|
570
|
+
// #B25 / #TPL1 Tier-2 — per-request render context for the once-registered,
|
|
571
|
+
// context-free gina filters on the shared engine. Carried through
|
|
572
|
+
// process.gina._renderALS so the filters read THIS request's context at
|
|
573
|
+
// call time (not a concurrently-interleaved render's). The .run() wrap is
|
|
574
|
+
// UNCONDITIONAL — it closes the #B25 race whether or not the compiled
|
|
575
|
+
// cache is opted in — and propagates the store across every await in the
|
|
576
|
+
// render (page template + its transitive extends/include chain).
|
|
577
|
+
var _renderStore = {
|
|
578
|
+
options: JSON.clone(localOptions),
|
|
579
|
+
isProxyHost: computeIsProxyHost(req, localOptions),
|
|
580
|
+
throwError: self.throwError,
|
|
581
|
+
req: req,
|
|
582
|
+
res: res
|
|
583
|
+
};
|
|
584
|
+
// Tier-2 compiled-fn reuse: opt-in via settings.template.swig.loader.cache,
|
|
585
|
+
// force-disabled in dev so template edits are picked up live.
|
|
586
|
+
var _useMemo = (stash.cache === true) && (process.env.NODE_ENV_IS_DEV !== 'true');
|
|
587
|
+
|
|
588
|
+
html = await getRenderALS().run(_renderStore, async function () {
|
|
589
|
+
var compiled;
|
|
590
|
+
if (_useMemo) {
|
|
591
|
+
compiled = engineEntry.compiled.get(templateName);
|
|
592
|
+
if (!compiled) {
|
|
593
|
+
// Cache the Promise<fn> (collapses concurrent first-loads of the
|
|
594
|
+
// same template); a rejected compile is evicted so a transient
|
|
595
|
+
// loader failure doesn't poison the cache permanently.
|
|
596
|
+
compiled = engine.getTemplate(templateName, { filename: templateName });
|
|
597
|
+
engineEntry.compiled.set(templateName, compiled);
|
|
598
|
+
compiled.catch(function () { engineEntry.compiled.delete(templateName); });
|
|
599
|
+
}
|
|
600
|
+
compiled = await compiled;
|
|
601
|
+
} else {
|
|
602
|
+
// swig async path: getTemplate(name) resolves+loads the page
|
|
603
|
+
// template AND its transitive extends/include chain through the
|
|
604
|
+
// custom loader, returning Promise<TemplateFn>; the compiled fn
|
|
605
|
+
// returns Promise<{output}>.
|
|
606
|
+
compiled = await engine.getTemplate(templateName, { filename: templateName });
|
|
607
|
+
}
|
|
608
|
+
var rendered = await compiled(data);
|
|
609
|
+
return (rendered && typeof rendered.output === 'string') ? rendered.output : String(rendered);
|
|
610
|
+
});
|
|
611
|
+
} catch (renderErr) {
|
|
612
|
+
return self.throwError(renderErr);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// #TPL1 — post-render asset injection (stylesheets / scripts / ginaLoader /
|
|
616
|
+
// externalPlugins) onto the </head> / </body> anchors. Falls through with
|
|
617
|
+
// un-mutated HTML on any error so a mis-shaped template config never breaks
|
|
618
|
+
// the render.
|
|
619
|
+
try {
|
|
620
|
+
html = injectAssets(html, data, localOptions, _cspNonce);
|
|
621
|
+
} catch (assetErr) {
|
|
622
|
+
try { console.warn('[render-swig-async] asset injection skipped: ' + (assetErr.message || assetErr)); } catch (e) {}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
// The injected gina bootstrap (gina.onload.min.js) is a literal HTML string
|
|
626
|
+
// carrying {{ page.X }} / {{ page.environment.X }} / {{ page.data.session.X }}
|
|
627
|
+
// placeholders the engine never saw (inserted post-render); resolve them with
|
|
628
|
+
// whisper(). Mirrors render-nunjucks.js / render-swig.js:572-582+1276. Without
|
|
629
|
+
// this, window.onGinaLoaded throws a JSON.parse SyntaxError and gina.popin /
|
|
630
|
+
// gina.session / gina.forms / onGenericXhrResponse stay undefined.
|
|
631
|
+
try {
|
|
632
|
+
if (data && data.page && typeof data.page === 'object' && typeof whisper === 'function') {
|
|
633
|
+
var ginaLoaderDic = {};
|
|
634
|
+
for (var _d in data.page) {
|
|
635
|
+
ginaLoaderDic['page.' + _d] = data.page[_d];
|
|
636
|
+
}
|
|
637
|
+
if (typeof data.page.environment === 'object' && data.page.environment !== null) {
|
|
638
|
+
for (var _k in data.page.environment) {
|
|
639
|
+
ginaLoaderDic['page.environment.' + _k] = data.page.environment[_k];
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
// gina.onload.min.js also references `{{ page.data.session.X }}` (depth 3).
|
|
643
|
+
if (data.page.data && typeof data.page.data === 'object' && data.page.data.session && typeof data.page.data.session === 'object') {
|
|
644
|
+
for (var _s in data.page.data.session) {
|
|
645
|
+
ginaLoaderDic['page.data.session.' + _s] = data.page.data.session[_s];
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
html = whisper(ginaLoaderDic, html, /\{{ ([a-zA-Z.]+) \}}/g);
|
|
649
|
+
}
|
|
650
|
+
} catch (whisperErr) {
|
|
651
|
+
try { console.warn('[render-swig-async] ginaLoader whisper substitution skipped: ' + (whisperErr.message || whisperErr)); } catch (e) {}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// A concurrent throwError may have sent headers while we awaited — re-check.
|
|
655
|
+
if (headersSent && headersSent()) { return; }
|
|
656
|
+
|
|
657
|
+
sendHtmlResponse(local, html, req, res);
|
|
658
|
+
|
|
659
|
+
// Release per-request refs on the closure; the function-scoped captures stay
|
|
660
|
+
// alive until return.
|
|
661
|
+
local.req = null;
|
|
662
|
+
local.res = null;
|
|
663
|
+
local.next = null;
|
|
664
|
+
};
|