gina 0.1.7 → 0.1.8
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/dependabot.yml +12 -0
- package/CHANGELOG.md +47 -0
- package/CONTRIBUTING.md +190 -0
- package/GOVERNANCE.md +20 -0
- package/README.md +7 -3
- package/ROADMAP.md +165 -0
- package/bin/cli +15 -0
- package/bin/gina-container +15 -0
- package/bin/gina-init +433 -0
- package/framework/v0.1.8/VERSION +1 -0
- package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.gz +0 -0
- package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/js/gina.js +16 -0
- package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +235 -234
- package/framework/v0.1.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.1.8/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- package/framework/{v0.1.7 → v0.1.8}/core/config.js +66 -7
- package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/index.js +48 -1
- package/framework/{v0.1.7 → v0.1.8}/core/controller/controller.js +224 -26
- package/framework/{v0.1.7 → v0.1.8}/core/controller/controller.render-json.js +8 -0
- package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/package.json +0 -16
- package/framework/{v0.1.7 → v0.1.8}/core/gna.js +116 -2
- package/framework/{v0.1.7 → v0.1.8}/core/model/entity.js +80 -7
- package/framework/{v0.1.7 → v0.1.8}/core/model/template/entityFactory.js +6 -6
- package/framework/{v0.1.7 → v0.1.8}/core/server.isaac.js +13 -22
- package/framework/{v0.1.7 → v0.1.8}/core/server.js +1 -1
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/config/app.json +1 -1
- package/framework/v0.1.8/core/template/boilerplate/bundle/config/connectors.json +18 -0
- package/framework/v0.1.8/core/template/boilerplate/bundle/config/settings.json +13 -0
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/config/settings.server.json +2 -2
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/config/templates.json +3 -3
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/controllers/controller.content.js +3 -3
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/controllers/controller.js +5 -5
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/controllers/setup.js +15 -18
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/index.js +11 -13
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_namespace/controllers/controller.js +3 -3
- package/framework/v0.1.8/core/template/boilerplate/bundle_public/css/home.css +3 -0
- package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_templates/handlers/main.js +3 -3
- package/framework/v0.1.8/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +9 -0
- package/framework/v0.1.8/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +8 -0
- package/framework/{v0.1.7 → v0.1.8}/core/template/conf/env.json +29 -29
- package/framework/v0.1.8/core/template/conf/manifest.json +7 -0
- package/framework/v0.1.8/core/template/conf/package.json +11 -0
- package/framework/{v0.1.7 → v0.1.8}/core/template/conf/settings.json +5 -5
- package/framework/v0.1.8/core/template/conf/statics.json +12 -0
- package/framework/{v0.1.7 → v0.1.8}/core/template/conf/templates.json +7 -7
- package/framework/{v0.1.7 → v0.1.8}/helpers/context.js +14 -7
- package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/add.js +32 -4
- package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/init.js +82 -4
- package/framework/{v0.1.7 → v0.1.8}/lib/domain/dist/public_suffix_list.dat.gz +0 -0
- package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/containers/default/index.js +15 -8
- package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/containers/mq/speaker.js +4 -1
- package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/main.js +10 -0
- package/framework/{v0.1.7 → v0.1.8}/lib/model.js +7 -2
- package/migration_note.md +37 -3
- package/package.json +5 -4
- package/resources/home/framework/locals.json +5 -5
- package/resources/home/framework/project.json +2 -2
- package/resources/home/framework/projects.json +3 -3
- package/resources/home/main.json +26 -26
- package/resources/home/settings.json +30 -30
- package/framework/v0.1.7/VERSION +0 -1
- package/framework/v0.1.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- package/framework/v0.1.7/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- package/framework/v0.1.7/core/template/boilerplate/bundle/config/settings.json +0 -12
- package/framework/v0.1.7/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -11
- package/framework/v0.1.7/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -8
- package/framework/v0.1.7/core/template/conf/manifest.json +0 -7
- package/framework/v0.1.7/core/template/conf/package.json +0 -11
- package/framework/v0.1.7/core/template/conf/statics.json +0 -12
- /package/framework/{v0.1.7 → v0.1.8}/AUTHORS +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/html/static.html +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/html/toolbar.html +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.br +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/asset/plugin/uuid.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/connector.v2.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/content.encoding +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/controller/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/optimist-0.6.1/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/optimist-0.6.1/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/optimist-0.6.1/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/optimist-0.6.1/readme.markdown +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/HISTORY.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/bin/swig.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/dist/swig.min.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/dateformatter.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/filters.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/lexer.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/loaders/filesystem.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/loaders/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/loaders/memory.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/parser.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/swig.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/autoescape.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/block.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/else.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/elseif.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/extends.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/filter.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/for.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/if.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/import.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/include.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/macro.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/parent.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/raw.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/set.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/tags/spaceless.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-1.4.2/lib/utils.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-client/swig-2.0.0.min.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/deps/swig-client/swig.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/dev/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/locales/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/locales/currency.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/locales/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/mime.types +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/model/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/model/template/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/file/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/file/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/file/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/intl/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/intl/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/intl/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/intl/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/router.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/server.express.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/status.codes +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/_gitignore +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/console.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/data/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/data/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/json/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/json/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/path.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/prototypes.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/task.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/helpers/text.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/archiver/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/archiver/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/archiver/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cache/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cache/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cache/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/collection/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/collection/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/collection/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/config.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cron/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cron/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/domain/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/domain/dist/2025-03-14_13-41-20_UTC.dat +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/domain/dist/public_suffix_list.dat +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/domain/dist/public_suffix_list.dat.br +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/domain/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/generator/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/inherits/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/inherits/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/math/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/merge/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/merge/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/proc.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/routing/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/routing/build.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/routing/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/session-store.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/shell.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/swig-filters/src/main.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/url/README.md +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/url/index.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/url/routing.json +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/lib/validator.js +0 -0
- /package/framework/{v0.1.7 → v0.1.8}/package.json +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "npm"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
ignore:
|
|
8
|
+
# Vendored dependencies under framework/v*/ are managed manually.
|
|
9
|
+
# They are not installed via npm — do not auto-update them.
|
|
10
|
+
- dependency-name: "*"
|
|
11
|
+
update-types: ["version-update:semver-patch"]
|
|
12
|
+
open-pull-requests-limit: 5
|
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,53 @@ 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.1.8 - 2026-03-27
|
|
10
|
+
### Added
|
|
11
|
+
* Added .github/dependabot.yml — weekly npm dependency updates for root package.json; vendored framework deps excluded
|
|
12
|
+
* Added _debugLog / _isDebugLog to server.isaac.js (LOG_LEVEL=debug|trace outputs gray-coded timestamps with [gina:isaac] group tag, matching gna.js and server.js)
|
|
13
|
+
### Changed
|
|
14
|
+
* package.json description updated to: Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency
|
|
15
|
+
### Fixed
|
|
16
|
+
* Removed swig devDependency declarations (package.json.dist) from git — eliminated 6 Dependabot false-positive alerts (lodash, express, phantomjs are swig test-only deps, never installed or reachable at runtime)
|
|
17
|
+
* Popin overlay stuck active after form submit: data-gina-popin-loading attribute was set on XHR readyState 1/3 but never removed on readyState 4 (response complete), leaving the overlay blocking subsequent interactions. Cleared in xhr.onreadystatechange readyState==4, popinClose, and popinReset.
|
|
18
|
+
* Couchbase connector: @include directives sent raw to Couchbase in dev mode — the dev-mode SQL re-read refreshed the query body without re-expanding @include tokens, causing N1QL syntax errors. Dev-mode re-read now applies the same @include expansion as the startup parser.
|
|
19
|
+
|
|
20
|
+
## 0.1.8-alpha.1 - 2026-03-26
|
|
21
|
+
### Added
|
|
22
|
+
* Config variable interpolation now accepts \${variable} syntax in addition to {variable}. Both forms work in all config files (routing.json, app.json, settings.json, etc.). The {variable} syntax continues to work unchanged — migration to \${variable} is optional and will be documented in a future release.
|
|
23
|
+
* GINA_LOG_STDOUT=true — stdout-only mode for containerised deployments: logs emit as JSON lines (ts, level, group, msg), MQ transport disabled; compatible with kubectl logs, Fluentd, Datadog
|
|
24
|
+
* gina-init: stateless ~/.gina/ bootstrap for Docker/K8s containers — generates projects.json, ports.json, ports.reverse.json, and settings.json from env vars or a mounted JSON config file, with no gina CLI ceremony required
|
|
25
|
+
* critical: false option on this.query(): fire-and-forget HTTP/2 calls can now pass { critical: false } to swallow errors silently (log-only) instead of propagating to throwError and terminating the user-facing response (#H3)
|
|
26
|
+
* critical: false option on this.query(): fire-and-forget HTTP/2 calls can now pass { critical: false } to swallow errors silently (log-only) instead of propagating to throwError and terminating the user-facing response (#H3)
|
|
27
|
+
* HTTP/2 startup warmup: bundles can now declare server.warmup: ['https://upstream:port'] in their server config to pre-establish HTTP/2 sessions at startup. Warmup fires after bundle start, sends an initial PING to verify connectivity, then starts the 5s keepalive cycle — so the first real request reuses a live session instead of cold-connecting (#H5)
|
|
28
|
+
* Couchbase connector: _scope property on entities (mirrors _collection), $scope placeholder substitution in N1QL queries, _scope stored in bulkInsert records. scope read from connectors.json config, falls back to NODE_SCOPE env var
|
|
29
|
+
* Mockable service locator (#R2): getConfig() and getModel() now check for a __mock__ context override before hitting the real implementation. Test setup calls setContext('__mock__', { config: fn, model: fn }) — zero breaking changes, zero business logic changes. Lifts testability from E2E-only to unit-testable models and helpers
|
|
30
|
+
* EntitySuper now accepts optional `injected` 3rd constructor param — `{connector, config}` — for unit testing entities without a running database or framework server (#R3). getConnection() returns injected.connector when set. New this.getConfig() instance method routes through injected.config, falling back to the global getConfig()/__mock__ chain (#R2).
|
|
31
|
+
* SuperController.createTestInstance(deps) — static factory for controller unit testing (#R4). Creates a fresh instance with isolated local closure, wires mock req/res/next/options via setOptions(), marks it with _isTestInstance=true. Production singleton is never modified. Normalises missing conf structure so setOptions doesn't crash on minimal test deps.
|
|
32
|
+
* Auto-migrate main.json and settings.json on first startup of a new short version (e.g. 0.1 → 0.2, 0.5 → 1.0): copies all namespaced keys from the previous release, seeds port/hostname from the previous settings.json. Downgrade is free — old keys are never removed.
|
|
33
|
+
### Changed
|
|
34
|
+
* whisper() now requires \${variable} syntax — bare {variable} placeholders are no longer replaced (migration: update config files and templates to use \${variable})
|
|
35
|
+
* bundle:add now auto-detects system locale and timezone when scaffolding settings.json (LANG/LC_ALL → Intl → en_CM / UTC fallbacks)
|
|
36
|
+
* conf/settings.json locale fallback now auto-detected from GINA_CULTURE at bundle config load (preferedLanguages, region, dateFormat.short, 24HourTimeFormat)
|
|
37
|
+
* conf/settings.json locale defaults now resolved from built-in locale database: currency.code (ISO 4217) and preferedLanguages pulled from core/locales/dist/region/ by country code
|
|
38
|
+
* conf/settings.json locale defaults fully auto-detected: measurementUnits (imperial for US/LR/MM), temperature (fahrenheit for US/BS/KY/PW), firstDayOfWeek from Intl.Locale.getWeekInfo()
|
|
39
|
+
### Fixed
|
|
40
|
+
* Fixed dev-mode resource churn (#B3): DNS resolver and cache wrapper were recreated on every HTTP request because controller.js is re-required each time by the hot-reload mechanism. Both are now persisted on process.gina and reused across re-requires. Eliminates silent abandonment of in-flight DNS lookups and loss of cache-invalidation listeners between requests.
|
|
41
|
+
* Fixed W2 migration regression: resource template placeholders were written as \${} (empty variable) instead of \${variableName}, causing gina CLI to crash with RangeError on container startup. Also added mq_port validation in MQSpeaker to guard against malformed settings values.
|
|
42
|
+
* Fixed W2 migration regression: {variable} → ${variable} in bin/cli, bin/gina-container, core/config.js, entityFactory.js, framework/init.js, bundle/add.js, and resources/locals.json (#B4)
|
|
43
|
+
* Fixed remaining W2 regression: {gina}/{version} in templates test, {Model} in entityFactory boilerplate, {projectPath} in merge test; updated stale framework version import in merge.test.js (#B4)
|
|
44
|
+
* Fixed HTTPS bundle abort on startup: verifyCertificate failure during dev startup (e.g. DNS failure or self-signed cert in containers) was logged at emerg severity, triggering start.js abort detection even though the server was already listening. Downgraded to warn.
|
|
45
|
+
* Fixed rootDomain placeholder detection in config.js to match both `{rootDomain}` (old format) and `${rootDomain}` (new format) after the W2 interpolation migration.
|
|
46
|
+
* getConfig() no-arg now exposes conf.settings — settings.json content is accessible as conf.settings on the bundle conf object, consistent with conf.security
|
|
47
|
+
* Fixed Couchbase connector path resolution in model loader: conf.connectorsPath was never set, causing a MODULE_NOT_FOUND crash on first Couchbase connect.
|
|
48
|
+
* Fixed entity loader in Couchbase connector crashing with TypeError when an entities directory contains helper modules that export plain objects instead of constructor functions.
|
|
49
|
+
* HTTP/2 timeout messages now display in seconds when the value exceeds 1000ms (e.g. 30s instead of 30000ms)
|
|
50
|
+
* HTTP/2 client now retries on GOAWAY mid-stream premature close and on 502 upstream responses. Previously both failures surfaced immediately to callers with no retry, requiring application-level degraded-mode fallbacks. The 502 retry also adds a req.on('response') handler that captures the :status pseudo-header — previously unread, making nginx-level errors indistinguishable from JSON parse failures.
|
|
51
|
+
* renderJSON no longer throws ERR_HTTP2_INVALID_STREAM when the client disconnects (nginx timeout, browser navigation) before an async callback (Couchbase, HTTP/2 upstream) completes. The ServerHttp2Stream destroyed/closed state is now checked before stream.respond() and the request is silently dropped with a warning log.
|
|
52
|
+
* entity.js: guard _resolver before .then() callbacks — prevents uncaught TypeError when a Promise-returning method has no registered trigger in _triggers, which corrupted the event loop
|
|
53
|
+
* Fixed iso_short derivation in framework init — was using country code (cm) instead of language code (en) from culture en_CM
|
|
54
|
+
* Fixed ReferenceError crash on startup: defIsoShort and defDate were referenced outside their declaring function in init.js
|
|
55
|
+
|
|
9
56
|
## 0.1.7 - 2026-03-20
|
|
10
57
|
### Added
|
|
11
58
|
* Cache: sliding-window expiration and absolute ceiling (maxAge) for HTML and JSON response caches
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Contributing to Gina
|
|
2
|
+
|
|
3
|
+
Gina follows a BDFL governance model — see [GOVERNANCE.md](./GOVERNANCE.md) for how decisions are made. Contributions of all experience levels are welcome.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Table of contents
|
|
8
|
+
|
|
9
|
+
- [Requirements](#requirements)
|
|
10
|
+
- [Getting started locally](#getting-started-locally)
|
|
11
|
+
- [Running the tests](#running-the-tests)
|
|
12
|
+
- [Development environment](#development-environment)
|
|
13
|
+
- [Debugging](#debugging)
|
|
14
|
+
- [Branch model](#branch-model)
|
|
15
|
+
- [Commit style](#commit-style)
|
|
16
|
+
- [Changelog](#changelog)
|
|
17
|
+
- [Pull request checklist](#pull-request-checklist)
|
|
18
|
+
- [Reporting bugs](#reporting-bugs)
|
|
19
|
+
- [Proposing features](#proposing-features)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Requirements
|
|
24
|
+
|
|
25
|
+
| Requirement | Version |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| OS | macOS or Linux (Windows: Docker only) |
|
|
28
|
+
| Node.js | >= 18 |
|
|
29
|
+
| npm | >= 8 |
|
|
30
|
+
| Changie | >= 1.24 |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Getting started locally
|
|
35
|
+
|
|
36
|
+
Gina must be installed globally — the CLI and framework bootstrapper expect to run from the npm global prefix. Contributors clone directly into that location instead of using `npm install -g .`.
|
|
37
|
+
|
|
38
|
+
#### 1. Find your global prefix
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm config get prefix --quiet
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The default is `/usr/local` (system) or `~/.npm-global` (user). The target directory is `${prefix}/lib/node_modules/gina`.
|
|
45
|
+
|
|
46
|
+
#### 2. Clone into the prefix
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
cd $(npm config get prefix)/lib/node_modules
|
|
50
|
+
git clone https://github.com/Rhinostone/gina.git gina
|
|
51
|
+
cd gina && git checkout develop
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### 3. Run the install scripts
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
node ./script/pre_install.js
|
|
58
|
+
node ./script/post_install.js
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
#### 4. Verify
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
gina version
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Running the tests
|
|
70
|
+
|
|
71
|
+
The test suite uses Node's built-in `node:test` runner — no additional test dependencies needed.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Run all tests
|
|
75
|
+
node --test test/**/*.test.js
|
|
76
|
+
|
|
77
|
+
# Run a single file
|
|
78
|
+
node --test test/core/controller.test.js
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Development environment
|
|
84
|
+
|
|
85
|
+
When contributing to the framework, use the `dev` environment. It enables hot-reload, the debug toolbar, and verbose logging that makes it easier to follow what the framework is doing internally.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
gina framework:set --env=dev
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
This sets the default environment so you can omit `--env=dev` from subsequent commands. To start the framework:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
gina start
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
To follow logs in real time:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
gina tail --follow
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
To revert to production defaults:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
gina framework:set --env=prod
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Debugging
|
|
112
|
+
|
|
113
|
+
### Framework
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
gina start --inspect-gina
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Bundle
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
gina bundle:restart <bundle_name> @<project_name> --inspect=<port_number>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Branch model
|
|
128
|
+
|
|
129
|
+
| Branch | Purpose |
|
|
130
|
+
| --- | --- |
|
|
131
|
+
| `master` | Stable — merged from `develop` via PR at release time |
|
|
132
|
+
| `develop` | Working branch — all PRs target this branch |
|
|
133
|
+
|
|
134
|
+
Always branch from `develop` and open your PR against `develop`.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Commit style
|
|
139
|
+
|
|
140
|
+
Use imperative or gerund sentences, matching the existing log:
|
|
141
|
+
|
|
142
|
+
```text
|
|
143
|
+
Fixed GlobalContext::whisper() memory leak
|
|
144
|
+
Added _debugLog to server.isaac.js
|
|
145
|
+
Allowing bundle:build to build for dev env
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
- One logical change per commit
|
|
149
|
+
- No references to AI tools in commit messages, comments, or files
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Changelog
|
|
154
|
+
|
|
155
|
+
Gina uses [changie](https://changie.dev) for changelog management. After any user-facing change, run:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
changie new
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Pick the kind (`Added`, `Changed`, `Fixed`, `Removed`, `Security`) and write the body from the user's perspective. Do **not** edit `CHANGELOG.md` directly — changie generates it at release time from entries in `.changes/unreleased/`.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Pull request checklist
|
|
166
|
+
|
|
167
|
+
Before opening a PR against `develop`:
|
|
168
|
+
|
|
169
|
+
- [ ] Tests pass — `node --test test/**/*.test.js`
|
|
170
|
+
- [ ] New behaviour is covered by a test (or an explanation is provided for why it cannot be)
|
|
171
|
+
- [ ] A `changie new` entry exists for any user-facing change
|
|
172
|
+
- [ ] Commit messages follow the style above
|
|
173
|
+
- [ ] Docs updated if public API, CLI, or config schema changed
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Reporting bugs
|
|
178
|
+
|
|
179
|
+
Open a [GitHub issue](https://github.com/Rhinostone/gina/issues) and include:
|
|
180
|
+
|
|
181
|
+
- Node.js version (`node --version`)
|
|
182
|
+
- Gina version (`gina --version`)
|
|
183
|
+
- Minimal reproduction steps
|
|
184
|
+
- Expected vs actual behaviour
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Proposing features
|
|
189
|
+
|
|
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.
|
package/GOVERNANCE.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Governance
|
|
2
|
+
|
|
3
|
+
Gina follows the **BDFL** (Benevolent Dictator For Life) model with a commitment to transparency.
|
|
4
|
+
|
|
5
|
+
Gina is developed and maintained by **Martin Luther** ([Rhinostone](https://www.rhinostone.com/)). Final decisions on direction, API design, and releases rest with the maintainer. Community contributions and RFCs are welcome and taken seriously.
|
|
6
|
+
|
|
7
|
+
## How decisions are made
|
|
8
|
+
|
|
9
|
+
- **Patches and bug fixes** — reviewed and merged by the maintainer. Open a pull request against `develop`.
|
|
10
|
+
- **New features** — open a GitHub issue describing the use case before writing code. Features that align with the roadmap and architecture are most likely to be accepted.
|
|
11
|
+
- **Breaking changes and API design** — decided by the maintainer after considering community input. Significant changes go through a public discussion period on GitHub before being finalised.
|
|
12
|
+
- **Releases** — scheduled and cut by the maintainer following the [roadmap](./ROADMAP.md).
|
|
13
|
+
|
|
14
|
+
## Contributing
|
|
15
|
+
|
|
16
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for how to set up the project locally, the commit style, and the PR checklist.
|
|
17
|
+
|
|
18
|
+
## Code of Conduct
|
|
19
|
+
|
|
20
|
+
Be respectful. Contributions of all experience levels are welcome.
|
package/README.md
CHANGED
|
@@ -171,7 +171,7 @@ __NB.:__ If you are launching the command from the project directory, you don't
|
|
|
171
171
|
We have just created a frontend application that will host our homepage.
|
|
172
172
|
You will find all bundle sources under `myproject/src`.
|
|
173
173
|
|
|
174
|
-
__Important:__ Since you are not running a local DNS Server, you have to change the host informations. Go to `myproject/env.json` & replace `dev` hostname from `frontend
|
|
174
|
+
__Important:__ Since you are not running a local DNS Server, you have to change the host informations. Go to `myproject/env.json` & replace `dev` hostname from `frontend-${env}-${scope}-v${projectVersionMajor}.${rootDomain}` to `localhost`.
|
|
175
175
|
This is a temporary hack and gina will soon be provided with its own local DNS Server.
|
|
176
176
|
|
|
177
177
|
You can start the bundle with the following command:
|
|
@@ -229,7 +229,7 @@ Gina is shipped with [Swig](https://node-swig.github.io/swig-templates/) as the
|
|
|
229
229
|
|
|
230
230
|
Please, note that you have 2 types of environments : one for the framework, and one for your project & your bundles.
|
|
231
231
|
|
|
232
|
-
> By default, Gina (the framework) comes with 2 environments : `dev` and `prod`. The default is `prod`. If you are [contributing](./
|
|
232
|
+
> By default, Gina (the framework) comes with 2 environments : `dev` and `prod`. The default is `prod`. If you are [contributing](./CONTRIBUTING.md) to the framework or prototyping your application or service, we advise using the `dev` environment.
|
|
233
233
|
>
|
|
234
234
|
> ```tty
|
|
235
235
|
> gina framework:set --env=dev
|
|
@@ -539,7 +539,7 @@ We just need to override Gina default certificate paths
|
|
|
539
539
|
|
|
540
540
|
```json
|
|
541
541
|
{
|
|
542
|
-
"ca": "{GINA_HOMEDIR}/certificates/scopes
|
|
542
|
+
"ca": "${GINA_HOMEDIR}/certificates/scopes/${scope}/${host}/certificate.combined.pem"
|
|
543
543
|
}
|
|
544
544
|
```
|
|
545
545
|
|
|
@@ -619,6 +619,10 @@ More documentation and tutorials are coming soon !
|
|
|
619
619
|
|
|
620
620
|
For the full documentation, visit [https://gina.io/docs/](https://gina.io/docs/)
|
|
621
621
|
|
|
622
|
+
## Governance
|
|
623
|
+
|
|
624
|
+
Gina is led by Martin Luther (Rhinostone). Final decisions on direction, API design, and releases rest with the maintainer. Community contributions and RFCs are welcome and taken seriously. See [GOVERNANCE.md](./GOVERNANCE.md) for details.
|
|
625
|
+
|
|
622
626
|
## License (MIT)
|
|
623
627
|
|
|
624
628
|
Copyright © 2009-2026 [Rhinostone](http://www.rhinostone.com/)
|
package/ROADMAP.md
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Gina — Roadmap
|
|
2
|
+
|
|
3
|
+
This roadmap covers planned features, architectural improvements, new connectors, and AI integration. Items marked ✅ are shipped. All planned items are open to community contribution — see [CONTRIBUTING.md](./CONTRIBUTING.md) for how to get involved.
|
|
4
|
+
|
|
5
|
+
> **Docs:** [gina.io/docs](https://gina.io/docs/) · **Issues:** [github.com/Rhinostone/gina/issues](https://github.com/Rhinostone/gina/issues)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Timeline
|
|
10
|
+
|
|
11
|
+
| Period | Version | Focus |
|
|
12
|
+
| --- | --- | --- |
|
|
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 |
|
|
18
|
+
| **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Features
|
|
23
|
+
|
|
24
|
+
| Status | Feature | Version | Target |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| ✅ | **Automatic version migration** — Upgrading or downgrading gina (e.g. `0.1.x → 0.2.0`, `0.5.x → 1.0.0`) automatically migrates `~/.gina/` config to the new version on first startup. Downgrade is free — old version data is never removed. | `0.1.8` | 2026-03-26 |
|
|
27
|
+
| 📋 | **`watchers.json`** — First-class bundle config for file watchers. Declare watchers on config files with event-based notification (no polling). Foundation for the dev-mode hot-reload system. | `0.2.0` | Q2 2026 |
|
|
28
|
+
| 📋 | **PWA scaffold** — `gina bundle:add` drops `manifest.json`, a service worker stub (`sw.js`), and the required `<meta>` / `<link>` tags into the bundle boilerplate. Zero runtime dependency. Enables Gina apps to be installed on mobile as PWAs without additional tooling. | `0.4.0` | Q4 2026 |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Modernisation
|
|
33
|
+
|
|
34
|
+
### Phase 1 — Stability
|
|
35
|
+
|
|
36
|
+
| Status | Feature | Version | Target |
|
|
37
|
+
| --- | --- | --- | --- |
|
|
38
|
+
| 📋 | **Per-request controller instances** — Each request gets its own controller instance, eliminating shared mutable state under concurrency. | `0.2.0` | Q2 2026 |
|
|
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
|
+
| 📋 | **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
|
+
|
|
42
|
+
### Phase 2 — Async
|
|
43
|
+
|
|
44
|
+
| Status | Feature | Version | Target |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| 📋 | **Promise adapter for entity calls** — `entityCall(emitter)` wraps the EventEmitter `.onComplete(cb)` pattern in a Promise. Controllers can switch to `async/await` immediately without rewriting entities. | `0.3.0` | Q3 2026 |
|
|
47
|
+
| 📋 | **Async controller actions** — Controller actions become `async function`. Single `try/catch` per action replaces ad-hoc error guards. | `0.3.0` | Q3 2026 |
|
|
48
|
+
|
|
49
|
+
### Phase 3 — Dev Tooling
|
|
50
|
+
|
|
51
|
+
| Status | Feature | Version | Target |
|
|
52
|
+
| --- | --- | --- | --- |
|
|
53
|
+
| 📋 | **File-watcher hot-reload** — Replace `delete require.cache` per-request with a `WatcherService` that evicts modules only on actual file change. Controllers and SQL files reload on save with zero per-request overhead. | `0.3.0` | Q3 2026 |
|
|
54
|
+
| 📋 | **SQL annotation parser** — Replace the single-pass regex for N1QL file parsing with a state-machine parser. Handles nested block comments and `--` in string literals correctly. | `0.3.0` | Q3 2026 |
|
|
55
|
+
|
|
56
|
+
### Phase 4 — DX
|
|
57
|
+
|
|
58
|
+
| Status | Feature | Version | Target |
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| 📋 | **Explicit exports for global helpers** — `getContext`, `setContext`, `_`, `requireJSON` etc. available as explicit `require('gina/gna').getContext` imports alongside the existing global injection. Enables IDE navigation and static analysis. | `0.4.0` | Q4 2026 |
|
|
61
|
+
| 📋 | **TypeScript declaration files** — `.d.ts` declarations for the public surface: `SuperController`, `EntitySuper`, connector config shapes, `routing.json` schema. No TS migration of internals — just declarations for consumer projects. | `0.4.0` | Q4 2026 |
|
|
62
|
+
|
|
63
|
+
### Phase 5 — Future
|
|
64
|
+
|
|
65
|
+
| Status | Feature | Version | Target |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
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
|
+
| 📋 | **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
|
+
| 📋 | **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
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Connectors
|
|
74
|
+
|
|
75
|
+
New database connectors follow the same interface as the existing Couchbase connector: declared in `connectors.json`, acquired via `getConnection()`.
|
|
76
|
+
|
|
77
|
+
| Status | Connector | Version | Target | Notes |
|
|
78
|
+
| --- | --- | --- | --- | --- |
|
|
79
|
+
| 📋 | **Redis** | `0.2.0` | Q2 2026 | Session store and general-purpose cache. Client: `ioredis`. Required for K8s horizontal scaling. |
|
|
80
|
+
| 📋 | **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). |
|
|
81
|
+
| 📋 | **MySQL / MariaDB** | `0.3.0` | Q3 2026 | ORM connector. Client: `mysql2`. |
|
|
82
|
+
| 📋 | **PostgreSQL** | `0.3.0` | Q3 2026 | ORM connector. Client: `pg` (node-postgres). |
|
|
83
|
+
| 📋 | **ScyllaDB** | `0.4.0` | Q4 2026 | Cassandra-compatible wide-column store. Client: `@scylladb/scylla-driver`. |
|
|
84
|
+
| 📋 | **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. |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## K8s & Docker
|
|
89
|
+
|
|
90
|
+
| Status | Feature | Version | Date |
|
|
91
|
+
| --- | --- | --- | --- |
|
|
92
|
+
| ✅ | **Graceful shutdown on SIGTERM** — `server.close()` drains in-flight requests with configurable hard timeout (`GINA_SHUTDOWN_TIMEOUT`). | `0.1.8` | 2026-03-06 |
|
|
93
|
+
| ✅ | **`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
|
+
| ✅ | **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
|
+
| ✅ | **`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
|
+
| 📋 | **Session storage for horizontal scaling** — Plug-in session store backed by Redis (#CN1) for multi-pod deployments. Default in-memory store remains available for single-pod and development. | `0.2.0` | Q2 2026 |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## AI
|
|
101
|
+
|
|
102
|
+
### Phase 1 — AI can write Gina code correctly
|
|
103
|
+
|
|
104
|
+
| Status | Feature | Version | Target |
|
|
105
|
+
| --- | --- | --- | --- |
|
|
106
|
+
| 📋 | **JSON Schemas for config files** — Machine-readable schemas for `routing.json`, `connectors.json`, `app.json`, `settings.json`, `app.crons.json`. Adds `"$schema"` references to generated scaffold files. Gives editors free validation and autocomplete; gives AI assistants authoritative field names so generated config is correct on the first attempt. | `0.2.0` | Q2 2026 |
|
|
107
|
+
| 📋 | **TypeScript declaration files** — Cross-listed with Modernisation Phase 4. Essential for AI code generation accuracy. | `0.4.0` | Q4 2026 |
|
|
108
|
+
|
|
109
|
+
### Phase 2 — Gina apps can use AI
|
|
110
|
+
|
|
111
|
+
| Status | Feature | Version | Target |
|
|
112
|
+
| --- | --- | --- | --- |
|
|
113
|
+
| 📋 | **AI connector** — Declare an AI provider in `connectors.json` and acquire a client via `getConnection()`. Supported protocols: `anthropic://`, `openai://`. Follows the same pattern as database connectors. | `0.3.0` | Q3 2026 |
|
|
114
|
+
| 📋 | **`renderStream` — streaming responses** — `self.renderStream(asyncIterable, contentType)` streams SSE or chunked JSON without buffering. Required for LLM token streaming without bypassing the render pipeline. | `0.3.0` | Q3 2026 |
|
|
115
|
+
| 📋 | **Async job pattern for slow AI calls** — First-class "start job → return jobId → poll or webhook on completion" pattern integrated with the cron/queue infrastructure. Prevents LLM latency (1–30s) from blocking the response pipeline. | `0.4.0` | Q4 2026 |
|
|
116
|
+
|
|
117
|
+
### Phase 3 — AI agents can consume Gina apps
|
|
118
|
+
|
|
119
|
+
| Status | Feature | Version | Target |
|
|
120
|
+
| --- | --- | --- | --- |
|
|
121
|
+
| 📋 | **OpenAPI spec generation** — `gina bundle:openapi @myproject` emits `openapi.json` from `routing.json`. Zero manual spec writing — route annotations become `description` fields. Makes any Gina app consumable by AI agents, API gateways, and testing tools. | `0.4.0` | Q4 2026 |
|
|
122
|
+
| 📋 | **MCP server wrapper** — `gina bundle:mcp @myproject` exposes `routing.json` routes as MCP (Model Context Protocol) tools. Makes any Gina app a native MCP server discoverable by AI agents. | `0.4.0` | Q4 2026 |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Performance
|
|
127
|
+
|
|
128
|
+
| Status | Feature | Version | Target | Notes |
|
|
129
|
+
| --- | --- | --- | --- | --- |
|
|
130
|
+
| 📋 | **`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
|
+
| 📋 | **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
|
+
| 📋 | **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. |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Windows
|
|
137
|
+
|
|
138
|
+
Windows compatibility is a hard requirement for `1.0.0`. The alpha scope covers all core features: install, scaffold, bundle start/stop, routing, rendering, and basic CLI. Full production-grade parity is post-1.0.0.
|
|
139
|
+
|
|
140
|
+
| Status | Feature | Version | Target |
|
|
141
|
+
| --- | --- | --- | --- |
|
|
142
|
+
| 📋 | **Windows alpha compatibility** — Install scripts, path handling, symlinks, and bundle lifecycle (start/stop/restart) work correctly on Windows. `bin/gina.bat` kept in sync with `bin/gina`. CI Windows runner required before this can be marked done. Out of scope for alpha: full build system (bash-based), Windows service integration, production-grade process management. | `1.0.0` | Q3 2027 |
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Tutorials
|
|
147
|
+
|
|
148
|
+
| Status | Tutorial | Duration | Version | Target |
|
|
149
|
+
| --- | --- | --- | --- | --- |
|
|
150
|
+
| 📋 | **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
|
+
| 📋 | **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 |
|
|
152
|
+
| 📋 | **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
|
+
| 📋 | **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
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Website
|
|
158
|
+
|
|
159
|
+
| Status | Feature | Version | Target |
|
|
160
|
+
| --- | --- | --- | --- |
|
|
161
|
+
| 📋 | **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 |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
*Last updated: 2026-03-27 · To suggest a feature, [open an issue](https://github.com/Rhinostone/gina/issues).*
|
package/bin/cli
CHANGED
|
@@ -133,6 +133,21 @@ async function onExec() {
|
|
|
133
133
|
settings = requireJSON(settingsPath);// jshint ignore:line
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
// Guard: settings.json may contain unresolved ${} template placeholders
|
|
137
|
+
// if it was written by a broken W2 migration. Null out any such values
|
|
138
|
+
// so env helpers fall back to safe OS defaults and init.js can regenerate
|
|
139
|
+
// the file correctly on the next framework start.
|
|
140
|
+
var _hasUnresolved = function(v) { return typeof(v) === 'string' && v.indexOf('${') >= 0; };// jshint ignore:line
|
|
141
|
+
if (_hasUnresolved(settings['log_level'])) { settings['log_level'] = 'info'; }
|
|
142
|
+
if (_hasUnresolved(settings['rundir'])) { settings['rundir'] = undefined; }
|
|
143
|
+
if (_hasUnresolved(settings['logdir'])) { settings['logdir'] = undefined; }
|
|
144
|
+
if (_hasUnresolved(settings['tmpdir'])) { settings['tmpdir'] = undefined; }
|
|
145
|
+
if (_hasUnresolved(settings['env'])) { settings['env'] = undefined; }
|
|
146
|
+
if (_hasUnresolved(settings['scope'])) { settings['scope'] = undefined; }
|
|
147
|
+
if (_hasUnresolved(settings['mq_port'])) { settings['mq_port'] = 8125; }
|
|
148
|
+
if (_hasUnresolved(settings['port'])) { settings['port'] = 8124; }
|
|
149
|
+
if (_hasUnresolved(settings['host_v4'])) { settings['host_v4'] = '127.0.0.1'; }
|
|
150
|
+
if (_hasUnresolved(settings['hostname'])) { settings['hostname'] = undefined; }
|
|
136
151
|
|
|
137
152
|
setEnvVar('GINA_LOG_LEVEL', settings['log_level']);// jshint ignore:line
|
|
138
153
|
setEnvVar('GINA_VERSION', version);// jshint ignore:line
|
package/bin/gina-container
CHANGED
|
@@ -59,6 +59,21 @@ if (fs.existsSync(settingsPath)) {
|
|
|
59
59
|
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
// Guard: settings.json may contain unresolved ${} template placeholders
|
|
63
|
+
// if it was written by a broken W2 migration. Null out any such values
|
|
64
|
+
// so env helpers fall back to safe OS defaults.
|
|
65
|
+
var _hasUnresolved = function(v) { return typeof(v) === 'string' && v.indexOf('${') >= 0; };// jshint ignore:line
|
|
66
|
+
if (_hasUnresolved(settings['log_level'])) { settings['log_level'] = 'info'; }
|
|
67
|
+
if (_hasUnresolved(settings['rundir'])) { settings['rundir'] = undefined; }
|
|
68
|
+
if (_hasUnresolved(settings['logdir'])) { settings['logdir'] = undefined; }
|
|
69
|
+
if (_hasUnresolved(settings['tmpdir'])) { settings['tmpdir'] = undefined; }
|
|
70
|
+
if (_hasUnresolved(settings['env'])) { settings['env'] = undefined; }
|
|
71
|
+
if (_hasUnresolved(settings['scope'])) { settings['scope'] = undefined; }
|
|
72
|
+
if (_hasUnresolved(settings['mq_port'])) { settings['mq_port'] = 8125; }
|
|
73
|
+
if (_hasUnresolved(settings['port'])) { settings['port'] = 8124; }
|
|
74
|
+
if (_hasUnresolved(settings['host_v4'])) { settings['host_v4'] = '127.0.0.1'; }
|
|
75
|
+
if (_hasUnresolved(settings['hostname'])) { settings['hostname'] = undefined; }
|
|
76
|
+
|
|
62
77
|
// ── 3. Set all GINA_* env vars (mirrors bin/cli bootstrap) ───────────────────
|
|
63
78
|
var arch = process.arch;
|
|
64
79
|
switch (process.arch) {
|