gina 0.3.9-alpha.1 → 0.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/ROADMAP.md +11 -5
- package/framework/v0.3.9/VERSION +1 -0
- package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v4.js +10 -0
- package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-nunjucks.js +92 -5
- package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/gna.js +7 -0
- package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/server.js +25 -1
- package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-filters/src/main.js +7 -0
- package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-filters/src/main.js +7 -0
- package/framework/{v0.3.9-alpha.1 → v0.3.9}/package.json +1 -1
- package/gna.js +4 -4
- package/llms.txt +4 -0
- package/package.json +2 -2
- package/framework/v0.3.9-alpha.1/VERSION +0 -1
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/AUTHORS +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/LICENSE +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/html/nolayout.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/html/static.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/android-chrome-192x192.png +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/android-chrome-512x512.png +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/apple-touch-icon.png +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/favicon-16x16.png +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/favicon-32x32.png +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/img/favicon.ico +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/config.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/ai/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/ai/lib/connector.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.v2.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.v3.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/connector.v4.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/n1ql.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/mysql/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/mysql/lib/connector.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/postgresql/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/postgresql/lib/connector.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/redis/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/redis/lib/session-store.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sql-parser.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sqlite/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sqlite/lib/connector.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/sqlite/lib/session-store.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/content.encoding +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.framework.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-json.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-stream.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-swig.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/controller.render-v1.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/controller/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/LICENSE +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/busboy-1.6.0/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/deps/streamsearch-1.1.0/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/lib/class.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/lib/factory.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/dev/lib/tools.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/currency.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/language/en.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/language/fr.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/region/en.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/dist/region/fr.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/locales/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/mime.types +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/entity.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/template/entityFactory.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/model/template/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/csrf/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/csrf/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/csrf/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/file/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/file/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/file/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/intl/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/session/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/session/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/session/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/storage/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/src/form-validator.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/plugins/lib/validator/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/router.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/server.express.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/server.isaac.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/status.codes +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/_gitignore +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/app.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/connectors.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/routing.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/settings.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/templates.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/config/watchers.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/css/default.css +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/css/home.css +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_public/readme.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/command/gina.bat.tpl +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/command/gina.tpl +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/env.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/manifest.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/settings.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/statics.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/conf/templates.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/client/json/401.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/client/json/403.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/client/json/404.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/server/html/50x.html +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/server/json/500.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/error/server/json/503.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/template/extensions/logger/config.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/console.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/context.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/LICENSE +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/data/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/dateFormat.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/LICENSE +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/json/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/path.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/src/api-error.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/plugins/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/prototypes.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/task.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/helpers/text.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/src/dep/jszip.min.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/archiver/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/async/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/async/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cache/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/aliases.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/add.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/arguments.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/build.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/copy.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/cp.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/mcp-start.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/mcp.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/oas.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/openapi.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/remove.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/rename.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/restart.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/rm.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/start.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/status.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/bundle/stop.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/cache/stats.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/add.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/arguments.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/migrate.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/remove.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/connector/rm.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/add.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/get.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/link-dev.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/remove.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/rm.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/set.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/unset.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/env/use.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/arguments.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/build.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/dot.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/get.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/init.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/link-node-modules.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/link.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/msg.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/open.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/restart.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/set.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/start.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/status.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/stop.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/tail.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/update.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/framework/version.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/gina-dev.1.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/gina-framework.1.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/gina.1.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/helper.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/inspector/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/inspector/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/inspector/open.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/minion/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/minion/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/msg.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/inc/scan.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/reset.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/port/set.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/add.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/arguments.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/build.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/import.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/move.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/remove.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/rename.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/restart.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/rm.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/start.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/status.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/project/stop.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/protocol/set.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/add.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/link-local.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/link-production.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/remove.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/rm.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/scope/use.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/service/help.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/service/help.txt +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/service/list.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cmd/view/add.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/collection/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/config.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/connector-registry/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/connector-registry/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cron/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cron/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/cron/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/LICENSE +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/domain/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/generator/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/LICENSE +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inherits/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inspector-redact/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/inspector-redact/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/default/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/file/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/mq/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/mq/listener.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/containers/mq/speaker.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/helper.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/logger/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/math/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-dispatch/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-dispatch/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-http/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-http/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-server/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/mcp-server/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/merge/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/merge/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/merge/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/model.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-filters/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-filters/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-resolver/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/nunjucks-resolver/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/proc.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/build.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing/src/radix.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing-introspect/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/routing-introspect/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/session-store.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/shell.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/state.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-filters/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-filters/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-resolver/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/swig-resolver/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/url/README.md +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/url/index.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/url/routing.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/uuid/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/uuid/src/main.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/validator.js +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/watcher/package.json +0 -0
- /package/framework/{v0.3.9-alpha.1 → v0.3.9}/lib/watcher/src/main.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,22 @@ 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.3.9 - 2026-05-04
|
|
10
|
+
### Added
|
|
11
|
+
* Add a `process.gina._bundleFilterWraps[bundleName]` hook so bundles can wrap nunjucks filters at render time. Bundle-level monkey-patches on `lib.nunjucksFilters` do not survive `refreshCore()` (which creates a fresh lib singleton ~per-request in dev mode); the framework now applies registered wraps inside `registerGinaFilters` after the per-request filter factory runs.
|
|
12
|
+
### Changed
|
|
13
|
+
* Drop the redundant `<namespace>-` prefix from `resolveTemplatePath()` effective name in nunjucks rendering. Routes whose name already carries the namespace (e.g. `project-get`, `client-list`) previously resolved to `project/project-get.njk` and `client/client-list.njk`; they now resolve to the cleaner `<namespace>/<action>.njk` path (e.g. `project/get.njk`, `client/list.njk`).
|
|
14
|
+
### Fixed
|
|
15
|
+
* Guard `length` filter against null/undefined input in nunjucks-filters and swig-filters. Templates piping a missing variable through `| length` (e.g. `{{ breadcrumb | length }}`) now return 0 instead of crashing with a `TypeError`, matching upstream nunjucks `runtime.length` and Jinja2.
|
|
16
|
+
* Handle Couchbase Node.js SDK 4.x `JsonTranscoder` pre-decoded session values in the v4 session-store. Previous code called `.toString()` on the already-parsed object (producing `"[object Object]"`) and then `JSON.parse`d it, surfacing as a 500 on every authenticated request that touched session retrieval.
|
|
17
|
+
* Mirror `ctxObj.envVars` into `process.env` during `gna.js` bootstrap so third-party plugins (CSRF middleware, future env-readers) see env vars that `bin/cli`'s `filterArgs()` stripped before spawn. `setEnvVar` populates Gina's own context but did not touch `process.env`, leaving plugins reading the raw `process.env` with `undefined` values.
|
|
18
|
+
* Preserve inner Swig string-literal quotes in mid-URL `{{ }}` expressions in `getAssets()`. The decorative-quote-strip guard was anchored (`/^\{\{/`), so an asset URL with `{{ }}` embedded mid-string had its inner Swig quotes stripped, the mangled URL landed in the cached layout `__ginaData.gina.view.assets`, and the runtime Swig pass then threw `Unexpected colon on line N` at parse time. The compile guard keeps its anchor — only fully-Swig URLs are pre-compiled at scan time; embedded `{{ }}` is left for the cached layout runtime Swig pass.
|
|
19
|
+
* Isolate per-request middleware dispatch state in `nextMiddleware` via a new `createNextMiddleware()` factory. The previous shape held dispatch state on the function own properties (`._index`, `._count`, `._request`, `._response`, `._next`, `._nextAction`); under concurrent requests, request B setup at the entry point overwrote request A state, so A awaited middleware callbacks resumed against B `req` object — visible as sporadic `[csrf] no req.session.id` 500s when express-session correctly populated `req.session` for A but CSRF then ran with B `req`. Each call to `createNextMiddleware()` now returns a fresh closure with isolated state.
|
|
20
|
+
* Add a `require.cache` fallback to the `lib` registry import in `controller.render-nunjucks.js`, mirroring `render-swig.js`. `server.isaac.js` `refreshCore()` overwrites the lib cache entry with the exports value (not a Module object); a plain `require("../../lib")` returns `undefined` after a refresh and crashes the module-level read of `Collection`, `Cache`, `nunjucksFilters`, and `nunjucksResolver`. Route every per-request lookup through a module-scope `libRef` variable that uses `|| require.cache[require.resolve("../../lib")]` as the fallback.
|
|
21
|
+
* Promote `userData` keys to the top-level template context in `controller.render-nunjucks.js` for ergonomic parity with swig. The previous code only wrote each key to `data.page.data[k]`, contradicting the existing comment that promised top-level promotion (`{{ foo }}`); each key is now also mirrored to `data[k]` when not already defined.
|
|
22
|
+
* Alias `data.data` to `data.page.data` before `env.render()` in nunjucks rendering. Page-shells under nunjucks layout inheritance (e.g. `{% set document = data.document %}`) evaluated to `undefined` because `data` was not a key in the env.render context object. Swig layouts already have this aliasing implicit via `{% set data = page.data %}` at `_layouts/layout.html:1`; nunjucks layouts now get the same lookup path framework-side.
|
|
23
|
+
* Substitute `{{ page.X }}`, `{{ page.environment.X }}`, and `{{ page.data.session.X }}` placeholders inside the `ginaLoader` HTML string after `injectAssets()`. `gina.onload.min.js` is inserted as a literal HTML string and so cannot rely on nunjucks to resolve its tokens; without substitution, `window.onGinaLoaded` threw a `JSON.parse` SyntaxError on every page, leaving `gina.popin`, `gina.session`, `gina.forms`, and `window.onGenericXhrResponse` undefined and breaking every legacy popin and form-submit. Mirrors `render-swig.js` flatten-then-`whisper()` approach.
|
|
24
|
+
|
|
9
25
|
## 0.3.8 - 2026-04-26
|
|
10
26
|
### Fixed
|
|
11
27
|
* Fixed `npm install -g gina` failing with `Cannot find module 'psl'` on fresh and upgrade installs (regression from 0.3.7). The pre/post-install scripts no longer load the framework `lib` registry — `psl` and `@rhinostone/swig` are now declared as top-level npm dependencies so the runtime resolves them via the standard module resolution chain, and a helpers pre-load in the install scripts ensures `lib/logger`'s circular load completes correctly so internal helpers' module-local `console` references bind to the full Logger singleton.
|
package/ROADMAP.md
CHANGED
|
@@ -15,7 +15,13 @@ This roadmap covers planned features, architectural improvements, new connectors
|
|
|
15
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 · Inspector Phase 1 + Phase 2 · CLI Tier 1 (project lifecycle, port:set, framework:get) |
|
|
16
16
|
| **Q3 2026** | `0.3.1` ✅ | Release workflow fixes · SQL index reporting Phase A · HTTP/2 direct stream for HTML · Dependency reduction (`ssl-checker`, `colors`, `uuid` removed — engine.io sole runtime dep) |
|
|
17
17
|
| **Q3 2026** | `0.3.2` ✅ | JSON Schema for config files · Entity short-name aliases · Model loading fix · getConfig() proxy fix · Inspector tab presets & QI propagation |
|
|
18
|
-
| **Q3 2026** | `0.3.3` | OpenAPI spec generation · CLI port:set & framework:get · TypeScript declarations · Explicit exports |
|
|
18
|
+
| **Q3 2026** | `0.3.3` ✅ | OpenAPI spec generation · CLI port:set & framework:get · TypeScript declarations · Explicit exports · Swig npm migration · Live index introspection · Popin perf · Docker fixes |
|
|
19
|
+
| **Q3 2026** | `0.3.4` ✅ | Patch: `gna.js` stale framework path fix · Release lifecycle `gna.js` sync |
|
|
20
|
+
| **Q3 2026** | `0.3.5` ✅ | Security: `@rhinostone/swig` 1.5.0 (CVE-2023-25345 extended guards) · Browser-side swig parity |
|
|
21
|
+
| **Q4 2026** | `0.3.6` ✅ | Inspector payload redaction (#R7) · Pre-commit & CI local-tool path guards · Private-token leak gate · Whisper Error fix (#B12) · `framework:init` hardening (#B13) · CORS preflight fix · `syncDocs` lockfile regen |
|
|
22
|
+
| **Q4 2026** | `0.3.7` ✅ | Web Security CSRF trilogy (#CSRF1/2/3) · Nunjucks template engine opt-in (#NJ1–#NJ4) · Eval-safety hardening (#SCS1) · MCP server (#AI8 stdio + HTTP transports) · `connector:*` CLI (#CN10) · vendored-dep CVE-visibility lock · psl/optimist removal · Session.name drop-in identity |
|
|
23
|
+
| **Q4 2026** | `0.3.8` ✅ | Patch: `npm install -g gina@latest` regression fix — `psl` + `@rhinostone/swig` promoted to top-level deps · install scripts decoupled from framework `lib` registry · helpers preload guarding `lib/logger` ↔ `framework/v*/helpers` circular dep |
|
|
24
|
+
| **Q2 2026** | `0.3.9` ✅ | Consumer-feedback batch (11 framework patches): per-request middleware dispatch isolation · Couchbase 4.x JsonTranscoder · `length` filter null safety · `process.env` mirroring · 6 nunjucks render-pipeline patches (libRef fallback · namespace prefix drop · bundle filter wraps · top-level userData · `data.data` alias · ginaLoader placeholders) · `getAssets` mid-URL `{{ }}` strip-guard anchor |
|
|
19
25
|
| **Q4 2026** | `0.4.0` | AI agents (MCP) · ScyllaDB connector · PWA scaffold · Prometheus metrics · Advanced tutorial · Website redesign · Docs offline ZIP · Bun investigation · Couchbase v2 removal · HTTP/2 hardening · Trailer support · CLI Tier 2 (bundle/project status, rename, copy, protocol:remove, minions) |
|
|
20
26
|
| **Q1 2027** | `0.5.0` | ESM support · Template engine migration · Structured logging · Alt-Svc · HTTP/2 priorities · WebSocket over HTTP/2 · Inspector Production · CLI Tier 3 (project:move, framework:update, backup/restore, man pages) |
|
|
21
27
|
| **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
|
|
@@ -119,10 +125,10 @@ Four focused follow-up sessions to close the deferred gap left by the `0.3.7-alp
|
|
|
119
125
|
|
|
120
126
|
| Status | Feature | Version | Target |
|
|
121
127
|
| --- | --- | --- | --- |
|
|
122
|
-
|
|
|
123
|
-
|
|
|
124
|
-
|
|
|
125
|
-
|
|
|
128
|
+
| ✅ | **Port `lib/swig-filters` → `lib/nunjucks-filters`** — Mechanically port the 7 filters (`getUrl`, `getWebroot`, `length`, `nl2br`, `addHours`, `addDays`, `addYears`) into a sister library registered via `env.addFilter()` in `controller.render-nunjucks.js`. Closes the most user-visible gap — template authors get `{{ '/home' \| getUrl() }}` and the date helpers immediately. | `0.3.7-alpha.3` | 2026-04-23 |
|
|
129
|
+
| ✅ | **`setResources` / `<gina>` layout placeholders** — Port the asset-cataloguing pipeline so build-time `<link>` / `<script>` tags are auto-injected into nunjucks layouts the same way they are into swig layouts. `data.page.view.stylesheets` / `.scripts` now populated before render; post-render `injectAssets` helper auto-injects stylesheets before `</head>`, scripts before `</body>` (or before `</head>` when `javascriptsDeferEnabled`), plus `externalPlugins` and the `ginaLoader` before `</head>`. Templates may opt in explicitly with `{{ page.view.stylesheets \| safe }}` — exact-substring detection skips the auto-inject when they do. | `0.3.7-alpha.3` | 2026-04-23 |
|
|
130
|
+
| ✅ | **Static HTML cache parity** — Port the swig disk-write/serve cache path so `cache:` keys in `routing.json` actually produce cached HTML for nunjucks routes. | `0.3.7-alpha.4` | 2026-04-23 |
|
|
131
|
+
| ✅ | **Early Hints 103 auto-send for CSS/JS preloads** — Move the 103 path in `controller.js this.render()` to be engine-agnostic. Pure perf optimisation; manual `self.setEarlyHints(linkHeader)` already works. | `0.3.7-alpha.4` | 2026-04-23 |
|
|
126
132
|
|
|
127
133
|
### Eval safety
|
|
128
134
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.3.9
|
package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v4.js
RENAMED
|
@@ -198,6 +198,16 @@ module.exports = function(session, bundle){
|
|
|
198
198
|
}
|
|
199
199
|
if (err) return fn(err);
|
|
200
200
|
if (!data || !data.value) return fn();
|
|
201
|
+
// FRAMEWORK PATCH (freelancer/v3): handle the case where data.value is
|
|
202
|
+
// already a parsed object (Couchbase Node.js SDK 4.x JsonTranscoder
|
|
203
|
+
// returns the decoded value, not the raw bytes). Without this, calling
|
|
204
|
+
// .toString() on an object produces "[object Object]" which JSON.parse
|
|
205
|
+
// can't handle and every authenticated request 500s on session-retrieval.
|
|
206
|
+
// Push upstream to gina-io/gina.
|
|
207
|
+
if (typeof data.value === 'object' && !Buffer.isBuffer(data.value)) {
|
|
208
|
+
console.debug('[SessionStore v4] (1) GOT data (already-parsed object)');
|
|
209
|
+
return fn(null, data.value);
|
|
210
|
+
}
|
|
201
211
|
data = data.value.toString();
|
|
202
212
|
console.debug('[SessionStore v4] (1) GOT data');
|
|
203
213
|
// console.debug('[SessionStore v4] (2) GOT ' + data);
|
|
@@ -127,7 +127,13 @@ var inspectorRedact = require('lib/inspector-redact');
|
|
|
127
127
|
// rendering without a layout (mirrors render-swig.js:494-498). Fetched via
|
|
128
128
|
// the lib registry so the dev-mode hot-reload evictions of `lib/index.js`
|
|
129
129
|
// don't poison the reference across requests.
|
|
130
|
-
|
|
130
|
+
//
|
|
131
|
+
// FRAMEWORK PATCH (freelancer/v3): mirror render-swig.js's `|| require.cache[...]`
|
|
132
|
+
// fallback. server.isaac.js refreshCore() overwrites the lib cache entry with the
|
|
133
|
+
// exports value (not a Module object), so a plain `require()` here returns
|
|
134
|
+
// undefined and crashes the module-level read. Push upstream to gina-io/gina.
|
|
135
|
+
var libRef = require('../../lib') || require.cache[require.resolve('../../lib')];
|
|
136
|
+
var Collection = libRef.Collection;
|
|
131
137
|
// #NJ3 — static HTML cache writes. Module-scoped `cache` instance mirrors
|
|
132
138
|
// `render-swig.js:6` and `render-json.js:5`. Per-request, the main render
|
|
133
139
|
// function re-points it at the server's shared in-memory store (key:
|
|
@@ -135,7 +141,7 @@ var Collection = require('../../lib').Collection;
|
|
|
135
141
|
// (`server.isaac.js:1012-1067`) is engine-agnostic, so writes from this
|
|
136
142
|
// delegate are served back on subsequent hits without going through the
|
|
137
143
|
// controller at all.
|
|
138
|
-
var cache = new (
|
|
144
|
+
var cache = new (libRef.Cache)();
|
|
139
145
|
|
|
140
146
|
/**
|
|
141
147
|
* Caches a `nunjucks.Environment` per bundle template root so we don't
|
|
@@ -210,6 +216,16 @@ function resolveTemplatePath(data, localOptions) {
|
|
|
210
216
|
if (effective === localOptions.namespace) {
|
|
211
217
|
effective = 'index';
|
|
212
218
|
}
|
|
219
|
+
// FRAMEWORK PATCH (freelancer/v3): drop redundant `<namespace>-` prefix
|
|
220
|
+
// from the file segment when present, so `project/project-get.njk`
|
|
221
|
+
// resolves to `project/get.njk` (and `client/client-list.njk` to
|
|
222
|
+
// `client/list.njk`). Lets route names that already carry the
|
|
223
|
+
// namespace (e.g. `project-get`, `client-list`) live at the cleaner
|
|
224
|
+
// `<namespace>/<action>.njk` path. Push upstream to gina-io/gina.
|
|
225
|
+
var nsPrefix = localOptions.namespace + '-';
|
|
226
|
+
if (effective.length > nsPrefix.length && effective.indexOf(nsPrefix) === 0) {
|
|
227
|
+
effective = effective.substring(nsPrefix.length);
|
|
228
|
+
}
|
|
213
229
|
var rel = localOptions.namespace + '/' + effective;
|
|
214
230
|
if (ext && !rel.endsWith(ext)) { rel += ext; }
|
|
215
231
|
return rel;
|
|
@@ -465,7 +481,9 @@ function sendHtmlResponse(local, html) {
|
|
|
465
481
|
* @returns {void}
|
|
466
482
|
*/
|
|
467
483
|
function registerGinaFilters(env, self, local, localOptions) {
|
|
468
|
-
|
|
484
|
+
// FRAMEWORK PATCH (freelancer/v3): use module-scope libRef fallback so
|
|
485
|
+
// refreshCore's malformed cache entry doesn't return undefined here.
|
|
486
|
+
var nunjucksFilters = (libRef && libRef.nunjucksFilters)
|
|
469
487
|
|| require('../../lib/nunjucks-filters');
|
|
470
488
|
|
|
471
489
|
// Same isProxyHost detection as render-swig.js:606-625. Duplicated here
|
|
@@ -502,6 +520,26 @@ function registerGinaFilters(env, self, local, localOptions) {
|
|
|
502
520
|
res: local.res
|
|
503
521
|
});
|
|
504
522
|
|
|
523
|
+
// FRAMEWORK PATCH (freelancer/v3): apply bundle-level filter wraps registered
|
|
524
|
+
// on process state. Bundle-level monkey-patches on `lib.nunjucksFilters`
|
|
525
|
+
// don't survive refreshCore() (which creates a fresh lib singleton ~per-
|
|
526
|
+
// request in dev mode), so bundles register their wrap on
|
|
527
|
+
// `process.gina._bundleFilterWraps[bundleName]` and the framework applies
|
|
528
|
+
// them here. Push upstream to gina-io/gina alongside Bugs A-D.
|
|
529
|
+
var bundleFilterWraps = (process.gina && process.gina._bundleFilterWraps) || {};
|
|
530
|
+
Object.keys(bundleFilterWraps).forEach(function (bundleName) {
|
|
531
|
+
var wrap = bundleFilterWraps[bundleName];
|
|
532
|
+
if (typeof wrap === 'function') {
|
|
533
|
+
try {
|
|
534
|
+
filters = wrap(filters) || filters;
|
|
535
|
+
} catch (wrapErr) {
|
|
536
|
+
try {
|
|
537
|
+
console.warn('[render-nunjucks] bundle filter wrap failed for ' + bundleName + ': ' + (wrapErr.message || wrapErr));
|
|
538
|
+
} catch (e) {}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
|
|
505
543
|
for (var name in filters) {
|
|
506
544
|
if (typeof filters[name] === 'function' && name !== 'getConfig') {
|
|
507
545
|
env.addFilter(name, filters[name]);
|
|
@@ -717,10 +755,11 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
|
|
|
717
755
|
// Fetch the nunjucks module from the process-cache. `get()` throws if
|
|
718
756
|
// the bundle-startup load did not succeed — we surface that cleanly
|
|
719
757
|
// via throwError so the usual error page pipeline handles it.
|
|
758
|
+
// FRAMEWORK PATCH (freelancer/v3): use module-scope libRef fallback.
|
|
720
759
|
var nunjucks;
|
|
721
760
|
try {
|
|
722
|
-
nunjucks =
|
|
723
|
-
?
|
|
761
|
+
nunjucks = (libRef && libRef.nunjucksResolver)
|
|
762
|
+
? libRef.nunjucksResolver.get()
|
|
724
763
|
: require('../../lib/nunjucks-resolver').get();
|
|
725
764
|
} catch (err) {
|
|
726
765
|
return self.throwError(err);
|
|
@@ -781,13 +820,29 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
|
|
|
781
820
|
|
|
782
821
|
// Merge user data into page.data so templates can access via {{ page.data.foo }}
|
|
783
822
|
// or {{ foo }} at top level (promoted for ergonomic parity with swig).
|
|
823
|
+
// FRAMEWORK PATCH (freelancer/v3): the comment promised top-level promotion but
|
|
824
|
+
// the original code only wrote to data.page.data. Mirror to top-level too.
|
|
784
825
|
if (userData && typeof(userData) === 'object') {
|
|
785
826
|
if (!data.page.data) { data.page.data = {}; }
|
|
786
827
|
Object.keys(userData).forEach(function (k) {
|
|
787
828
|
data.page.data[k] = userData[k];
|
|
829
|
+
if (typeof(data[k]) === 'undefined') {
|
|
830
|
+
data[k] = userData[k];
|
|
831
|
+
}
|
|
788
832
|
});
|
|
789
833
|
}
|
|
790
834
|
|
|
835
|
+
// FRAMEWORK PATCH (freelancer/v3): Bug J — alias `data.data` to `data.page.data`
|
|
836
|
+
// so page-shell `{% set X = data.Y %}` resolves under nunjucks layout
|
|
837
|
+
// inheritance. Mirrors swig's `_layouts/layout.html:1` `{% set data = page.data %}`.
|
|
838
|
+
// Without this, page-shells like `estimate/get.njk:11 {% set document = data.document %}`
|
|
839
|
+
// evaluate to undefined (no `data` key in the env.render context object) and
|
|
840
|
+
// the .overview section renders empty even though page.data.document is fully
|
|
841
|
+
// populated. Push upstream to gina-io/gina alongside Bugs A-I.
|
|
842
|
+
if (data && data.page && data.page.data) {
|
|
843
|
+
data.data = data.page.data;
|
|
844
|
+
}
|
|
845
|
+
|
|
791
846
|
var env;
|
|
792
847
|
try {
|
|
793
848
|
env = getEnvironment(nunjucks, templateRoot, {
|
|
@@ -924,6 +979,38 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
|
|
|
924
979
|
try { console.warn('[render-nunjucks] asset injection skipped: ' + (assetErr.message || assetErr)); } catch (e) {}
|
|
925
980
|
}
|
|
926
981
|
|
|
982
|
+
// FRAMEWORK PATCH (freelancer/v3): substitute {{ page.X }} / {{ page.environment.X }}
|
|
983
|
+
// placeholders inside ginaLoader (gina.onload.min.js), which is inserted as a literal
|
|
984
|
+
// HTML string by injectAssets() and therefore cannot rely on nunjucks to resolve its
|
|
985
|
+
// tokens. Mirrors render-swig.js:572-582 (flatten dict) + 1276 (whisper call). Without
|
|
986
|
+
// this, `window.onGinaLoaded` throws a JSON.parse SyntaxError on every page, leaving
|
|
987
|
+
// gina.popin / gina.session / gina.forms / window.onGenericXhrResponse undefined and
|
|
988
|
+
// breaking every legacy popin + form-submit. Push upstream to gina-io/gina alongside
|
|
989
|
+
// Bugs A-E.
|
|
990
|
+
try {
|
|
991
|
+
if (data && data.page && typeof data.page === 'object' && typeof whisper === 'function') {
|
|
992
|
+
var ginaLoaderDic = {};
|
|
993
|
+
for (var _d in data.page) {
|
|
994
|
+
ginaLoaderDic['page.' + _d] = data.page[_d];
|
|
995
|
+
}
|
|
996
|
+
if (typeof data.page.environment === 'object' && data.page.environment !== null) {
|
|
997
|
+
for (var _k in data.page.environment) {
|
|
998
|
+
ginaLoaderDic['page.environment.' + _k] = data.page.environment[_k];
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
// gina.onload.min.js also references `{{ page.data.session.X }}` (depth 3)
|
|
1002
|
+
// for session id/timeout/createdAt/lastModified — flatten that level too.
|
|
1003
|
+
if (data.page.data && typeof data.page.data === 'object' && data.page.data.session && typeof data.page.data.session === 'object') {
|
|
1004
|
+
for (var _s in data.page.data.session) {
|
|
1005
|
+
ginaLoaderDic['page.data.session.' + _s] = data.page.data.session[_s];
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
html = whisper(ginaLoaderDic, html, /\{{ ([a-zA-Z.]+) \}}/g);
|
|
1009
|
+
}
|
|
1010
|
+
} catch (whisperErr) {
|
|
1011
|
+
try { console.warn('[render-nunjucks] ginaLoader whisper substitution skipped: ' + (whisperErr.message || whisperErr)); } catch (e) {}
|
|
1012
|
+
}
|
|
1013
|
+
|
|
927
1014
|
// Inspector dev-payload injection (dev mode only; no-op otherwise).
|
|
928
1015
|
try {
|
|
929
1016
|
html = injectInspectorScripts(html, data, self, local, displayInspector);
|
|
@@ -221,6 +221,13 @@ if (process.argv.length >= 3 /**&& /gina$/.test(process.argv[1])*/ ) {
|
|
|
221
221
|
evar = false
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
+
// FRAMEWORK PATCH (freelancer/v3): mirror ctxObj.envVars into process.env so
|
|
225
|
+
// third-party plugins (Csrf, future env-readers) see what filterArgs() stripped
|
|
226
|
+
// in the supervisor before spawn. Push upstream to gina-io/gina.
|
|
227
|
+
if ( typeof(obj[a]) != 'undefined' && obj[a] !== null ) {
|
|
228
|
+
process.env[a] = String(obj[a]);
|
|
229
|
+
}
|
|
230
|
+
|
|
224
231
|
setEnvVar(a, evar, true)
|
|
225
232
|
|
|
226
233
|
}
|
|
@@ -1063,7 +1063,14 @@ function Server(options) {
|
|
|
1063
1063
|
// .replace(/((src|href|srcset)\=\"|(src|href|srcset)\=\')/g, '')
|
|
1064
1064
|
// .replace(/\"/g, '')
|
|
1065
1065
|
// ;
|
|
1066
|
-
|
|
1066
|
+
// FRAMEWORK PATCH (freelancer/v3): drop the `^` anchor so the
|
|
1067
|
+
// decorative-quote strip is also skipped when `{{ }}` is embedded
|
|
1068
|
+
// mid-string (e.g. `css/main.css?cache={{ ''|formatDate('HH:MM:ss') }}`).
|
|
1069
|
+
// Without this, inner Swig string-literal quotes get stripped, the
|
|
1070
|
+
// expression becomes `{{ |formatDate(HH:MM:ss) }}`, and the cached
|
|
1071
|
+
// layout's runtime Swig pass throws "Unexpected colon on line N".
|
|
1072
|
+
// Reproduces in v0.3.9-alpha.2 (last touched 2026-04-26).
|
|
1073
|
+
if ( !/\{\{/.test(url) ) {
|
|
1067
1074
|
url = url.replace(/(\"|\')/g, '');
|
|
1068
1075
|
}
|
|
1069
1076
|
if (swig && /^\{\{/.test(url) ) {
|
|
@@ -2756,6 +2763,8 @@ function Server(options) {
|
|
|
2756
2763
|
&& self.instance._expressMiddlewares.length > 0
|
|
2757
2764
|
) {
|
|
2758
2765
|
|
|
2766
|
+
// FRAMEWORK PATCH (freelancer/v3): Bug I — per-request dispatcher
|
|
2767
|
+
var nextMiddleware = createNextMiddleware();
|
|
2759
2768
|
nextMiddleware._index = 0;
|
|
2760
2769
|
nextMiddleware._count = self.instance._expressMiddlewares.length-1;
|
|
2761
2770
|
nextMiddleware._request = request;
|
|
@@ -3628,6 +3637,17 @@ function Server(options) {
|
|
|
3628
3637
|
* @private
|
|
3629
3638
|
* @param {Error|boolean} err - Error from the previous middleware, or false
|
|
3630
3639
|
*/
|
|
3640
|
+
// FRAMEWORK PATCH (freelancer/v3): Bug I — wrap nextMiddleware in a
|
|
3641
|
+
// per-request factory. The original function held dispatch state on its
|
|
3642
|
+
// own properties (._index, ._request, ._response, ._next, ._nextAction).
|
|
3643
|
+
// Under concurrent requests, request B's setup at the entry point
|
|
3644
|
+
// overwrote request A's state, so A's awaited middleware callbacks
|
|
3645
|
+
// resumed against B's req object — visible as "[csrf] no req.session.id"
|
|
3646
|
+
// sporadic 500s when express-session correctly populated req.session for
|
|
3647
|
+
// A but CSRF then ran with B's req that never went through session.
|
|
3648
|
+
// Each call to createNextMiddleware now returns a fresh function with
|
|
3649
|
+
// closure-isolated state. Push upstream to gina-io/gina.
|
|
3650
|
+
var createNextMiddleware = function() {
|
|
3631
3651
|
var nextMiddleware = function(err) {
|
|
3632
3652
|
|
|
3633
3653
|
var router = local.router;
|
|
@@ -3681,6 +3701,8 @@ function Server(options) {
|
|
|
3681
3701
|
}
|
|
3682
3702
|
});
|
|
3683
3703
|
};
|
|
3704
|
+
return nextMiddleware;
|
|
3705
|
+
};
|
|
3684
3706
|
|
|
3685
3707
|
/**
|
|
3686
3708
|
* Detects CORS preflight (OPTIONS) requests by inspecting the method,
|
|
@@ -4092,6 +4114,8 @@ function Server(options) {
|
|
|
4092
4114
|
|
|
4093
4115
|
if (matched) {
|
|
4094
4116
|
if ( /^isaac/.test(self.engine) && self.instance._expressMiddlewares.length > 0) {
|
|
4117
|
+
// FRAMEWORK PATCH (freelancer/v3): Bug I — per-request dispatcher
|
|
4118
|
+
var nextMiddleware = createNextMiddleware();
|
|
4095
4119
|
nextMiddleware._index = 0;
|
|
4096
4120
|
nextMiddleware._count = self.instance._expressMiddlewares.length-1;
|
|
4097
4121
|
nextMiddleware._request = req;
|
|
@@ -338,6 +338,13 @@ function NunjucksFilters(conf) {
|
|
|
338
338
|
* {{ users | length }}
|
|
339
339
|
*/
|
|
340
340
|
self.length = function (input, obj) {
|
|
341
|
+
// Match upstream nunjucks `runtime.length` / Jinja2: undefined or null → 0.
|
|
342
|
+
// Without this guard, `typeof(input.count)` dereferences `.count` first
|
|
343
|
+
// and throws on undefined — crashing any template that pipes a missing
|
|
344
|
+
// variable through `| length`.
|
|
345
|
+
if ( input == null ) {
|
|
346
|
+
return 0;
|
|
347
|
+
}
|
|
341
348
|
if ( typeof(input.count) != 'undefined' ) {
|
|
342
349
|
return input.count();
|
|
343
350
|
} else {
|
|
@@ -318,6 +318,13 @@ function SwigFilters(conf) {
|
|
|
318
318
|
// Extends default `length` filter
|
|
319
319
|
self.length = function (input, obj) {
|
|
320
320
|
|
|
321
|
+
// Match upstream nunjucks `runtime.length` / Jinja2: undefined or null → 0.
|
|
322
|
+
// Without this guard, `typeof(input.count)` dereferences `.count` first
|
|
323
|
+
// and throws on undefined — crashing any template that pipes a missing
|
|
324
|
+
// variable through `| length`.
|
|
325
|
+
if ( input == null ) {
|
|
326
|
+
return 0
|
|
327
|
+
}
|
|
321
328
|
if ( typeof(input.count) != 'undefined' ) {
|
|
322
329
|
return input.count()
|
|
323
330
|
} else {
|
package/gna.js
CHANGED
|
@@ -15,14 +15,14 @@
|
|
|
15
15
|
'use strict';
|
|
16
16
|
|
|
17
17
|
// Framework core — the main gna module (lifecycle hooks, lib, etc.)
|
|
18
|
-
var _gna = require('./framework/v0.3.9
|
|
18
|
+
var _gna = require('./framework/v0.3.9/core/gna');
|
|
19
19
|
|
|
20
20
|
// SuperController and EntitySuper — loaded from their source modules
|
|
21
|
-
var SuperController = require('./framework/v0.3.9
|
|
22
|
-
var EntitySuper = require('./framework/v0.3.9
|
|
21
|
+
var SuperController = require('./framework/v0.3.9/core/controller');
|
|
22
|
+
var EntitySuper = require('./framework/v0.3.9/core/model/entity');
|
|
23
23
|
|
|
24
24
|
// uuid — from the lib registry
|
|
25
|
-
var uuid = require('./framework/v0.3.9
|
|
25
|
+
var uuid = require('./framework/v0.3.9/lib/uuid');
|
|
26
26
|
|
|
27
27
|
module.exports = {
|
|
28
28
|
|
package/llms.txt
CHANGED
|
@@ -870,3 +870,7 @@ YAML indent trap: the heredoc body and the `EOF` terminator must land at column
|
|
|
870
870
|
82. **Source-inspection tests that assert source order — `src.indexOf('<funcName>(<args>)')` matches the function DEFINITION before the call site, not the call site.** When a test asserts "A must be called before B" via `indexOf` on a function-name-with-args fragment, the match lands on the `function <funcName>(<args>)` definition near the top of the file, not the call site lower in the body. If both names are defined in the same source-order as their call sites, the assertion accidentally passes for the wrong reason; if they're defined in a different order than they're called (helper defined first, used last), it fails for the wrong reason. **Discrimination test**: `grep -c '<pattern>' <file>` — if the count is > 1, the indexOf is ambiguous and the assertion is unreliable. **Fix**: search for a unique call-site fragment that doesn't appear in the function definition — typically the assignment LHS (`requestOrigin = parseRequestOrigin(req)`, `presented = readPresentedToken(req`). Definitions never contain the assignment target. Same trap applies to any pattern where definition and call share the same identifier syntax — method names, event listener attachments, even `console.error('[<feature>]'` template strings. Precedent: 2026-04-26 #CSRF3 implementation — section 14 source-inspection test "Origin pre-filter runs AFTER the csrfExempt short-circuit" failed at first because `indexOf('parseRequestOrigin(req)')` matched the `function parseRequestOrigin(req)` definition (line 152) before the call site (line 531); switched to `indexOf('requestOrigin = parseRequestOrigin(req)')` (assignment-form, unique to the call site). The sibling "BEFORE token verify" test passed only by coincidence — the `parseRequestOrigin` definition was already before the `readPresentedToken` definition in the file.
|
|
871
871
|
|
|
872
872
|
83. **`Origin: "null"` is a real value browsers send — sandboxed iframes (`<iframe sandbox>`), `file://` pages, and some redirected requests carry the literal string `"null"` in the Origin header (and in `Sec-Fetch-Site: cross-site` flows).** Origin-checking code that does `if (origin) { /* allowlist match */ }` treats `"null"` as truthy and tries to match it. Without an explicit guard the result is wrong-for-the-right-outcome at best: the allowlist almost never contains `"null"`, so the request 403s — but for the wrong reason (it should fall through to the Referer fallback or a known-no-origin handler, not be rejected for "origin not in allowlist"). The same trap applies to CORS allowlists, CSRF Origin pre-filters, audit logging, and any code branching on `Origin`. **Fix**: add an explicit `s === 'null'` guard at the start of the Origin parser, treating `"null"` exactly like an absent header — empty result, fall through to the next signal (Referer, Sec-Fetch metadata, etc.). Document the guard with a brief comment so it isn't "cleaned up" by a future contributor who reads it as a no-op string check. Precedent: 2026-04-26 #CSRF3 implementation — `parseOriginString` at `core/plugins/lib/csrf/src/main.js:108` returns `null` (the JS literal) when input is the string `"null"`, so `parseRequestOrigin` falls back to parsing the host out of `Referer`. Two unit tests pin this behaviour: `Origin: "null"` + missing `Referer` → 403 with reason "missing origin/referer"; `Origin: "null"` + valid `Referer` → next() called. Without the guard, the missing-Referer case would have 403'd with reason "origin not allowed", masking the real problem from any operator reading the log.
|
|
873
|
+
|
|
874
|
+
84. **Local-tool doc files at gitignored paths drift independently across worktree splits — git merges don't carry gitignored content, so each worktree's local docs must be maintained separately.** A primary repo (`develop`) and a linked worktree (`dev/wip` via `git worktree add`) hold independent gitignored doc copies; a version bump on the primary updates its local docs via tooling, but the linked worktree's copies stay at the previous version because gitignored files don't FF across `git merge --ff-only`. **Auto-update on the primary worktree**: version-bump scripts read `script/.local-sync-targets.json` (gitignored — lists relative paths to local doc files), iterate entries, regex-replace `v<old>` → `v<new>` with `(?![\\d.])` lookahead to avoid clobbering longer prefix-sharing versions. Tracked source code names only the generic config file, never the targets — no public-surface leak of local-tool path names. Same indirection already in `script/post_publish.js → bumpVersion`; replicated in `script/prepare_version.js` for non-publish bumps (added 2026-04-29). **Manual update on linked worktrees**: the project's gitignored git-workflow doc gets a post-merge state-check step instructing the maintainer to grep version refs after every fast-forward and update mismatches. **Generalises**: any worktree-split repo with gitignored doc files has the same pattern. Each worktree's local-doc version refs match its OWN `package.json` — versions can legitimately differ between branches at different cuts. Precedent: 2026-04-29 — discovered drift in two local-doc files (primary on `0.3.9-alpha.2` had docs saying `alpha.11`; linked on `0.3.7-alpha.10` had docs saying `alpha.8`); fixed manually, then automated via the existing `.local-sync-targets.json` indirection.
|
|
875
|
+
|
|
876
|
+
85. **Tracked source code that reads/writes local-tool files must use a gitignored config-file indirection — naming the local-tool paths directly in tracked source CONTENT is a public-surface leak even when the operation is functional.** Extends entry #68's "local-tool path leaks have three surfaces" by adding a fourth: tracked-script body content (path string literals, code comments, variable names, log/console message strings). **Counterfactual check before writing**: would removing every mention of the local-tool name BREAK the feature, or just make the path configurable? If the latter, the mention is not load-bearing — extract to a gitignored sidecar config the script reads at runtime. Compare to the existing leak-filter regex in `script/prepare_version.js` (already quoted by entry #68) — THAT pattern IS product functionality (the filter literally needs to identify the path to filter it out), allowed exception. **Existing pattern to mirror**: `script/post_publish.js → bumpVersion` reads `script/.local-sync-targets.json` (gitignored — lists relative paths to operate on), iterates entries, applies generic regex-replace. Tracked source names only the generic config file, never the targets. The same shape was replicated in `script/prepare_version.js` (entry #84) after a first-attempt mistake. **The "Don't strip what you haven't surveyed" mirror — "Don't ADD a public-surface mention without surveying the rule first"**. Recovery cost is asymmetric: removal requires `git filter-repo` + force-push (and force-push to a public default branch is itself a high-friction operation per entry #79), addition is one keystroke. Always run the leak-scan regex (per entry #68's documented patterns) against the diff BEFORE staging — `git diff <file> | grep '^+' | grep -v '^+++' | grep -iE '<leak-patterns>'` — not after pushing. Precedent: 2026-04-29 — first attempt at extending `prepare_version.js` for the worktree-drift fix (entry #84) named the local-doc path directly in 6+ places (path literal, two comments, variable names, two log strings); user surfaced the violation before commit during a "are you sure there won't be side effects?" review pass; reverted to the `post_publish.js` indirection pattern in the same session, then committed clean.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gina",
|
|
3
|
-
"version": "0.3.9
|
|
3
|
+
"version": "0.3.9",
|
|
4
4
|
"description": "Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"nodejs",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"gina-container": "bin/gina-container",
|
|
57
57
|
"gina-init": "bin/gina-init"
|
|
58
58
|
},
|
|
59
|
-
"main": "./framework/v0.3.9
|
|
59
|
+
"main": "./framework/v0.3.9/core/gna",
|
|
60
60
|
"types": "./types/index.d.ts",
|
|
61
61
|
"typesVersions": {
|
|
62
62
|
"*": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.3.9-alpha.1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/beemaster/index.html
RENAMED
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css
RENAMED
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br
RENAMED
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz
RENAMED
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/html/statusbar.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/index.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg
RENAMED
|
File without changes
|
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js
RENAMED
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br
RENAMED
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v2.js
RENAMED
|
File without changes
|
/package/framework/{v0.3.9-alpha.1 → v0.3.9}/core/connectors/couchbase/lib/session-store.v3.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|