gina 0.1.8 → 0.1.9-alpha.2
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/.github/workflows/test.yml +33 -0
- package/CONTRIBUTING.md +10 -1
- package/GOVERNANCE.md +1 -1
- package/README.md +29 -10
- package/ROADMAP.md +69 -11
- package/framework/v0.1.9-alpha.2/VERSION +1 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.gz +0 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/index.js +62 -15
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.v2.js +56 -16
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.v3.js +134 -107
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.v4.js +127 -84
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.v3.js +32 -50
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.v4.js +1 -1
- package/framework/v0.1.9-alpha.2/core/connectors/redis/index.js +30 -0
- package/framework/v0.1.9-alpha.2/core/connectors/redis/lib/session-store.js +229 -0
- package/framework/v0.1.9-alpha.2/core/connectors/sqlite/index.js +32 -0
- package/framework/v0.1.9-alpha.2/core/connectors/sqlite/lib/session-store.js +262 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.js +27 -78
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.render-json.js +6 -8
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/gna.js +23 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/entity.js +19 -14
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/server.isaac.js +11 -2
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/server.js +2 -4
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/app.json +1 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/connectors.json +11 -9
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/routing.json +2 -1
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/settings.json +1 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/index.js +23 -1
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/public_suffix_list.dat.gz +0 -0
- package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/session-store.js +8 -5
- package/package.json +12 -9
- package/schema/app.crons.json +50 -0
- package/schema/app.json +72 -0
- package/schema/connectors.json +63 -0
- package/schema/routing.json +75 -0
- package/schema/settings.json +132 -0
- package/framework/v0.1.8/VERSION +0 -1
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/AUTHORS +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/html/static.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.br +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/uuid.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/config.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/content.encoding +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/controller/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/optimist-0.6.1/readme.markdown +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/HISTORY.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/bin/swig.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/dist/swig.min.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/dateformatter.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/filters.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/lexer.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/loaders/filesystem.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/loaders/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/loaders/memory.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/parser.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/swig.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/autoescape.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/block.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/else.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/elseif.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/extends.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/filter.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/for.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/if.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/import.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/include.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/macro.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/parent.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/raw.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/set.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/tags/spaceless.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/lib/utils.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-1.4.2/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-client/swig-2.0.0.min.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/deps/swig-client/swig.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/currency.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/locales/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/mime.types +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/model/template/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/file/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/file/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/file/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/intl/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/router.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/server.express.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/status.codes +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/_gitignore +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/env.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/console.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/context.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/path.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/prototypes.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/task.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/helpers/text.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/config.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cron/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cron/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/2025-03-14_13-41-20_UTC.dat +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/public_suffix_list.dat +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/dist/public_suffix_list.dat.br +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/generator/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/math/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/merge/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/merge/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/model.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/proc.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/build.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/shell.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/url/README.md +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/url/index.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/url/routing.json +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/lib/validator.js +0 -0
- /package/framework/{v0.1.8 → v0.1.9-alpha.2}/package.json +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [develop, master]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [develop, master]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
name: Node.js ${{ matrix.node-version }}
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
node-version: [18, 20, 22]
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
23
|
+
uses: actions/setup-node@v4
|
|
24
|
+
with:
|
|
25
|
+
node-version: ${{ matrix.node-version }}
|
|
26
|
+
|
|
27
|
+
- name: Run tests
|
|
28
|
+
run: |
|
|
29
|
+
node --test \
|
|
30
|
+
'test/core/*.test.js' \
|
|
31
|
+
'test/lib/*.test.js' \
|
|
32
|
+
'test/bin/*.test.js' \
|
|
33
|
+
'test/integration/helper.test.js'
|
package/CONTRIBUTING.md
CHANGED
|
@@ -170,7 +170,7 @@ Before opening a PR against `develop`:
|
|
|
170
170
|
- [ ] New behaviour is covered by a test (or an explanation is provided for why it cannot be)
|
|
171
171
|
- [ ] A `changie new` entry exists for any user-facing change
|
|
172
172
|
- [ ] Commit messages follow the style above
|
|
173
|
-
- [ ] Docs updated if public API, CLI, or config schema changed
|
|
173
|
+
- [ ] Docs updated if public API, CLI, or config schema changed (see [gina-io/docs/CONTRIBUTING.md](https://github.com/gina-io/docs/blob/main/CONTRIBUTING.md))
|
|
174
174
|
|
|
175
175
|
---
|
|
176
176
|
|
|
@@ -188,3 +188,12 @@ Open a [GitHub issue](https://github.com/Rhinostone/gina/issues) and include:
|
|
|
188
188
|
## Proposing features
|
|
189
189
|
|
|
190
190
|
Open a GitHub issue describing the use case **before** writing code. Features that align with the [roadmap](./ROADMAP.md) and architecture are most likely to be accepted. Significant API changes go through a public discussion period before being finalised.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Maintainers
|
|
195
|
+
|
|
196
|
+
| Name | Role | Profile |
|
|
197
|
+
| --- | --- | --- |
|
|
198
|
+
| Martin Luther | Lead maintainer | [rhinostone.com](https://rhinostone.com) |
|
|
199
|
+
| Fabrice Delaneau | Co-author | [fdelaneau.com](https://fdelaneau.com) |
|
package/GOVERNANCE.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Gina follows the **BDFL** (Benevolent Dictator For Life) model with a commitment to transparency.
|
|
4
4
|
|
|
5
|
-
Gina is
|
|
5
|
+
Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **Fabrice Delaneau** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously.
|
|
6
6
|
|
|
7
7
|
## How decisions are made
|
|
8
8
|
|
package/README.md
CHANGED
|
@@ -1,21 +1,40 @@
|
|
|
1
1
|
# Gina <img src="https://gina.io/favicon-16x16.png" alt="Gina icon" style="position: absolute; top:10px; margin-right: 10px;" />
|
|
2
2
|
|
|
3
|
-
[](https://badge.fury.io/gh/Rhinostone%2Fgina) [](https://badge.fury.io/js/gina) [](https://badge.fury.io/gh/Rhinostone%2Fgina) [](https://opensource.org/licenses/MIT) [](https://nodejs.org) [](https://github.com/Rhinostone/gina/actions/workflows/test.yml)
|
|
4
4
|
|
|
5
|
-
> **Documentation:** [https://gina.io/docs/](https://gina.io/docs/)
|
|
5
|
+
> **Documentation:** [https://gina.io/docs/](https://gina.io/docs/) · **Issues:** [GitHub](https://github.com/Rhinostone/gina/issues)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
- **HTTP/2 first.** Built-in HTTP/2 server (`isaac`) with TLS, connection warmup, graceful shutdown, and GOAWAY retry — no Express or Connect required.
|
|
10
|
+
- **Multi-bundle.** One project hosts multiple independent bundles (API, web, admin, …). Each bundle has its own routing, controllers, models, and config. Share code via the project layer.
|
|
11
|
+
- **Scope isolation.** Run `local`, `beta`, and `production` from the same codebase. Scopes propagate through routing, config interpolation, and data (every DB record is stamped with `_scope`).
|
|
11
12
|
|
|
12
|
-
##
|
|
13
|
+
## Features
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
| Feature | Detail |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| HTTP/2 server | Built-in `isaac` engine — TLS, h2c, ALPN, HTTP/1.1 fallback |
|
|
18
|
+
| Multi-bundle | One project, N independent bundles with shared config layer |
|
|
19
|
+
| Scope isolation | `local` / `beta` / `production` — per-request and per-record |
|
|
20
|
+
| MVC routing | `routing.json` — no code needed to declare a route |
|
|
21
|
+
| ORM / entities | EventEmitter-based entity system, Couchbase connector included |
|
|
22
|
+
| Template engine | Swig 1.4.2 (built-in, patched) — Nunjucks coming in 0.5.0 |
|
|
23
|
+
| Hot reload | Dev-mode module cache eviction on every request |
|
|
24
|
+
| K8s ready | `gina-container`, `gina-init`, SIGTERM drain, JSON stdout logging |
|
|
25
|
+
| Dependency injection | Mockable connectors and config for unit testing |
|
|
15
26
|
|
|
16
|
-
|
|
27
|
+
## Quick start
|
|
17
28
|
|
|
18
|
-
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g gina@latest --prefix=~/.npm-global # install
|
|
31
|
+
gina new myproject # scaffold project
|
|
32
|
+
gina bundle:add api @myproject # add a bundle
|
|
33
|
+
gina bundle:start api @myproject # start
|
|
34
|
+
open https://localhost:3100 # browse
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
19
38
|
|
|
20
39
|
## Getting started with Gina I/O
|
|
21
40
|
|
|
@@ -621,7 +640,7 @@ For the full documentation, visit [https://gina.io/docs/](https://gina.io/docs/)
|
|
|
621
640
|
|
|
622
641
|
## Governance
|
|
623
642
|
|
|
624
|
-
Gina is
|
|
643
|
+
Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **Fabrice Delaneau** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously. See [GOVERNANCE.md](./GOVERNANCE.md) for details.
|
|
625
644
|
|
|
626
645
|
## License (MIT)
|
|
627
646
|
|
package/ROADMAP.md
CHANGED
|
@@ -11,10 +11,10 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
11
11
|
| Period | Version | Focus |
|
|
12
12
|
| --- | --- | --- |
|
|
13
13
|
| **Apr 2026** | `0.1.8` ✅ | Scaffold correctness · K8s support · Dependency injection · Automatic version migration |
|
|
14
|
-
| **Q2 2026** | `0.2.0` | Stability · WatcherService · Redis & SQLite connectors · K8s session storage · Startup cache |
|
|
15
|
-
| **Q3 2026** | `0.3.0` | Async/await · Dev hot-reload · MySQL & PostgreSQL connectors · AI Phase 2 · Tutorials · Mobile backend guide · Route radix tree |
|
|
16
|
-
| **Q4 2026** | `0.4.0` | TypeScript declarations · AI agents (OpenAPI, MCP) · ScyllaDB connector · PWA scaffold · Advanced tutorial · Website redesign · Bun investigation |
|
|
17
|
-
| **Q1 2027** | `0.5.0` | ESM support · Template engine migration · Structured logging |
|
|
14
|
+
| **Q2 2026** | `0.2.0` | Stability · WatcherService · Redis & SQLite connectors · K8s session storage · Startup cache · Pointer compression · Couchbase v2 deprecation · Couchbase security & critical bug fixes · HTTP/2 security hardening |
|
|
15
|
+
| **Q3 2026** | `0.3.0` | Async/await · Dev hot-reload · MySQL & PostgreSQL connectors · AI Phase 2 · Tutorials · Mobile backend guide · Route radix tree · Connector peerDependencies · 103 Early Hints · HTTP/2 observability · Security & CVE page · Couchbase connector hardening |
|
|
16
|
+
| **Q4 2026** | `0.4.0` | TypeScript declarations · AI agents (OpenAPI, MCP) · ScyllaDB connector · PWA scaffold · Advanced tutorial · Website redesign · Docs offline ZIP · Bun investigation · Couchbase v2 removal · HTTP/2 hardening · Trailer support |
|
|
17
|
+
| **Q1 2027** | `0.5.0` | ESM support · Template engine migration · Structured logging · Alt-Svc · HTTP/2 priorities · WebSocket over HTTP/2 |
|
|
18
18
|
| **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
|
|
19
19
|
|
|
20
20
|
---
|
|
@@ -35,9 +35,9 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
35
35
|
|
|
36
36
|
| Status | Feature | Version | Target |
|
|
37
37
|
| --- | --- | --- | --- |
|
|
38
|
-
| 📋 | **Per-request controller instances** — Each request gets its own controller instance
|
|
38
|
+
| 📋 | **Per-request controller instances** — Each HTTP request gets its own isolated controller instance with its own request state. Removes dead singleton infrastructure and fixes edge-case memory retention in error paths. | `0.2.0` | Q2 2026 |
|
|
39
39
|
| 📋 | **Entity `_arguments` buffer scoped to call** — Move the event result buffer from the entity to the individual call, preventing concurrent callers from sharing state. | `0.2.0` | Q2 2026 |
|
|
40
|
-
|
|
|
40
|
+
| ✅ | **Retire `freeMemory`** — Once per-request instances land (#M1), there is no shared `local` closure to null. Replace `freeMemory` call sites with explicit `local.req = null; local.res = null; local.next = null` at response exit points. | `0.2.0` | Q2 2026 |
|
|
41
41
|
|
|
42
42
|
### Phase 2 — Async
|
|
43
43
|
|
|
@@ -67,6 +67,7 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
67
67
|
| 📋 | **ESM compatibility layer** — Dual CJS/ESM entry points via `"exports"` in `package.json`. Framework internals stay CJS; public API gets ESM re-exports. | `0.5.0` | Q1 2027 |
|
|
68
68
|
| 📋 | **Pluggable template engine** — Swig 1.4.2 stays fully integrated and remains the default. Nunjucks added as a supported alternative (opt-in per project via config). The render layer is abstracted behind a common interface so both engines co-exist. Switching to Nunjucks requires a per-project migration guide (breaking differences: `{% parent %}` → `{{ super() }}`, filter renames, autoescape default, `date` format strings, no `{% spaceless %}` — see docs). | `0.5.0` | Q1 2027 |
|
|
69
69
|
| 📋 | **Structured logging** — JSON log output (`{ level, message, bundle, requestId, durationMs }`). Additive — existing consumers are unaffected. Enables log aggregation (Loki, Datadog, CloudWatch). | `0.5.0` | Q1 2027 |
|
|
70
|
+
| 📋 | **Research `AsyncLocalStorage` for request context** — Evaluate `node:async_hooks` `AsyncLocalStorage` as a replacement for the `local` closure pattern, giving true async isolation across `setTimeout`, Promises, and `async/await` chains without any closure threading. Output: decision doc + proof-of-concept branch. | `0.5.0` | Q1 2027 |
|
|
70
71
|
|
|
71
72
|
---
|
|
72
73
|
|
|
@@ -76,12 +77,47 @@ New database connectors follow the same interface as the existing Couchbase conn
|
|
|
76
77
|
|
|
77
78
|
| Status | Connector | Version | Target | Notes |
|
|
78
79
|
| --- | --- | --- | --- | --- |
|
|
79
|
-
|
|
|
80
|
-
|
|
|
80
|
+
| ✅ | **Redis** | `0.2.0` | Q2 2026 | Session store and general-purpose cache. Client: `ioredis`. Required for K8s horizontal scaling. |
|
|
81
|
+
| 🔶 | **SQLite** | `0.2.0` | Q2 2026 | Three use cases: framework state storage (replaces JSON files under `~/.gina/`), session store for single-pod/dev deployments, and embedded ORM connector. Uses `node:sqlite` (Node.js built-in since v22.5.0 — zero npm deps). Session store done (v1); ORM and state storage deferred. |
|
|
81
82
|
| 📋 | **MySQL / MariaDB** | `0.3.0` | Q3 2026 | ORM connector. Client: `mysql2`. |
|
|
82
83
|
| 📋 | **PostgreSQL** | `0.3.0` | Q3 2026 | ORM connector. Client: `pg` (node-postgres). |
|
|
83
84
|
| 📋 | **ScyllaDB** | `0.4.0` | Q4 2026 | Cassandra-compatible wide-column store. Client: `@scylladb/scylla-driver`. |
|
|
84
85
|
| 📋 | **MongoDB** | `0.4.0` | Q4 2026 | Document store connector. Client: `mongodb` (official driver). Interface approach TBD — MongoDB's document model differs from the N1QL/SQL pattern used by existing connectors. |
|
|
86
|
+
| ✅ | **Couchbase SDK v2 deprecation** | `0.2.0` | 2026-03-27 | Couchbase Server SDK v2 reached end-of-life in 2021. `connector.v2.js` now logs a deprecation warning at connection time, and a fatal error when V8 pointer compression is active (NAN bindings are incompatible). Upgrade path: set `sdk.version` to `3` or `4` in your bundle's `connectors.json`. |
|
|
87
|
+
| 📋 | **Couchbase SDK v2 removal** | `0.4.0` | Q4 2026 | `connector.v2.js` and all `sdk.version <= 2` branches removed. Default falls back to v3 when `sdk.version` is unset. Full migration guide in `CHANGELOG.md`. |
|
|
88
|
+
| 📋 | **`peerDependencies` for connector clients** | `0.3.0` | Q3 2026 | Connector client libraries (`ioredis`, `mysql2`, `pg`, `mongodb`, `@scylladb/scylla-driver`, `couchbase`) are loaded from the user's project — gina has zero runtime npm dependencies. `peerDependencies` (all optional) will signal the tested version range and surface an `npm install` compatibility warning when a user pins an untested version. |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Couchbase Connector Hardening
|
|
93
|
+
|
|
94
|
+
A cold audit of the Couchbase connector identified two critical security vulnerabilities and four high-severity bugs. All items are contained to specific code paths and do not affect the common case (v4 SDK, Promise API, no `useRestApi`), but they should be resolved before the next stable release.
|
|
95
|
+
|
|
96
|
+
### Critical — Security
|
|
97
|
+
|
|
98
|
+
| Status | Feature | Version | Target |
|
|
99
|
+
| --- | --- | --- | --- |
|
|
100
|
+
| ✅ | **Credential exposure in process list (`restQuery`)** — The `useRestApi: true` path built a shell command containing `-u username:password` passed to `exec()`. Plaintext credentials were visible in `ps aux` for the duration of the call. Fixed: replaced `exec()` with `execFile()` — credentials passed as positional arguments, never in the shell string. | `0.2.0` | 2026-03-27 |
|
|
101
|
+
| ✅ | **Shell command injection in `restQuery`** — The same `exec()` path joined the N1QL statement and query parameters into a single shell string. Metacharacters (`$`, `;`, `&`, `|`, backtick) in parameters were not neutralised. Fixed: same change as above — `execFile()` eliminates the shell entirely. | `0.2.0` | 2026-03-27 |
|
|
102
|
+
|
|
103
|
+
### High — Bugs
|
|
104
|
+
|
|
105
|
+
| Status | Feature | Version | Target |
|
|
106
|
+
| --- | --- | --- | --- |
|
|
107
|
+
| ✅ | **`gina.onError()` handler accumulates on every reconnect** — The error handler was registered inside `onConnect()`, which fired on every reconnection. After N reconnects, N stacked handlers raced on the same error. Fixed: `_errorHandlerRegistered` guard ensures the handler is registered only once per connector instance. | `0.2.0` | 2026-03-27 |
|
|
108
|
+
| ✅ | **`session-store.v3 get()` always returns "session not found"** — `.then()/.catch()` callbacks are microtasks; the `if (!data)` guard ran synchronously before they resolved. Every session read returned empty. Fixed: rewrote `get()` with `async/await`, matching the v4 store. | `0.2.0` | 2026-03-27 |
|
|
109
|
+
| ✅ | **`session-store.v3 set()` silently discards writes** — Same async/sync confusion. `fn(false, null)` was called before the upsert Promise resolved. Fixed: rewrote `set()` with `async/await`. | `0.2.0` | 2026-03-27 |
|
|
110
|
+
| ✅ | **Infinite recursion when `keepAlive: false`** — The `else` branch in `ping()` called itself unconditionally. Stack overflow on first connection with `keepAlive: false`. Fixed: replaced the unconditional self-call with `return`. | `0.2.0` | 2026-03-27 |
|
|
111
|
+
|
|
112
|
+
### Medium
|
|
113
|
+
|
|
114
|
+
| Status | Feature | Version | Target |
|
|
115
|
+
| --- | --- | --- | --- |
|
|
116
|
+
| ✅ | **300ms arbitrary startup delay** — A `setTimeout(300)` was firing `ready` instead of a condition. Added 300ms to every Couchbase-connected bundle startup and was unreliable under load. Fixed: `self.emit('ready')` now fires directly. | `0.3.0` | 2026-03-28 |
|
|
117
|
+
| ✅ | **`ping()` drops reconnection callback in v2/v3** — `typeof(next)` was checked but `next` was not in scope, so reconnect-from-ping always called `connect()` without a callback, silently swallowing errors. Fixed: changed to `typeof(ncb)` and pass `ncb` on reconnect. | `0.3.0` | 2026-03-28 |
|
|
118
|
+
| ✅ | **Stack traces in HTTP 500 responses** — `err.stack` was included in the JSON sent to the HTTP client, exposing absolute filesystem paths and internal module names. Fixed: stack logged server-side; client receives only the error message. | `0.3.0` | 2026-03-27 |
|
|
119
|
+
| ✅ | **`eval()` for `@options` parsing** — `@options` directives in `.sql` files were evaluated with `eval()`. Fixed: replaced with a regex key-normalisation pass then `JSON.parse()` — handles all production value shapes correctly. | `0.3.0` | 2026-03-28 |
|
|
120
|
+
| ✅ | **`bulkInsert` does not return a Promise** — Unlike all other N1QL entity methods, `bulkInsert` returned a plain `{onComplete: fn}` object. Fixed: converted to the Option B Promise pattern with `.onComplete(cb)` chaining. | `0.3.0` | 2026-03-28 |
|
|
85
121
|
|
|
86
122
|
---
|
|
87
123
|
|
|
@@ -93,7 +129,25 @@ New database connectors follow the same interface as the existing Couchbase conn
|
|
|
93
129
|
| ✅ | **`gina-container` foreground launcher** — Drop-in entrypoint for Docker/K8s. Spawns the bundle non-detached, forwards SIGTERM, exits with the child's code. No framework socket server required. | `0.1.8` | 2026-03-06 |
|
|
94
130
|
| ✅ | **Stdout/stderr structured logging** — `GINA_LOG_STDOUT=true` emits JSON lines compatible with `kubectl logs`, Fluentd, and Datadog. | `0.1.8` | 2026-03-21 |
|
|
95
131
|
| ✅ | **`gina-init` — stateless container bootstrap** — Generates all required `~/.gina/` config from env vars or a mounted JSON file. Idempotent. Makes the framework init-container friendly. | `0.1.8` | 2026-03-22 |
|
|
96
|
-
|
|
|
132
|
+
| ✅ | **Session storage for horizontal scaling** — Redis session store (multi-pod) + SQLite session store (single-pod/dev) + full sessions guide. | `0.2.0` | Q2 2026 |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## HTTP/2
|
|
137
|
+
|
|
138
|
+
| Status | Feature | Version | Target | Notes |
|
|
139
|
+
| --- | --- | --- | --- | --- |
|
|
140
|
+
| ✅ | **Fix `/_gina/info` HTTP/2 endpoint** — `stream.end(infoStatus)` not `stream.end(infoHeaders)` | `0.2.0` | Q2 2026 | The HTTP/2 branch of the info endpoint passes the headers object instead of the JSON string. Returns `[object Object]` instead of JSON. One-line fix. |
|
|
141
|
+
| ✅ | **Add stream-closed guard to HTML error response** — `stream.destroyed \|\| stream.closed` check in `throwError()` | `0.2.0` | Q2 2026 | JSON error path has this guard; HTML path does not. If the stream closes during error handling, Node.js emits an unhandled error. |
|
|
142
|
+
| ✅ | **HTTP/2 server security settings** — `maxHeaderListSize: 65536`, `enablePush: false`, `maxSessionInvalidFrames`, `maxSessionRejectedStreams` | `0.2.0` | Q2 2026 | Four missing settings on the server. `maxHeaderListSize` prevents HPACK bomb attacks (only set on the client today). `enablePush: false` — server push is deprecated in Chrome 106+ and removed in Firefox 132+. `maxSessionInvalidFrames` and `maxSessionRejectedStreams` defend against CONTINUATION flood (CVE-2024-27316) and RST flood / rapid reset (CVE-2023-44487). |
|
|
143
|
+
| 📋 | **103 Early Hints** — send `Link` preload headers as informational response before the final response | `0.3.0` | Q3 2026 | `Link: <url>; rel=preload` headers are correctly built but sent with the final response. Calling `stream.additionalHeaders({ ':status': 103, 'link': links })` before `stream.respond()` allows the browser to start preloading CSS/JS while the template is still rendering. Modern replacement for server push. |
|
|
144
|
+
| 📋 | **HTTP/2 session metrics** — expose active session count, stream count, GOAWAY and RST_STREAM totals via `/_gina/info` | `0.3.0` | Q3 2026 | No counters exist for the session pool state. Adds observability for ops teams without requiring an external APM. |
|
|
145
|
+
| 📋 | **Configurable `maxConcurrentStreams` and `initialWindowSize`** — move from hardcoded to `settings.server.json` | `0.3.0` | Q3 2026 | Currently `maxConcurrentStreams: 1000` (very permissive) and `initialWindowSize: 655,350` (10× default) are hardcoded. Move to bundle config with sensible defaults (256 / 65,535). Existing deployments unaffected until they opt in. |
|
|
146
|
+
| 📋 | **Application-level rapid reset rate limiter** (CVE-2023-44487) — per-session stream creation counter | `0.4.0` | Q4 2026 | Node.js ≥ 20.12.1 has the OS-level fix. Add an application-level counter: if a session creates more than N streams per second, close with GOAWAY. Important for public-facing deployments. |
|
|
147
|
+
| 📋 | **Trailer support** — `stream.sendTrailers()` + `waitForTrailers: true` | `0.4.0` | Q4 2026 | No trailer support today. Required for gRPC-style streaming (grpc-status trailer) and content integrity use cases. Opt-in: activated only when a controller calls `self.sendTrailers(fields)`. |
|
|
148
|
+
| 📋 | **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. |
|
|
149
|
+
| 📋 | **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. |
|
|
150
|
+
| 📋 | **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. |
|
|
97
151
|
|
|
98
152
|
---
|
|
99
153
|
|
|
@@ -127,9 +181,10 @@ New database connectors follow the same interface as the existing Couchbase conn
|
|
|
127
181
|
|
|
128
182
|
| Status | Feature | Version | Target | Notes |
|
|
129
183
|
| --- | --- | --- | --- | --- |
|
|
130
|
-
|
|
|
184
|
+
| ✅ | **`NODE_COMPILE_CACHE` — V8 bytecode startup cache** | `0.2.0` | Q2 2026 | Node.js 22.8+ caches compiled V8 bytecode to disk. Set once at startup — 30–60% faster cold start on subsequent runs with zero code changes to user bundles. No-op on Node < 22.8, so safe to ship unconditionally. |
|
|
131
185
|
| 📋 | **Route radix tree — compile `routing.json` at startup** | `0.3.0` | Q3 2026 | Current router does linear matching against `routing.json` on every request. Pre-compile routes into a radix tree at bundle startup for O(log n) matching. 2–3x faster routing layer. Internal change — no user-facing API change. |
|
|
132
186
|
| 📋 | **Bun runtime compatibility investigation** | `0.4.0` | Q4 2026 | Prototype Gina under Bun. Two blockers to verify: `require.cache` deletion (dev hot-reload) and `node:http2` completeness. If both pass, Bun gives 3–10x faster startup and meaningful throughput gains. Deliverable: a compatibility report. |
|
|
187
|
+
| ✅ | **V8 pointer compression support** | `0.2.0` | Q2 2026 | Node.js built with `--experimental-enable-pointer-compression` (e.g. [node-caged](https://github.com/platformatic/node-caged) or a custom build) delivers ~50% heap memory reduction across all pointer-heavy structures. Gina is pure JS — compatible out of the box. Adds: startup detection + `GINA_V8_POINTER_COMPRESSED` env var, Dockerfile guide with custom build recipe (full-icu + pointer compression), 4 GB ceiling documentation, N-API-only connector policy. |
|
|
133
188
|
|
|
134
189
|
---
|
|
135
190
|
|
|
@@ -149,6 +204,7 @@ Windows compatibility is a hard requirement for `1.0.0`. The alpha scope covers
|
|
|
149
204
|
| --- | --- | --- | --- | --- |
|
|
150
205
|
| 📋 | **Using Gina as a mobile backend** — REST API patterns, JSON-only bundles, token auth, CORS, HTTP/2, and the path to OpenAPI/MCP for SDK generation. Docs only — no code changes. | — | `0.3.0` | Q3 2026 |
|
|
151
206
|
| 📋 | **Beginner** — Your first Gina app: install, scaffold, one route, one controller, browser response. Starts from `gina new` — no prior project needed. | 5 min | `0.3.0` | Q3 2026 |
|
|
207
|
+
| 📋 | **Tutorial locale detection** — Detect the reader's locale and timezone via `navigator.language` + `Intl` and pre-fill the `settings.json` scaffold example with their actual `region`, `preferedLanguages`, and `24HourTimeFormat` values. Falls back to `en_CM`. Implemented as a client-side Docusaurus component. | — | `0.3.0` | Q3 2026 |
|
|
152
208
|
| 📋 | **Intermediate** — Multi-bundle setup, routing with URL params, entity + connector wiring, template rendering, form handling. Starts from scratch. | ~30 min | `0.3.0` | Q3 2026 |
|
|
153
209
|
| 📋 | **Advanced** — Full production project: authentication, scoped data isolation, async/await, HTTP/2, structured logging, Docker/K8s deployment. Starts from the intermediate tutorial's finished state. | ~60 min | `0.4.0` | Q4 2026 |
|
|
154
210
|
|
|
@@ -159,7 +215,9 @@ Windows compatibility is a hard requirement for `1.0.0`. The alpha scope covers
|
|
|
159
215
|
| Status | Feature | Version | Target |
|
|
160
216
|
| --- | --- | --- | --- |
|
|
161
217
|
| 📋 | **Official website redesign + docs integration** — Refactor gina.io as a proper project homepage (landing page, feature highlights, showcase) with the documentation fully integrated. Single coherent web presence. Prerequisite: tutorials complete. | `0.4.0` | Q4 2026 |
|
|
218
|
+
| 📋 | **Docs offline ZIP** — One-click download of the complete gina.io documentation as a static HTML ZIP archive. Generated at deploy time by the Docusaurus build pipeline — no server-side logic required. Targeted at users in regions with limited or expensive internet access (offline-first for the African market). | `0.4.0` | Q4 2026 |
|
|
219
|
+
| 📋 | **Security & CVE compliance page** — Dedicated docs page listing the HTTP/2 CVEs addressed by Gina and the Node.js version required for each mitigation. Covers CVE-2023-44487 (Rapid Reset), CVE-2024-27316 / CVE-2024-27983 (CONTINUATION flood), CVE-2019-9514 (RST flood), and the nghttp2-mitigated ping/settings floods. Docs only — no code changes. | `0.3.0` | Q3 2026 |
|
|
162
220
|
|
|
163
221
|
---
|
|
164
222
|
|
|
165
|
-
*Last updated: 2026-03-
|
|
223
|
+
*Last updated: 2026-03-28 · To suggest a feature, [open an issue](https://github.com/Rhinostone/gina/issues).*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.9-alpha.2
|
package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz
RENAMED
|
Binary file
|
package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.gz
RENAMED
|
Binary file
|
package/framework/{v0.1.8 → v0.1.9-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz
RENAMED
|
Binary file
|
|
Binary file
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
// Imports.
|
|
3
3
|
var fs = require('fs');
|
|
4
|
-
const { version }
|
|
5
|
-
//var util = require('util');
|
|
6
|
-
//var promisify = require('util').promisify;
|
|
4
|
+
// CB-LOW-3 fix: removed dead `const { version } = require('os')` — `version` was never referenced.
|
|
7
5
|
// Use couchbase module from the user's project dependencies if not found
|
|
8
6
|
var couchbasePath = _(getPath('project') +'/node_modules/couchbase');
|
|
9
7
|
var couchbase = require(couchbasePath);
|
|
@@ -239,7 +237,22 @@ function Couchbase(conn, infos) {
|
|
|
239
237
|
|
|
240
238
|
optionsArr = queryString.match(/\@options \{(.*)\}/gm);
|
|
241
239
|
if (optionsArr) {
|
|
242
|
-
eval(
|
|
240
|
+
// CB-QUAL-2 fix: replaced eval() with JSON.parse() for @options parsing.
|
|
241
|
+
// @options uses JavaScript object literal syntax with unquoted keys
|
|
242
|
+
// (e.g. { consistency: "request_plus" }) — not strict JSON.
|
|
243
|
+
// We normalise unquoted property names to quoted form before parsing so
|
|
244
|
+
// JSON.parse() can handle them. Parse errors now surface explicitly
|
|
245
|
+
// instead of silently corrupting the `options` variable in scope.
|
|
246
|
+
// Original broken implementation:
|
|
247
|
+
// eval('options='+optionsArr[0].replace(/\@options\ /, ''));
|
|
248
|
+
try {
|
|
249
|
+
var _rawOpts = optionsArr[0].replace(/\@options\s+/, '');
|
|
250
|
+
// Quote any bare identifier keys: { foo: → { "foo":
|
|
251
|
+
var _jsonOpts = _rawOpts.replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)(\s*:)/g, '$1"$2"$3');
|
|
252
|
+
options = JSON.parse(_jsonOpts);
|
|
253
|
+
} catch (parseErr) {
|
|
254
|
+
console.warn('[CONNECTOR] @options parse error in .sql file: ' + parseErr.message);
|
|
255
|
+
}
|
|
243
256
|
}
|
|
244
257
|
optionsArr = null;
|
|
245
258
|
|
|
@@ -1015,7 +1028,9 @@ function Couchbase(conn, infos) {
|
|
|
1015
1028
|
rec[id].values._collection = this._collection;
|
|
1016
1029
|
rec[id].values._scope = this._scope;
|
|
1017
1030
|
|
|
1018
|
-
|
|
1031
|
+
// CB-QUAL-4 fix: id was interpolated bare — a key containing `"` broke the N1QL string.
|
|
1032
|
+
// JSON.stringify() escapes any special characters and wraps in double quotes.
|
|
1033
|
+
queryString += '\t\nVALUES ('+ JSON.stringify(String(id)) +', '+ JSON.stringify(rec[id].values) +'),';
|
|
1019
1034
|
recCount++;
|
|
1020
1035
|
}
|
|
1021
1036
|
|
|
@@ -1116,17 +1131,49 @@ function Couchbase(conn, infos) {
|
|
|
1116
1131
|
}
|
|
1117
1132
|
|
|
1118
1133
|
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1134
|
+
// CB-QUAL-3 fix: bulkInsert previously returned a plain {onComplete} _proto object.
|
|
1135
|
+
// `await entity.bulkInsert(...)` resolved to the object, not the data — silently
|
|
1136
|
+
// wrong for any async controller using bulkInsert. Fixed with the same Option B
|
|
1137
|
+
// Promise + .onComplete() pattern used by all other N1QL entity methods.
|
|
1138
|
+
// Original broken implementation:
|
|
1139
|
+
// return {
|
|
1140
|
+
// onComplete : function(cb) {
|
|
1141
|
+
// self.once(trigger, function(err, data, meta){
|
|
1142
|
+
// if (envIsDev) {
|
|
1143
|
+
// console.debug('[ bulkInsert triggerd ] '+ trigger + ' - Rec count: '+ recCount);
|
|
1144
|
+
// }
|
|
1145
|
+
// cb(err, data, meta)
|
|
1146
|
+
// })
|
|
1147
|
+
// }
|
|
1148
|
+
// }
|
|
1149
|
+
var _resolve, _reject, _internalData, _internalMeta;
|
|
1150
|
+
var _promise = new Promise(function(resolve, reject) {
|
|
1151
|
+
_resolve = resolve;
|
|
1152
|
+
_reject = reject;
|
|
1153
|
+
});
|
|
1154
|
+
|
|
1155
|
+
_promise.onComplete = function(cb) {
|
|
1156
|
+
_promise.then(
|
|
1157
|
+
function() { cb(null, _internalData, _internalMeta); },
|
|
1158
|
+
function(err) { cb(err); }
|
|
1159
|
+
);
|
|
1160
|
+
return _promise;
|
|
1161
|
+
};
|
|
1125
1162
|
|
|
1126
|
-
|
|
1127
|
-
|
|
1163
|
+
self.once(trigger, function(err, data, meta){
|
|
1164
|
+
if (envIsDev) {
|
|
1165
|
+
console.debug('[ bulkInsert triggered ] '+ trigger + ' - Rec count: '+ recCount);
|
|
1128
1166
|
}
|
|
1129
|
-
|
|
1167
|
+
if (err) {
|
|
1168
|
+
_reject(err);
|
|
1169
|
+
} else {
|
|
1170
|
+
_internalData = data;
|
|
1171
|
+
_internalMeta = meta;
|
|
1172
|
+
_resolve(data);
|
|
1173
|
+
}
|
|
1174
|
+
});
|
|
1175
|
+
|
|
1176
|
+
return _promise;
|
|
1130
1177
|
|
|
1131
1178
|
} catch (err) {
|
|
1132
1179
|
console.error(err.stack);
|
|
@@ -13,7 +13,8 @@ var merge = lib.merge;
|
|
|
13
13
|
var modelUtil = new lib.Model();
|
|
14
14
|
|
|
15
15
|
//globalized
|
|
16
|
-
uuid
|
|
16
|
+
// CB-LOW-1 fix: uuid was assigned without `var`, leaking into global.uuid.
|
|
17
|
+
var uuid = require('uuid');
|
|
17
18
|
N1qlQuery = couchbase.N1qlQuery || null;
|
|
18
19
|
N1qlStringQuery = couchbase.N1qlStringQuery || null;
|
|
19
20
|
ViewQuery = couchbase.ViewQuery || null;
|
|
@@ -64,8 +65,15 @@ function Connector(dbString) {
|
|
|
64
65
|
self.instance.reconnected = self.instance.connected = false;
|
|
65
66
|
console.error('[ CONNECTOR ][ ' + local.bundle +' ] couchbase could not be reached !!\n'+ ( err.stack || err.message || err ) );
|
|
66
67
|
|
|
67
|
-
//
|
|
68
|
-
|
|
68
|
+
// CB-LOW-5 fix: exponential backoff replaces hardcoded 5s retry.
|
|
69
|
+
// Delay sequence: 5s → 10s → 20s → 40s → 60s (cap). Counter reset in onConnect().
|
|
70
|
+
self._reconnectAttempts = (self._reconnectAttempts || 0) + 1;
|
|
71
|
+
var _backoffDelay = Math.min(5000 * Math.pow(2, self._reconnectAttempts - 1), 60000);
|
|
72
|
+
if (self._reconnectAttempts >= 10) {
|
|
73
|
+
console.error('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — max backoff reached (' + (_backoffDelay/1000) + 's). Couchbase may be unavailable.');
|
|
74
|
+
} else {
|
|
75
|
+
console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — retrying in ' + (_backoffDelay/1000) + 's...');
|
|
76
|
+
}
|
|
69
77
|
self.instance.reconnecting = true;
|
|
70
78
|
|
|
71
79
|
setTimeout( function onRetry(){
|
|
@@ -74,7 +82,7 @@ function Connector(dbString) {
|
|
|
74
82
|
} else {
|
|
75
83
|
self.connect(dbString);
|
|
76
84
|
}
|
|
77
|
-
},
|
|
85
|
+
}, _backoffDelay);
|
|
78
86
|
|
|
79
87
|
};
|
|
80
88
|
|
|
@@ -83,6 +91,20 @@ function Connector(dbString) {
|
|
|
83
91
|
console.debug('[ CONNECTOR ][ ' + local.bundle +' ] couchbase is alive !!');
|
|
84
92
|
console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.connector +' ] now connected...');
|
|
85
93
|
|
|
94
|
+
// #CB-V2-DEPRECATED — Couchbase SDK v2 reached end-of-life in 2021.
|
|
95
|
+
// Formal deprecation in gina 0.2.0 (Q2 2026). Removal planned for gina 0.4.0 (Q4 2026).
|
|
96
|
+
// To upgrade: set sdk.version to 3 or 4 in your bundle's connectors.json.
|
|
97
|
+
console.warn('[ CONNECTOR ][ couchbase ] SDK v2 is deprecated and will be removed in gina 0.4.0. '
|
|
98
|
+
+ 'Couchbase Server SDK v2 reached end-of-life in 2021. '
|
|
99
|
+
+ 'Update your bundle\'s connectors.json: set sdk.version to 3 or 4.');
|
|
100
|
+
if (/^true$/i.test(process.env.GINA_V8_POINTER_COMPRESSED)) {
|
|
101
|
+
console.error('[ CONNECTOR ][ couchbase ] FATAL: SDK v2 uses NAN bindings which are incompatible '
|
|
102
|
+
+ 'with V8 pointer compression. The process may segfault. '
|
|
103
|
+
+ 'Switch to sdk.version 3 or 4 in connectors.json immediately.');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// CB-LOW-5 fix: reset backoff counter on successful (re)connect.
|
|
107
|
+
self._reconnectAttempts = 0;
|
|
86
108
|
self.instance.reconnected = self.instance.connected = true;
|
|
87
109
|
var options = local.options;
|
|
88
110
|
|
|
@@ -105,8 +127,8 @@ function Connector(dbString) {
|
|
|
105
127
|
console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ '+ env +' ] connected to couchbase !!');
|
|
106
128
|
|
|
107
129
|
|
|
108
|
-
|
|
109
|
-
|
|
130
|
+
// CB-PERF-3 fix: first setConnection call was redundant (identical args, outside the existsSync guard)
|
|
131
|
+
// modelUtil.setConnection(bundle, name, self.instance);
|
|
110
132
|
if ( fs.existsSync(modelsPath) ) {
|
|
111
133
|
modelUtil.setConnection(bundle, name, self.instance);
|
|
112
134
|
modelUtil.reloadModels(
|
|
@@ -124,7 +146,12 @@ function Connector(dbString) {
|
|
|
124
146
|
}
|
|
125
147
|
});
|
|
126
148
|
// intercepting conn event thru gina
|
|
127
|
-
|
|
149
|
+
// CB-BUG-1 fix: guard against handler accumulation on reconnect
|
|
150
|
+
// — onConnect() fires on every reconnection; without this guard each reconnect stacks a new gina.onError handler,
|
|
151
|
+
// and N handlers all race to call res.end() on the same error, causing "Cannot set headers after sent"
|
|
152
|
+
if (!self._errorHandlerRegistered) {
|
|
153
|
+
self._errorHandlerRegistered = true;
|
|
154
|
+
gina.onError(function(err, req, res, next){
|
|
128
155
|
// (code) message
|
|
129
156
|
// (16) Generic network failure. Enable detailed error codes (via LCB_CNTL_DETAILED_ERRCODES, or via `detailed_errcodes` in the connection string) and/or enable logging to get more information
|
|
130
157
|
// (23) Client-Side timeout exceeded for operation. Inspect network conditions or increase the timeout
|
|
@@ -141,8 +168,14 @@ function Connector(dbString) {
|
|
|
141
168
|
//|| err instanceof couchbase.Error && err.code == 23 && !self.reconnecting
|
|
142
169
|
|| /cannot perform operations on a shutdown bucket/.test(err.message ) && !self.reconnecting && !self.reconnected
|
|
143
170
|
) {
|
|
144
|
-
//
|
|
145
|
-
|
|
171
|
+
// CB-LOW-5 fix: exponential backoff (shared counter with connect onError).
|
|
172
|
+
self._reconnectAttempts = (self._reconnectAttempts || 0) + 1;
|
|
173
|
+
var _backoffDelay = Math.min(5000 * Math.pow(2, self._reconnectAttempts - 1), 60000);
|
|
174
|
+
if (self._reconnectAttempts >= 10) {
|
|
175
|
+
console.error('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — max backoff reached (' + (_backoffDelay/1000) + 's). Couchbase may be unavailable.');
|
|
176
|
+
} else {
|
|
177
|
+
console.debug('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] reconnect attempt ' + self._reconnectAttempts + ' — retrying in ' + (_backoffDelay/1000) + 's...');
|
|
178
|
+
}
|
|
146
179
|
self.reconnecting = true;
|
|
147
180
|
|
|
148
181
|
setTimeout( function onRetry(){
|
|
@@ -151,7 +184,7 @@ function Connector(dbString) {
|
|
|
151
184
|
} else {
|
|
152
185
|
self.connect(dbString)
|
|
153
186
|
}
|
|
154
|
-
},
|
|
187
|
+
}, _backoffDelay)
|
|
155
188
|
|
|
156
189
|
} else if (err instanceof couchbase.Error && err.code == 23 && !self.reconnecting) {
|
|
157
190
|
self.instance.disconnect();
|
|
@@ -169,10 +202,10 @@ function Connector(dbString) {
|
|
|
169
202
|
console.error('[ CONNECTOR ][ ' + local.bundle +' ][ ' + dbString.database +' ] gina fatal error ('+ err.code +'): ' + (err.message||err) + '\nstack: '+ err.stack);
|
|
170
203
|
|
|
171
204
|
if ( typeof(err) == 'object' ) {
|
|
205
|
+
// CB-QUAL-1 fix: stack trace removed — logged server-side only, never sent to client
|
|
172
206
|
res.end(JSON.stringify({
|
|
173
207
|
status: 500,
|
|
174
|
-
error: err.message
|
|
175
|
-
stack: err.stack
|
|
208
|
+
error: err.message
|
|
176
209
|
}))
|
|
177
210
|
} else {
|
|
178
211
|
res.end(err)
|
|
@@ -189,7 +222,8 @@ function Connector(dbString) {
|
|
|
189
222
|
}
|
|
190
223
|
}
|
|
191
224
|
}
|
|
192
|
-
|
|
225
|
+
});
|
|
226
|
+
}
|
|
193
227
|
|
|
194
228
|
|
|
195
229
|
self.emit('ready', false, self.instance);
|
|
@@ -398,7 +432,11 @@ function Connector(dbString) {
|
|
|
398
432
|
|
|
399
433
|
self.instance.reconnected = false;
|
|
400
434
|
self.instance.reconnecting = true;
|
|
401
|
-
|
|
435
|
+
// CB-PERF-2 fix: `next` was not in scope inside ping() — typeof(next)
|
|
436
|
+
// always evaluated to 'undefined', so reconnect from ping never passed
|
|
437
|
+
// the callback and errors were silently dropped. Fixed to use `ncb`
|
|
438
|
+
// (the no-connection callback param of ping(interval, cb, ncb)).
|
|
439
|
+
if ( typeof(ncb) != 'undefined' ) {
|
|
402
440
|
self.connect(dbString, ncb);
|
|
403
441
|
} else {
|
|
404
442
|
self.connect(dbString);
|
|
@@ -411,8 +449,10 @@ function Connector(dbString) {
|
|
|
411
449
|
}, interval);
|
|
412
450
|
ncb(cb);
|
|
413
451
|
} else {
|
|
414
|
-
|
|
415
|
-
|
|
452
|
+
// CB-BUG-4 fix: keepAlive is false — ping is a no-op; do not recurse
|
|
453
|
+
// old: console.debug('[ CONNECTOR ][ ' + local.bundle +' ] sent ping to couchbase ...');
|
|
454
|
+
// old: self.ping(interval, cb, ncb); ← unconditional recursion → stack overflow
|
|
455
|
+
return;
|
|
416
456
|
}
|
|
417
457
|
};
|
|
418
458
|
|