gina 0.4.0 → 0.4.1
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 +17 -0
- package/README.md +5 -11
- package/ROADMAP.md +18 -7
- package/bin/cli +12 -0
- package/framework/v0.4.1/VERSION +1 -0
- package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -3
- package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +1 -1
- package/framework/v0.4.1/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.4.0 → v0.4.1}/core/controller/controller.js +43 -0
- package/framework/{v0.4.0 → v0.4.1}/core/controller/controller.render-nunjucks.js +117 -7
- package/framework/{v0.4.0 → v0.4.1}/core/controller/controller.render-swig.js +21 -1
- package/framework/{v0.4.0 → v0.4.1}/core/server.js +23 -1
- package/framework/{v0.4.0 → v0.4.1}/lib/cache/src/main.js +0 -3
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/add.js +24 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/arguments.json +3 -1
- package/framework/v0.4.1/lib/cmd/bundle/copy.js +467 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/help.txt +74 -0
- package/framework/v0.4.1/lib/cmd/bundle/inc/name-rewrite.js +96 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/list.js +7 -90
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/remove.js +11 -0
- package/framework/v0.4.1/lib/cmd/bundle/rename.js +506 -0
- package/framework/v0.4.1/lib/cmd/bundle/status.js +170 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/list.js +2 -18
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/helper.js +1 -1
- package/framework/v0.4.1/lib/cmd/minion/arguments.json +4 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/minion/help.txt +5 -1
- package/framework/v0.4.1/lib/cmd/minion/kill.js +336 -0
- package/framework/v0.4.1/lib/cmd/minion/list.js +270 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/port/set.js +12 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/help.txt +16 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/remove.js +11 -0
- package/framework/v0.4.1/lib/cmd/project/status.js +218 -0
- package/framework/v0.4.1/lib/cmd/protocol/arguments.json +5 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/protocol/help.txt +8 -3
- package/framework/v0.4.1/lib/cmd/protocol/remove.js +308 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/protocol/set.js +12 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/service/list.js +4 -82
- package/framework/{v0.4.0 → v0.4.1}/lib/cmd/view/add.js +13 -0
- package/framework/v0.4.1/lib/cmd-status-format/package.json +17 -0
- package/framework/v0.4.1/lib/cmd-status-format/src/main.js +142 -0
- package/framework/{v0.4.0 → v0.4.1}/lib/collection/src/main.js +0 -3
- package/framework/{v0.4.0 → v0.4.1}/lib/index.js +4 -0
- package/framework/{v0.4.0 → v0.4.1}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +13 -6
- package/package.json +2 -2
- package/script/sync_docs_deps.js +147 -0
- package/framework/v0.4.0/VERSION +0 -1
- package/framework/v0.4.0/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.4.0/lib/cmd/bundle/copy.js +0 -18
- package/framework/v0.4.0/lib/cmd/bundle/rename.js +0 -7
- package/framework/v0.4.0/lib/cmd/bundle/status.js +0 -6
- package/framework/v0.4.0/lib/cmd/project/status.js +0 -3
- /package/framework/{v0.4.0 → v0.4.1}/AUTHORS +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/LICENSE +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/html/static.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/config.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/mongodb/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/mongodb/lib/connector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/mongodb/lib/session-store.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/scylladb/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/scylladb/lib/connector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/scylladb/lib/session-store.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/content.encoding +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/controller/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/controller/inspector-window-emit.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/dev/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/gna.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/locales/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/locales/currency.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/locales/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/mime.types +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/model/entity.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/model/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/model/template/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/coep/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/coep/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/coop/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/coop/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/corp/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/corp/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/csp/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/csp/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/hsts/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/hsts/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/router.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/server.express.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/server.isaac.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/status.codes +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/_gitignore +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle/locales/en.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_public/sw.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/conf/env.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/conf/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/console.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/context.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/data/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/data/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/json/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/json/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/path.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/prototypes.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/task.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/helpers/text.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/archiver/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/archiver/build.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/archiver/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/async/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/async/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cache/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cache/build.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cache/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/i18n/add.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/i18n/arguments.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/i18n/export.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/i18n/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/i18n/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/i18n/import.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/i18n/scan.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/secrets/arguments.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/secrets/check.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/secrets/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/secrets/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/secrets/scan.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/collection/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/collection/build.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/collection/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/config.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cron/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cron/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/domain/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/domain/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/generator/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/i18n/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/i18n/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/inherits/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/inherits/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/instrument/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/instrument/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/job/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/job/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/math/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/merge/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/merge/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/metrics/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/metrics/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/model.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/nunjucks-filters/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/proc.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/routing/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/routing/build.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/routing/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/secrets/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/secrets/src/backends/env.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/secrets/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/session-store.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/shell.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/state.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/url/README.md +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/url/index.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/url/routing.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/uuid/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/validator.js +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/watcher/package.json +0 -0
- /package/framework/{v0.4.0 → v0.4.1}/lib/watcher/src/main.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,23 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
|
|
6
6
|
and is generated by [Changie](https://github.com/miniscruff/changie).
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
## 0.4.1 - 2026-06-01
|
|
10
|
+
### Added
|
|
11
|
+
* New `gina bundle:status` and `gina project:status` CLI commands report the running/stopped state, PID, port, and active env of bundles (human-readable or --format=json).
|
|
12
|
+
* gina minion:list lists the running bundle child-processes ("minions") of a project, or of every registered project, grouped by project. Supports --format=json for machine-readable output.
|
|
13
|
+
* gina minion:kill reaps the running bundle child-processes ("minions") of a project (both pidfile-tracked and orphaned ps-discovered ones) with a graceful SIGTERM-then-SIGKILL escalation, a --dry-run preview, and --format=json output.
|
|
14
|
+
* gina protocol:remove <bundle> @<project> reverts a bundle to the project default protocol and scheme by removing its protocol override from the bundle settings; supports --dry-run and --format=json, and guards against reverting to an unallocated port.
|
|
15
|
+
* Added self.setTemplate(file, ext) to override the rendered template from a controller action at run time (e.g. a catch-all dispatcher); honoured by the swig render path.
|
|
16
|
+
* Added bundle:copy (alias bundle:cp) to duplicate a bundle under a new name within the same project. It copies the source tree, rewrites the bundle-name footprint (controller class names, the gina require-var, app.json name, webroot) in the copied .js/.json files, allocates a fresh full port matrix, and registers the new bundle in manifest.json + env.json + the ports registry. Supports --dry-run (preview every rewrite site before writing), --force (overwrite an existing target), and --format=json.
|
|
17
|
+
* Added bundle:rename to rename a bundle in place under a new name within the same project. It moves the source tree, rewrites the bundle-name footprint (controller class names, the gina require-var, app.json name, webroot) in the moved .js/.json files, and rekeys manifest.json + env.json + the ports registry preserving the existing port numbers. The bundle must be stopped first (a running bundle is refused, with no --force bypass). Supports --dry-run (preview every rewrite site before writing), --force (overwrite an existing bundle that already holds the new name), and --format=json.
|
|
18
|
+
### Fixed
|
|
19
|
+
* Fixed `gina bundle:add` surfacing an opaque `ERR_USE_AFTER_CLOSE` ("readline was closed") rollback when the target bundle already exists and the command runs without an interactive terminal (container entrypoint, CI, or piped stdin). It now fails fast with a clear message to re-run with `--import` (register the existing source) or `--replace` (overwrite it).
|
|
20
|
+
* Extended the non-interactive (no-TTY) guard to the remaining interactive CLI commands — `bundle:remove`, `project:remove`, `protocol:set`, `port:set`, and `view:add`. When run without a terminal (container, CI, or piped stdin) and missing the values they would otherwise prompt for, they now fail fast with guidance (e.g. `--force`, or `--protocol`/`--scheme`/`--port`/`--env`) instead of throwing an opaque `ERR_USE_AFTER_CLOSE` ("readline was closed").
|
|
21
|
+
* Fixed the `gina` CLI crashing with an opaque `could not load package.json` / `MODULE_NOT_FOUND` when `GINA_VERSION` resolves to a framework version that is not installed (a stale version pin, or a bind-mounted development tree at a different version). `bin/cli` now verifies the framework directory exists before requiring from it and fails fast with a clear message pointing at `gina framework:install <version>`, instead of letting every CLI command fail opaquely.
|
|
22
|
+
* Fixed a crash that could kill a bundle serving static assets over HTTP/2 in dev mode under concurrent requests.
|
|
23
|
+
* Fixed renderWithoutLayout returning an empty body when the template referenced controller data as top-level variables.
|
|
24
|
+
* Brought the nunjucks render path to parity with swig: self.setTemplate() runtime overrides are now honoured, a bundle's controllers/setup.js can register filters via this.engine.addFilter(), and a controller passing a partial page object no longer drops framework-injected page data (webroot, view metadata, session).
|
|
25
|
+
|
|
9
26
|
## 0.4.0 - 2026-05-29
|
|
10
27
|
### Added
|
|
11
28
|
* Inspector View tab now shows the template engine version next to the engine name (e.g. `Swig | 2.4.0`). The version is sourced server-side from the cached swig / nunjucks resolver decisions and falls back to a name-only badge when no version is resolvable (very-early bootstrap, test stubs, legacy render paths).
|
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope
|
|
|
22
22
|
| ORM / entities | EventEmitter-based entity system; SQL files auto-wired to entity methods |
|
|
23
23
|
| Connectors | Couchbase, MongoDB, ScyllaDB / Cassandra, MySQL, PostgreSQL, Redis, SQLite, AI (LLM) — loaded from project `node_modules` |
|
|
24
24
|
| AI connector | Any LLM provider via named protocol (`anthropic://`, `openai://`, `ollama://`, …) |
|
|
25
|
-
| Template engine | [`@rhinostone/swig`](https://github.com/gina-io/swig) 2.
|
|
25
|
+
| Template engine | [`@rhinostone/swig`](https://github.com/gina-io/swig) 2.5.1 — maintained fork with CVE-2023-25345 patched; streaming SSE/chunked via `renderStream()`. Nunjucks supported as opt-in via `render.engine = "nunjucks"` |
|
|
26
26
|
| Internationalisation | Per-bundle JSON catalogs, `t()` helper, swig + nunjucks `t` filter, CLDR plurals, ICU MessageFormat opt-in via `t.icu()` |
|
|
27
27
|
| Observability | Built-in `/_gina/metrics` Prometheus endpoint (opt-in, IP-allowlisted) — Node.js process metrics + HTTP counter / duration histogram with cardinality-safe route labels |
|
|
28
28
|
| Hot reload | WatcherService evicts `require.cache` only on file change — zero per-request overhead in dev |
|
|
@@ -39,17 +39,11 @@ gina bundle:start api @myproject
|
|
|
39
39
|
open https://localhost:3100
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
## What's in 0.4.
|
|
42
|
+
## What's in 0.4.1
|
|
43
43
|
|
|
44
|
-
**
|
|
45
|
-
|
|
46
|
-
- **
|
|
47
|
-
- **Async jobs** (#AI6) — run slow work out-of-band: `self.startJob(fn)` returns a job id immediately and runs `fn` on a concurrency-limited worker; `self.inferAsync(messages, opts)` wires the AI connector through a job in one call. Poll the built-in `GET /_gina/jobs/:id` for state, or opt into a signed completion webhook. See the [Async jobs guide](https://gina.io/docs/guides/async-jobs).
|
|
48
|
-
- **HTTP/2 response trailers** (#H10) — `self.sendTrailers(fields)` before rendering emits trailing headers after the body (via the `wantTrailers` event) — useful for gRPC-style `grpc-status` or a content-integrity `Digest`. Fully opt-in: a no-op on HTTP/1.1 and when no trailers are registered. See the [native HTTP/2 guide](https://gina.io/docs/guides/http2-native).
|
|
49
|
-
- **CSP per-response nonce** (#HDR16) — `gina.plugins.Csp({ useNonce: true })` mints a fresh nonce per response, stamps the framework-injected bootstrap (and dev-Inspector) inline scripts, and exposes it to templates as `{{ page.cspNonce }}` (swig) / `{{ cspNonce }}` (nunjucks) — letting bundles drop `'unsafe-inline'` from `script-src`. Opt-in (default false). See the [CSP guide](https://gina.io/docs/guides/csp).
|
|
50
|
-
- **Inspector remote instrumentation** (#INS9b, #INS10) — an opt-in API-key gate on the dev-mode `/_gina/agent` SSE stream streams authenticated server logs outside dev; `POST /_gina/instrument` opens a time-boxed, key-authenticated window that captures query + flow timelines (JSON, XHR, and server-rendered HTML pages) over the authenticated channel without ever modifying the page HTML. See the [Inspector guide](https://gina.io/docs/guides/inspector).
|
|
51
|
-
- **`gina secrets:scan` / `secrets:check` CLI** — introspect the `${secret:KEY}` placeholders your bundle configs require; `secrets:check` marks each key SET/UNSET and exits non-zero on any missing key (CI / pre-deploy gating). `--scope=<scope>`, `--env-file=<path>`, and `--format=json` supported. See the [secrets guide](https://gina.io/docs/guides/secrets).
|
|
52
|
-
- **Inspector dev-UX + fixes** — template engine version on the View badge; Weight/Load badges and the Flow timeline restored under `Cross-Origin-Opener-Policy` and for nunjucks bundles; SQL column-level index-coverage matching (including live DB introspection). Fixes: `throwError(statusCode, Error)` now honors the explicit code; an HTTP 500 on browser-session (no-expiry) cookies; `npm install -g` hardening for npm setups that don't propagate `npm_config_global`; refreshed stale external references; `@rhinostone/swig` floor → `^2.5.1`.
|
|
44
|
+
- **CLI Tier 2 — run-state + lifecycle commands.** `bundle:status` / `project:status` report a bundle's (or every bundle's) running/stopped state, PID, port, and active env — human-readable or `--format=json`. `minion:list` / `minion:kill` list and reap a project's running bundle child-processes (both pidfile-tracked and `ps`-discovered orphans) with a graceful SIGTERM→SIGKILL escalation and a `--dry-run` preview. `bundle:copy` (alias `bundle:cp`) duplicates a bundle under a new name and `bundle:rename` renames one in place — both rewrite the bundle-name footprint and update the manifest / env / ports registry, with `--dry-run` / `--force`. `protocol:remove` reverts a bundle to the project's default protocol and scheme.
|
|
45
|
+
- **Runtime template override** — `self.setTemplate(file, ext)` lets a controller action choose its template at request time (e.g. a catch-all dispatcher), resolved verbatim under the templates root. Honoured by both the swig and nunjucks render paths.
|
|
46
|
+
- **Fixes** — nunjucks↔swig render parity (`self.setTemplate()` overrides, `controllers/setup.js` filter registration via `this.engine.addFilter()`, and a controller passing a partial `page` object no longer dropping framework-injected page data — webroot, view metadata, session); a crash that could kill a bundle serving static assets over HTTP/2 in dev mode under concurrent requests; `renderWithoutLayout` returning an empty body when the template referenced controller data as top-level variables; and clearer fail-fast errors when the `gina` CLI hits an uninstalled `GINA_VERSION` or when an interactive command (`bundle:add`/`bundle:remove`/`project:remove`/`protocol:set`/`port:set`/`view:add`) runs without a TTY.
|
|
53
47
|
|
|
54
48
|
See the full [Changelog](./CHANGELOG.md) and [Roadmap](./ROADMAP.md).
|
|
55
49
|
|
package/ROADMAP.md
CHANGED
|
@@ -60,13 +60,14 @@ Stub commands confirmed in source — handler files exist but are empty or comme
|
|
|
60
60
|
|
|
61
61
|
| Status | Feature | Version | Target |
|
|
62
62
|
| --- | --- | --- | --- |
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
63
|
+
| ✅ | **`bundle:status`** — Show the running/stopped state, PID, port, and active env for a specific bundle. | `0.4.1-alpha.2` | 2026-05-30 |
|
|
64
|
+
| ✅ | **`bundle:rename`** — Rename a bundle in place within a project: moves the `src/` directory, rewrites the bundle-name footprint, and rekeys `manifest.json` + `env.json` + the ports registry preserving the existing port numbers, with `--dry-run` / `--force`. | `0.4.1-alpha.2` | 2026-06-01 |
|
|
65
|
+
| ✅ | **`protocol:remove`** — Revert a bundle to the project's default protocol/scheme by removing its `settings.json` override (no shared `ports*.json` mutation), with `--dry-run` / `--force`. | `0.4.1-alpha.2` | 2026-05-31 |
|
|
66
|
+
| ✅ | **`minion:list`** — List the running bundle child-processes ("minions") of a project, or of every project, grouped by project. `--format=json` supported. | `0.4.1-alpha.2` | 2026-05-31 |
|
|
67
|
+
| ✅ | **`minion:kill`** — Reap a project's running bundle child-processes ("minions") — both pidfile-tracked and `ps`-discovered orphans — with a graceful SIGTERM/SIGKILL escalation and a `--dry-run` preview. | `0.4.1-alpha.2` | 2026-05-31 |
|
|
67
68
|
| 📋 | **`gina --status` / `-t`** — Top-level health check: print whether the framework daemon is running, its version, and active bundle count. Requires adding `--status`/`-t` entries to `aliases.json` and implementing `framework/status.js`. | `0.4.0` | Q4 2026 |
|
|
68
|
-
|
|
|
69
|
-
|
|
|
69
|
+
| ✅ | **`bundle:copy` / `bundle:cp`** — Duplicate a bundle (source files + config) under a new name within the same project, with a word-boundary name rewrite, a fresh full protocol/scheme/env port matrix, and `--dry-run` / `--force`. | `0.4.1-alpha.2` | 2026-05-31 |
|
|
70
|
+
| ✅ | **`project:status`** — Show the running/stopped state of each bundle in a project with PID and port info. | `0.4.1-alpha.2` | 2026-05-30 |
|
|
70
71
|
|
|
71
72
|
### Tier 3 — `0.5.0`
|
|
72
73
|
|
|
@@ -181,6 +182,16 @@ HTTP security response headers as opt-in `gina.plugins.*` middlewares, mirroring
|
|
|
181
182
|
|
|
182
183
|
---
|
|
183
184
|
|
|
185
|
+
## Accessibility
|
|
186
|
+
|
|
187
|
+
Client-side form-validation accessibility — keeping `FormValidator`'s ARIA state in sync with field validity so screen-reader users get the same error feedback sighted users already get from native `:user-invalid` styling. No new public API; behaviour applies to fields that opt in through their existing ARIA markup. Models the `isInList` rule + CSP-nonce (#HDR16) rollout: ship behind the existing validator API, default-on for opted-in markup, no consuming-app code change.
|
|
188
|
+
|
|
189
|
+
| Status | Feature | Version | Target |
|
|
190
|
+
| --- | --- | --- | --- |
|
|
191
|
+
| 📋 | **`aria-invalid` validity reflection (#A11Y1)** — `FormValidator` keeps `aria-invalid` in sync with each managed field's effective validity, so a field's `aria-errormessage` (and error `aria-describedby`) association is actually exposed to assistive technology. Per WAI-ARIA those associations are inert unless the field also carries `aria-invalid="true"`, so today screen-reader users are never told which field is invalid or what the error says even when the markup wires `aria-errormessage`. On every blur and submit pass — plus on `input` once a field has errored at least once — the validator sets `aria-invalid="true"` when invalid and `aria-invalid="false"` when valid; a pristine, never-validated field carries no attribute (three-state: absent / `false` / `true`, where `false` is a DOM-observable touched-and-valid signal the post-error `input` revalidation reads off the element). Where the field has native HTML constraints the native `ValidityState` (`element.validity.valid`) is the source of truth, so the attribute never disagrees with the `:user-invalid` styling that already drives the visible error. When the field already references an error element via `aria-errormessage`, the validator does NOT inject its `form-item-error-message` div (no duplicate message) — setting `aria-invalid` is enough to expose the existing element; legacy forms with no association keep the injected div and additionally gain an `aria-errormessage` wire to it. On a failed submit, focus moves to the first invalid field; blur-time errors (focus already gone) are announced through a dedicated visually-hidden `aria-live="polite"` status region rather than the static message, since a CSS `:user-invalid` display toggle is not reliably announced — suppressed for any field that simultaneously receives focus to avoid double-speaking. No new public API; existing `form-item-error` / `form-item-warning` / `form-item-error-message` / `error-message` / `data-gina-form-errors` classes and the submit-button `aria-disabled` / `disabled` toggling are unchanged. Acceptance: VoiceOver + NVDA announce the invalid field and its `aria-errormessage` text on a failed blur and submit, and stop once corrected; no visual regression on forms already using `form-item-error` / `error-message`. First consumer: freelancer-app-v3 public contact form. | `0.4.2-alpha` | Q3 2026 |
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
184
195
|
## Secrets & Configuration
|
|
185
196
|
|
|
186
197
|
Secrets handling for bundle JSON configs without baking plaintext values into source. Pluggable-backend design with `process.env` as the default; the reserved API surface allows future Vault / SOPS / K8s Secrets backends to slot in without changing call sites or the placeholder syntax.
|
|
@@ -273,7 +284,7 @@ A cold audit of the Couchbase connector identified two critical security vulnera
|
|
|
273
284
|
| ✅ | **HTTP/2 session metrics** — expose active session count, stream count, GOAWAY and RST_STREAM totals via `/_gina/info` | `0.3.0-alpha.1` | 2026-04-01 | `server._h2Metrics` counter object instrumented via session event handlers; exposed under `"http2"` key in `/_gina/info` JSON. |
|
|
274
285
|
| ✅ | **Configurable `maxConcurrentStreams` and `initialWindowSize`** — move from hardcoded to `settings.json` `http2Options` | `0.3.0-alpha.1` | 2026-04-05 | All four HTTP/2 server settings configurable: `maxConcurrentStreams` (256), `initialWindowSize` (655350), `maxSessionRejectedStreams` (100), `maxSessionInvalidFrames` (1000). Security guards (`maxHeaderListSize`, `enablePush`) remain hardcoded. |
|
|
275
286
|
| ✅ | **Application-level rapid reset rate limiter** (CVE-2023-44487) — per-session stream creation counter | `0.3.13` | 2026-05-14 | The Isaac HTTP/2 session handler counts new streams in a rolling 1s window per session; over `maxStreamsPerSecond` (default 200) it sends a GOAWAY and closes the session. More targeted than `maxSessionRejectedStreams` (which counts refused streams, not created ones). Configurable via `settings.json` `http2Options.maxStreamsPerSecond`; `/_gina/info` exposes a `rapidResetBlocked` counter. |
|
|
276
|
-
|
|
|
287
|
+
| ✅ | **Trailer support** — `stream.sendTrailers()` + `waitForTrailers: true` | `0.4.0` | 2026-05-22 | Opt-in HTTP/2 response trailers via `self.sendTrailers(fields)`. The render pipeline sets `waitForTrailers` and emits the trailing headers after the body (in the `wantTrailers` event), across all render delegates. Activated only when a controller calls `self.sendTrailers(fields)`; HTTP/1.1 and the no-trailers path are unchanged. For gRPC-style streaming (`grpc-status`) and content-integrity (`Digest`) use cases. |
|
|
277
288
|
| 📋 | **Alt-Svc header** — advertise HTTP/3 availability | `0.5.0` | Q1 2027 | Set `Alt-Svc: h3=":443"; ma=86400` response header to advertise HTTP/3 (QUIC) availability via a QUIC-capable reverse proxy (nginx, Caddy, Cloudflare). Gina does not need to implement QUIC — just announce it. Opt-in via `settings.server.json`. Native HTTP/3 is out of scope: Node.js has no stable QUIC API, and the standard deployment topology (Gina → proxy → client) already delivers HTTP/3 at the edge. |
|
|
278
289
|
| 📋 | **RFC 9218 Extensible Priorities** — read `Priority: u=N, i` request header | `0.5.0` | Q1 2027 | Use the RFC 9218 priority header to order response writes for multiplexed API clients. Low value for typical HTML page loads; high value for parallel API requests with declared urgency. |
|
|
279
290
|
| 📋 | **WebSocket over HTTP/2** (RFC 8441 — CONNECT method extension) | `0.5.0` | Q1 2027 | Tunnel WebSocket over an HTTP/2 stream without a separate HTTP/1.1 connection. Node.js supports this since v10.19. Enables WebSocket in HTTP/2-only deployments. |
|
package/bin/cli
CHANGED
|
@@ -63,6 +63,18 @@ async function onExec() {
|
|
|
63
63
|
var packObj = require(pack);
|
|
64
64
|
var version = getEnvVar('GINA_VERSION') || packObj.version;// jshint ignore:line
|
|
65
65
|
frameworkPath = ginaPath + '/framework/v' + version;
|
|
66
|
+
// Validate the framework dir exists BEFORE requiring from it. GINA_VERSION
|
|
67
|
+
// (env/state) can point at a version that is not installed here — a stale
|
|
68
|
+
// pin, or a bind-mounted dev tree whose version differs from the expected
|
|
69
|
+
// one. Without this guard the require() below throws an opaque
|
|
70
|
+
// MODULE_NOT_FOUND that the catch mislabels as "could not load
|
|
71
|
+
// package.json", and every CLI command silently fails (e.g. project
|
|
72
|
+
// registration never runs). The sibling guard further down (resolving
|
|
73
|
+
// GINA_FRAMEWORK_DIR) runs too late — after this require.
|
|
74
|
+
if ( !fs.existsSync(frameworkPath) ) {
|
|
75
|
+
process.stderr.write('gina: framework version ' + version + ' is not installed (expected at ' + frameworkPath + ').\nInstalled package version is ' + packObj.version + '.\nTry:\n $ gina framework:install ' + version + '\n');
|
|
76
|
+
return process.exit(1);
|
|
77
|
+
}
|
|
66
78
|
var generator = require(frameworkPath + '/lib/generator');
|
|
67
79
|
|
|
68
80
|
require(frameworkPath + '/lib');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.4.1
|
|
@@ -19734,9 +19734,6 @@ if ( ( typeof(module) !== 'undefined' ) && module.exports ) {
|
|
|
19734
19734
|
define( 'lib/inherits',[],function() { return Inherits(); });
|
|
19735
19735
|
};
|
|
19736
19736
|
|
|
19737
|
-
if ( typeof(module) !== 'undefined' && module.exports ) {
|
|
19738
|
-
var lib = require('../../index');
|
|
19739
|
-
}
|
|
19740
19737
|
|
|
19741
19738
|
/**
|
|
19742
19739
|
* @module lib/collection
|
|
@@ -510,7 +510,7 @@ typeof Object.assign!=='function'&&Object.defineProperty(Object,'assign',{value:
|
|
|
510
510
|
if(typeof JSON.clone=='undefined'){var clone=function(m,E){if(m==null||typeof m!='object'||m.constructor!=Object&&m.constructor!=Array)return m;if(m.constructor==Date||m.constructor==RegExp||m.constructor==Function||m.constructor==String||m.constructor==Number||m.constructor==Boolean)return new m.constructor(m);E=E||new m.constructor;for(var J=0,M=Object.getOwnPropertyNames(m).length||0,C=Object.keys(m);J<M;)E[C[J]]=typeof E[C[J]]=='undefined'?clone(m[C[J]],null):E[C[J]],J++;return E};JSON.clone=
|
|
511
511
|
clone}if(typeof JSON.escape=='undefined'){var escape=function(m){try{return m.replace(/\n/g,'\\n').replace(/\r/g,'\\r').replace(/\t/g,'\\t')}catch(E){throw E;}};JSON.escape=escape}define('utils/polyfill',function(){});
|
|
512
512
|
function Inherits(m,E){return function(J,M){var C=typeof J=='undefined'||typeof M=='undefined'?"inherits(a, b): neither [ a ] nor [ b ] can't be undefined or null":!1;if(C)throw Error(C);C=function(){return function(){if(this){this.prototype=J.prototype;this.name||(this.name=J.name);this.prototype.name=this.name;for(var A in M.prototype)this[A]||(this[A]=M.prototype[A]);M.apply(this,arguments);J.apply(this,arguments)}}}(J,M);J.prototype==void 0&&(J.prototype={});M.prototype==void 0&&(M.prototype=
|
|
513
|
-
{});J.prototype=Object.create(M.prototype,{});C.prototype=Object.create(J.prototype,{});return C}}typeof module!=='undefined'&&module.exports?module.exports=Inherits():typeof define==='function'&&define.amd&&define('lib/inherits',[],function(){return Inherits()});
|
|
513
|
+
{});J.prototype=Object.create(M.prototype,{});C.prototype=Object.create(J.prototype,{});return C}}typeof module!=='undefined'&&module.exports?module.exports=Inherits():typeof define==='function'&&define.amd&&define('lib/inherits',[],function(){return Inherits()});
|
|
514
514
|
function Collection(m,E){var J=typeof module!=='undefined'&&module.exports?!1:!0,M=J?require('lib/uuid'):require('../../../lib/uuid'),C=J?require('lib/merge'):require('../../../lib/merge'),A={isCaseSensitive:{false:{re:'^%s$',modifiers:'i'},true:{re:'^%s$'}},skipEval:!1},U=!1,D=!1,Y=null;J={useLocalStorage:!1,locale:'en',searchOptionRules:A};E=typeof E=='object'?C(E,J):J;var n=['not null'],l=/^\s*(new\s+Date\("[^"]*"\)|"[^"]*"|-?\d+(?:\.\d+)?)\s*(===|!==|<=|>=|==|!=|<|>)\s*(new\s+Date\("[^"]*"\)|"[^"]*"|-?\d+(?:\.\d+)?)\s*$/,
|
|
515
515
|
c=function(h){var g=h.match(/^\s*new\s+Date\("([^"]*)"\)\s*$/);if(g)return new Date(g[1]);g=h.replace(/^\s+|\s+$/g,'');if(/^"[^"]*"$/.test(g))return g.slice(1,-1);var r=Number(g);if(!isNaN(r)&&g!=='')return r;throw Error('Invalid operand: `'+h+'`');},S=function(h){var g=typeof h=='string'?h.match(l):null;if(!g)throw Error('Could not evaluate condition `'+h+'`.\n(grammar: <operand><op><operand>; operand \u2208 number | "string" | new Date("..."); op \u2208 === !== == != < > <= >=)');try{var r=c(g[1]),
|
|
516
516
|
F=g[2],N=c(g[3]);if(F==='<'||F==='>'||F==='<='||F==='>=')r instanceof Date&&(r=r.getTime()),N instanceof Date&&(N=N.getTime());switch(F){case '===':return r===N;case '!==':return r!==N;case '==':return r==N;case '!=':return r!=N;case '<':return r<N;case '>':return r>N;case '<=':return r<=N;case '>=':return r>=N}}catch(q){throw Error('Could not evaluate condition `'+h+'`.\n'+q.stack);}};if(typeof m=='undefined'||m==''||m==null)m=[];if(!Array.isArray(m))throw Error('`new Collection([content] [, options] )`: `content` argument must be an Array !');
|
|
Binary file
|
|
@@ -1059,6 +1059,49 @@ function SuperController(options) {
|
|
|
1059
1059
|
return (/(http|ftp|https|sftp):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/.test(url)) ? true : false;
|
|
1060
1060
|
}
|
|
1061
1061
|
|
|
1062
|
+
/**
|
|
1063
|
+
* Override the route's default template path / extension at action time.
|
|
1064
|
+
*
|
|
1065
|
+
* Use case: a controller action that resolves the template dynamically
|
|
1066
|
+
* (e.g. a catch-all router that picks the template by URL pattern). With
|
|
1067
|
+
* Gina's standard 1:1 routing.json → template mapping the rule's
|
|
1068
|
+
* `param.file` is sufficient, but dynamic dispatch needs a runtime
|
|
1069
|
+
* override that survives until render-time.
|
|
1070
|
+
*
|
|
1071
|
+
* The render delegates (controller.render-swig.js,
|
|
1072
|
+
* controller.render-nunjucks.js) read `localOptions._templateOverride`
|
|
1073
|
+
* and use it verbatim under the templates root — with no namespace
|
|
1074
|
+
* prefixing — before falling back to `data.page.view.file`/`.ext`.
|
|
1075
|
+
* Setting this after `setOptions()` has already populated
|
|
1076
|
+
* `data.page.view.*` is the supported way to redirect rendering from
|
|
1077
|
+
* inside an action — that eviction-order is otherwise unreachable from
|
|
1078
|
+
* controller code because `local.options` is closure-private.
|
|
1079
|
+
*
|
|
1080
|
+
* @memberof BaseController
|
|
1081
|
+
* @param {string} file - Template path relative to the bundle's
|
|
1082
|
+
* templates root (no extension; pass `ext` separately).
|
|
1083
|
+
* @param {string} [ext] - File extension (with or without leading dot).
|
|
1084
|
+
* Defaults to whatever `data.page.view.ext` carries.
|
|
1085
|
+
* @returns {void}
|
|
1086
|
+
* @example
|
|
1087
|
+
* // Catch-all action dispatching to a template chosen at runtime:
|
|
1088
|
+
* this.catchAll = function (req, res, next) {
|
|
1089
|
+
* var self = this;
|
|
1090
|
+
* self.setTemplate('errors/' + res.statusCode); // → templates/errors/404(.html)
|
|
1091
|
+
* self.render({ message: 'Not found' });
|
|
1092
|
+
* };
|
|
1093
|
+
*/
|
|
1094
|
+
this.setTemplate = function (file, ext) {
|
|
1095
|
+
if (!local.options) return; // setOptions hasn't run yet — bail safely
|
|
1096
|
+
if (!local.options._templateOverride) local.options._templateOverride = {};
|
|
1097
|
+
if (typeof file === 'string') {
|
|
1098
|
+
local.options._templateOverride.file = file;
|
|
1099
|
+
}
|
|
1100
|
+
if (typeof ext === 'string' && ext) {
|
|
1101
|
+
local.options._templateOverride.ext = (ext.charAt(0) === '.') ? ext : ('.' + ext);
|
|
1102
|
+
}
|
|
1103
|
+
};
|
|
1104
|
+
|
|
1062
1105
|
/**
|
|
1063
1106
|
* Render the current view without its layout wrapper.
|
|
1064
1107
|
* Delegates to `self.render()` after setting `local.options.isWithoutLayout = true`.
|
|
@@ -136,6 +136,7 @@ var emitInspectorWindowData = require('./inspector-window-emit');
|
|
|
136
136
|
// undefined and crashes the module-level read. Push upstream to gina-io/gina.
|
|
137
137
|
var libRef = require('../../lib') || require.cache[require.resolve('../../lib')];
|
|
138
138
|
var Collection = libRef.Collection;
|
|
139
|
+
var merge = libRef.merge;
|
|
139
140
|
// #NJ3 — static HTML cache writes. Module-scoped `cache` instance mirrors
|
|
140
141
|
// `render-swig.js:6` and `render-json.js:5`. Per-request, the main render
|
|
141
142
|
// function re-points it at the server's shared in-memory store (key:
|
|
@@ -204,6 +205,17 @@ function getEnvironment(nunjucks, templateRoot, options) {
|
|
|
204
205
|
* @returns {string} relative template path
|
|
205
206
|
*/
|
|
206
207
|
function resolveTemplatePath(data, localOptions) {
|
|
208
|
+
// Honour controller-set override from self.setTemplate(file, ext).
|
|
209
|
+
// When set, the override fully replaces the rule's default path —
|
|
210
|
+
// no namespace prefixing — so a catch-all dispatcher can drop the
|
|
211
|
+
// controller anywhere under the templates root.
|
|
212
|
+
if (localOptions && localOptions._templateOverride && localOptions._templateOverride.file) {
|
|
213
|
+
var ovFile = localOptions._templateOverride.file;
|
|
214
|
+
var ovExt = localOptions._templateOverride.ext || data.page.view.ext || '';
|
|
215
|
+
if (ovExt && !ovFile.endsWith(ovExt)) ovFile += ovExt;
|
|
216
|
+
return ovFile;
|
|
217
|
+
}
|
|
218
|
+
|
|
207
219
|
var file = data.page.view.file;
|
|
208
220
|
var ext = data.page.view.ext || '';
|
|
209
221
|
|
|
@@ -639,6 +651,70 @@ function registerGinaFilters(env, self, local, localOptions, req, res) {
|
|
|
639
651
|
}
|
|
640
652
|
}
|
|
641
653
|
|
|
654
|
+
/**
|
|
655
|
+
* Invoke the bundle's `controllers/setup.js` (if any) with `this.engine`
|
|
656
|
+
* bound to the cached `nunjucks.Environment`, so user code can call
|
|
657
|
+
* `engine.addFilter(name, fn)` to extend filters on the nunjucks side
|
|
658
|
+
* the same way it already can on swig (where `self.engine = swig` is
|
|
659
|
+
* set by `controller.js` before setup runs).
|
|
660
|
+
*
|
|
661
|
+
* Without this hook, every nunjucks bundle that uses the documented
|
|
662
|
+
* setup.js pattern (`var engine = this.engine; engine.addFilter(...)`)
|
|
663
|
+
* silently no-ops because `this.engine` arrives as the controller's
|
|
664
|
+
* default `{}` — the nunjucks engine is created lazily here in the
|
|
665
|
+
* render delegate, after the controller's onReady->setup chain has
|
|
666
|
+
* already fired.
|
|
667
|
+
*
|
|
668
|
+
* Run once per `nunjucks.Environment` instance: marker `_userSetupDone`
|
|
669
|
+
* is stamped on the env itself so re-renders are no-ops, and a fresh
|
|
670
|
+
* env (e.g. after `nunjucksResolver.reset()`) re-runs setup.
|
|
671
|
+
*
|
|
672
|
+
* @inner
|
|
673
|
+
* @param {*} env - cached `nunjucks.Environment`
|
|
674
|
+
* @param {object} self - SuperController instance (provides throwError)
|
|
675
|
+
* @param {object} local - per-request closure (`req`, `res`, `next`)
|
|
676
|
+
* @param {object} localOptions - controller's localOptions (has `bundle`, `conf.bundlesPath`)
|
|
677
|
+
* @param {object} req - function-scoped capture of `local.req` (#M1 async-race guard)
|
|
678
|
+
* @param {object} res - function-scoped capture of `local.res`
|
|
679
|
+
* @param {Function} _next - function-scoped capture of `local.next`
|
|
680
|
+
* @returns {void}
|
|
681
|
+
*/
|
|
682
|
+
function registerUserFilters(env, self, local, localOptions, req, res, _next) {
|
|
683
|
+
if (env._userSetupDone) return;
|
|
684
|
+
if (!localOptions || !localOptions.bundle || !localOptions.conf || !localOptions.conf.bundlesPath) return;
|
|
685
|
+
|
|
686
|
+
var setupFile = localOptions.conf.bundlesPath + '/' + localOptions.bundle + '/controllers/setup.js';
|
|
687
|
+
if (!fs.existsSync(setupFile)) {
|
|
688
|
+
env._userSetupDone = true; // no setup.js — nothing to do, don't recheck
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
var Setup;
|
|
693
|
+
try {
|
|
694
|
+
Setup = require(setupFile);
|
|
695
|
+
} catch (loadErr) {
|
|
696
|
+
try { console.warn('[render-nunjucks] failed to load user setup.js (' + setupFile + '): ' + (loadErr.message || loadErr)); } catch (e) {}
|
|
697
|
+
env._userSetupDone = true;
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
if (typeof Setup !== 'function') {
|
|
702
|
+
env._userSetupDone = true;
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
Setup.engine = env;
|
|
707
|
+
Setup.throwError = self.throwError;
|
|
708
|
+
|
|
709
|
+
try {
|
|
710
|
+
Setup.apply(Setup, [req, res, _next]);
|
|
711
|
+
} catch (setupErr) {
|
|
712
|
+
try { console.warn('[render-nunjucks] user setup.js threw: ' + (setupErr.message || setupErr)); } catch (e) {}
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
env._userSetupDone = true;
|
|
716
|
+
}
|
|
717
|
+
|
|
642
718
|
/**
|
|
643
719
|
* Post-render asset injection — the nunjucks counterpart to the pre-compile
|
|
644
720
|
* layout mutation in `render-swig.js:963-1195`. Idempotent and safe to call
|
|
@@ -949,18 +1025,42 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
|
|
|
949
1025
|
));
|
|
950
1026
|
}
|
|
951
1027
|
|
|
952
|
-
// Merge user data into
|
|
953
|
-
//
|
|
954
|
-
//
|
|
955
|
-
//
|
|
1028
|
+
// Merge user data into the render context, mirroring `render-swig.js`.
|
|
1029
|
+
//
|
|
1030
|
+
// (a) Branching stash — if userData has no `page` key, copy it into
|
|
1031
|
+
// `data.page.data` (so `{{ page.data.foo }}` works). userData with
|
|
1032
|
+
// a `page` key skips the stash.
|
|
1033
|
+
// (b) Unconditional top-level merge — userData wins on collision;
|
|
1034
|
+
// userData.page merges INTO data.page (per-key) so a controller
|
|
1035
|
+
// passing `page.*` does not wholesale-replace the subtree.
|
|
1036
|
+
// (c) Framework-data restore — re-overlay getData() so the deep merge
|
|
1037
|
+
// brings back any framework-injected page.environment/page.view/
|
|
1038
|
+
// page.data.session keys that (b)'s per-key page write dropped.
|
|
1039
|
+
// This is the `render-swig.js:593` step nunjucks was missing; without
|
|
1040
|
+
// it a controller passing a partial `page.environment` clobbers
|
|
1041
|
+
// webroot/hostname/version (§4 parity rule).
|
|
956
1042
|
if (userData && typeof(userData) === 'object') {
|
|
957
|
-
|
|
1043
|
+
// (a) Branching stash
|
|
1044
|
+
if (!userData.page) {
|
|
1045
|
+
if (!data.page.data) { data.page.data = {}; }
|
|
1046
|
+
Object.keys(userData).forEach(function (k) {
|
|
1047
|
+
data.page.data[k] = userData[k];
|
|
1048
|
+
});
|
|
1049
|
+
}
|
|
1050
|
+
// (b) Unconditional top-level merge — userData wins; userData.page
|
|
1051
|
+
// merges INTO data.page (preserves framework-injected page.view etc.).
|
|
958
1052
|
Object.keys(userData).forEach(function (k) {
|
|
959
|
-
data.page.
|
|
960
|
-
|
|
1053
|
+
if (k === 'page' && data.page && typeof userData.page === 'object') {
|
|
1054
|
+
Object.keys(userData.page).forEach(function (pk) {
|
|
1055
|
+
data.page[pk] = userData.page[pk];
|
|
1056
|
+
});
|
|
1057
|
+
} else {
|
|
961
1058
|
data[k] = userData[k];
|
|
962
1059
|
}
|
|
963
1060
|
});
|
|
1061
|
+
// (c) Restore framework page.* — deep-merge getData() back on top so
|
|
1062
|
+
// page.environment/page.view/page.data.session survive (b).
|
|
1063
|
+
data = merge(data, getData());
|
|
964
1064
|
}
|
|
965
1065
|
|
|
966
1066
|
// FRAMEWORK PATCH: Bug J — alias `data.data` to `data.page.data`
|
|
@@ -1001,6 +1101,16 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
|
|
|
1001
1101
|
return self.throwError(filterErr);
|
|
1002
1102
|
}
|
|
1003
1103
|
|
|
1104
|
+
// #NJ1b — give the bundle's controllers/setup.js a chance to extend
|
|
1105
|
+
// filters via `this.engine.addFilter(...)`, mirroring the swig path
|
|
1106
|
+
// where `self.engine = swig` is set in controller.js before setup runs.
|
|
1107
|
+
// No-op if no setup.js exists or it doesn't add filters.
|
|
1108
|
+
try {
|
|
1109
|
+
registerUserFilters(env, self, local, localOptions, req, res, _next);
|
|
1110
|
+
} catch (userFilterErr) {
|
|
1111
|
+
try { console.warn('[render-nunjucks] registerUserFilters failed: ' + (userFilterErr.message || userFilterErr)); } catch (e) {}
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1004
1114
|
// #NJ2 — build the per-request template config and populate
|
|
1005
1115
|
// `data.page.view.stylesheets` / `data.page.view.scripts`. Mirrors the
|
|
1006
1116
|
// swig path at render-swig.js:493-499. When `isWithoutLayout` is set
|
|
@@ -312,7 +312,18 @@ module.exports = async function render(userData, displayInspector, errOptions, d
|
|
|
312
312
|
}
|
|
313
313
|
file = (isRenderingCustomError) ? localOptions.file : data.page.view.file;
|
|
314
314
|
// making path thru [namespace &] file
|
|
315
|
-
|
|
315
|
+
// #27 — self.setTemplate(file, ext) override wins and fully replaces
|
|
316
|
+
// the path with NO namespace prefixing (mirrors render-nunjucks
|
|
317
|
+
// resolveTemplatePath), so a catch-all dispatcher can target any
|
|
318
|
+
// template under the templates root. Skipped during custom-error
|
|
319
|
+
// rendering, which renders the framework error template instead.
|
|
320
|
+
if ( !isRenderingCustomError && localOptions._templateOverride && typeof(localOptions._templateOverride.file) === 'string' && localOptions._templateOverride.file ) {
|
|
321
|
+
file = data.page.view.file = localOptions._templateOverride.file;
|
|
322
|
+
if ( typeof(localOptions._templateOverride.ext) === 'string' && localOptions._templateOverride.ext ) {
|
|
323
|
+
data.page.view.ext = localOptions._templateOverride.ext;
|
|
324
|
+
}
|
|
325
|
+
path = _(localOptions.template.html + '/' + file);
|
|
326
|
+
} else if ( typeof(localOptions.namespace) != 'undefined' && localOptions.namespace ) {
|
|
316
327
|
// excepted for custom paths
|
|
317
328
|
var fileNamingConvention = file.replace(localOptions.namespace+'-', '');
|
|
318
329
|
// replaced: !/^(\.|\/|\\)/.test(file) → charAt(0) checks (#P9)
|
|
@@ -535,6 +546,15 @@ module.exports = async function render(userData, displayInspector, errOptions, d
|
|
|
535
546
|
|
|
536
547
|
if (!userData) {
|
|
537
548
|
userData = { page: { view: {}}}
|
|
549
|
+
} else if ( isWithoutLayout ) {
|
|
550
|
+
// Layoutless renders (self.renderWithoutLayout) have no page envelope
|
|
551
|
+
// — no `view.layout`, no breadcrumb, no session card — so the
|
|
552
|
+
// `page`-key-presence gating used below for full pages serves no
|
|
553
|
+
// purpose here and only buries the controller's context under
|
|
554
|
+
// `data.page.data`, where the fragment template's top-level
|
|
555
|
+
// {{ var }} references can't reach it. Merge user context at
|
|
556
|
+
// top level unconditionally for fragments.
|
|
557
|
+
data = (isRenderingCustomError) ? userData : merge(userData, data)
|
|
538
558
|
} else if ( userData && !userData['page']) {
|
|
539
559
|
|
|
540
560
|
if ( typeof(data['page']['data']) == 'undefined' )
|
|
@@ -2178,7 +2178,25 @@ function Server(options) {
|
|
|
2178
2178
|
!isBinary
|
|
2179
2179
|
&& typeof(self._options.template.assets[request.url]) == 'undefined'
|
|
2180
2180
|
) {
|
|
2181
|
-
|
|
2181
|
+
// #assets-guard — getAssets() returns the assets map SERIALIZED as a
|
|
2182
|
+
// string (its render-path consumers in controller.render-swig.js /
|
|
2183
|
+
// controller.render-v1.js embed it verbatim). `template.assets` must
|
|
2184
|
+
// stay an OBJECT here: assigning the raw string and then writing
|
|
2185
|
+
// `template.assets[request.url]` below throws under 'use strict'
|
|
2186
|
+
// (TypeError: Cannot create property '<url>' on string '{}'), killing the
|
|
2187
|
+
// bundle under concurrent static requests (Chrome HTTP/2 favicon/manifest
|
|
2188
|
+
// prefetch). Parse it back into the object form it represents.
|
|
2189
|
+
try {
|
|
2190
|
+
self._options.template.assets = JSON.parse( getAssets(bundleConf, file) || '{}' );
|
|
2191
|
+
} catch (e) {
|
|
2192
|
+
self._options.template.assets = {};
|
|
2193
|
+
}
|
|
2194
|
+
}
|
|
2195
|
+
|
|
2196
|
+
// #assets-guard — defense-in-depth: never write a property on a non-object
|
|
2197
|
+
// assets map (binary requests skip the coercion above).
|
|
2198
|
+
if ( typeof(self._options.template.assets) != 'object' || self._options.template.assets == null ) {
|
|
2199
|
+
self._options.template.assets = {};
|
|
2182
2200
|
}
|
|
2183
2201
|
|
|
2184
2202
|
if (
|
|
@@ -2261,6 +2279,10 @@ function Server(options) {
|
|
|
2261
2279
|
contentType = contentType +'; charset='+ bundleConf.encoding;
|
|
2262
2280
|
ext = request.url.match(/\.([A-Za-z0-9]+)$/);
|
|
2263
2281
|
request.url = ( ext != null && typeof(ext[0]) != 'undefined' ) ? request.url : request.url + 'index.html';
|
|
2282
|
+
// #assets-guard — defense-in-depth before the property writes below.
|
|
2283
|
+
if ( typeof(self._options.template.assets) != 'object' || self._options.template.assets == null ) {
|
|
2284
|
+
self._options.template.assets = {};
|
|
2285
|
+
}
|
|
2264
2286
|
if (
|
|
2265
2287
|
!isPathMatchingUrl
|
|
2266
2288
|
&& typeof(self._options.template.assets[request.url]) == 'undefined'
|
|
@@ -182,6 +182,14 @@ function Add(opt, cmd) {
|
|
|
182
182
|
/**
|
|
183
183
|
* Checks if the bundle already exists and prompts for replace/import/cancel.
|
|
184
184
|
*
|
|
185
|
+
* When the bundle already exists and neither `--replace` nor `--import` was
|
|
186
|
+
* passed, an interactive prompt is shown. In a non-interactive context (no
|
|
187
|
+
* TTY — container entrypoint, CI, piped/detached stdin) that prompt cannot be
|
|
188
|
+
* answered: the module-scope readline closes on stdin EOF before this async
|
|
189
|
+
* scan callback runs, so `rl.prompt()` would throw ERR_USE_AFTER_CLOSE. The
|
|
190
|
+
* guard below fails fast with guidance to re-run with `--import` or
|
|
191
|
+
* `--replace` instead of surfacing an opaque "readline was closed" rollback.
|
|
192
|
+
*
|
|
185
193
|
* @inner
|
|
186
194
|
* @private
|
|
187
195
|
*/
|
|
@@ -215,6 +223,22 @@ function Add(opt, cmd) {
|
|
|
215
223
|
return;
|
|
216
224
|
}
|
|
217
225
|
|
|
226
|
+
// Interactive prompt requires a TTY. In a non-interactive context
|
|
227
|
+
// (container entrypoint, CI, piped or detached stdin) the module-scope
|
|
228
|
+
// readline closes on stdin EOF before this async scan callback runs, so
|
|
229
|
+
// rl.prompt() below would throw ERR_USE_AFTER_CLOSE — caught upstream and
|
|
230
|
+
// surfaced as an opaque "could not complete bundle creation: readline was
|
|
231
|
+
// closed" rollback. Fail fast with actionable guidance instead.
|
|
232
|
+
if ( !process.stdin.isTTY || rl.closed ) {
|
|
233
|
+
console.error(
|
|
234
|
+
'Bundle [ '+ local.bundle +' ] already exists, but no choice can be read: stdin is not interactive (no TTY).\n'
|
|
235
|
+
+ 'Re-run with --import to register the existing source, or --replace to overwrite it (existing files will be lost):\n'
|
|
236
|
+
+ ' gina bundle:add '+ local.bundle +' @'+ self.projectName +' --import\n'
|
|
237
|
+
+ ' gina bundle:add '+ local.bundle +' @'+ self.projectName +' --replace'
|
|
238
|
+
);
|
|
239
|
+
return process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
|
|
218
242
|
rl.setPrompt('Bundle [ '+ local.bundle +' ] already exists !\n(r) Replace - All existing files will be lost !\n(c) Cancel\n(i) Import\n> ');
|
|
219
243
|
|
|
220
244
|
rl.prompt();
|