gina 0.3.7-alpha.3 → 0.3.7-alpha.4

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.
Files changed (375) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/framework/v0.3.7-alpha.4/VERSION +1 -0
  3. package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/controller.render-nunjucks.js +178 -5
  4. package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/server.js +6 -1
  5. package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/build.js +23 -6
  6. package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/init.js +23 -6
  7. package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/main.js +11 -1
  8. package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/math/index.js +87 -3
  9. package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/package.json +1 -1
  10. package/gna.js +4 -4
  11. package/llms.txt +3 -1
  12. package/package.json +2 -2
  13. package/script/post_install.js +23 -6
  14. package/script/pre_install.js +23 -6
  15. package/framework/v0.3.7-alpha.3/VERSION +0 -1
  16. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/AUTHORS +0 -0
  17. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/LICENSE +0 -0
  18. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/html/nolayout.html +0 -0
  19. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/html/static.html +0 -0
  20. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/img/android-chrome-192x192.png +0 -0
  21. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/img/android-chrome-512x512.png +0 -0
  22. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/img/apple-touch-icon.png +0 -0
  23. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/img/favicon-16x16.png +0 -0
  24. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/img/favicon-32x32.png +0 -0
  25. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/img/favicon.ico +0 -0
  26. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/README.md +0 -0
  27. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  28. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  29. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  30. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  31. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  32. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  33. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  34. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  35. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  36. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/html/toolbar.html +0 -0
  37. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.br +0 -0
  38. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.gz +0 -0
  39. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  40. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  41. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  42. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  43. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  44. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
  45. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  46. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  47. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  48. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  49. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  50. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  51. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/config.js +0 -0
  52. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/ai/index.js +0 -0
  53. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/ai/lib/connector.js +0 -0
  54. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/index.js +0 -0
  55. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/connector.js +0 -0
  56. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  57. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  58. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  59. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/n1ql.js +0 -0
  60. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/session-store.js +0 -0
  61. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  62. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  63. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  64. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/mysql/index.js +0 -0
  65. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/mysql/lib/connector.js +0 -0
  66. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/postgresql/index.js +0 -0
  67. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/postgresql/lib/connector.js +0 -0
  68. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/redis/index.js +0 -0
  69. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/redis/lib/session-store.js +0 -0
  70. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/sql-parser.js +0 -0
  71. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/sqlite/index.js +0 -0
  72. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/sqlite/lib/connector.js +0 -0
  73. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/connectors/sqlite/lib/session-store.js +0 -0
  74. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/content.encoding +0 -0
  75. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/controller.framework.js +0 -0
  76. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/controller.js +0 -0
  77. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/controller.render-json.js +0 -0
  78. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/controller.render-stream.js +0 -0
  79. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/controller.render-swig.js +0 -0
  80. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/controller.render-v1.js +0 -0
  81. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/controller/index.js +0 -0
  82. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/busboy-1.6.0/LICENSE +0 -0
  83. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/busboy-1.6.0/README.md +0 -0
  84. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  85. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  86. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  87. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  88. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/busboy-1.6.0/package.json +0 -0
  89. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  90. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  91. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/deps/streamsearch-1.1.0/package.json +0 -0
  92. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/dev/index.js +0 -0
  93. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/dev/lib/class.js +0 -0
  94. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/dev/lib/factory.js +0 -0
  95. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/dev/lib/tools.js +0 -0
  96. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/gna.js +0 -0
  97. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/locales/README.md +0 -0
  98. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/locales/currency.json +0 -0
  99. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/locales/dist/language/en.json +0 -0
  100. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/locales/dist/language/fr.json +0 -0
  101. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/locales/dist/region/en.json +0 -0
  102. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/locales/dist/region/fr.json +0 -0
  103. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/locales/index.js +0 -0
  104. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/mime.types +0 -0
  105. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/model/entity.js +0 -0
  106. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/model/index.js +0 -0
  107. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/model/template/entityFactory.js +0 -0
  108. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/model/template/index.js +0 -0
  109. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/README.md +0 -0
  110. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/index.js +0 -0
  111. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/file/README.md +0 -0
  112. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/file/build.json +0 -0
  113. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/file/package.json +0 -0
  114. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/intl/README.md +0 -0
  115. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/intl/build.json +0 -0
  116. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/intl/package.json +0 -0
  117. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/intl/src/main.js +0 -0
  118. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/storage/README.md +0 -0
  119. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/storage/build.json +0 -0
  120. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/storage/package.json +0 -0
  121. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/storage/src/main.js +0 -0
  122. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/validator/README.md +0 -0
  123. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/validator/build.json +0 -0
  124. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/validator/package.json +0 -0
  125. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/validator/src/form-validator.js +0 -0
  126. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/plugins/lib/validator/src/main.js +0 -0
  127. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/router.js +0 -0
  128. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/server.express.js +0 -0
  129. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/server.isaac.js +0 -0
  130. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/status.codes +0 -0
  131. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/_gitignore +0 -0
  132. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/config/app.json +0 -0
  133. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  134. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/config/routing.json +0 -0
  135. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/config/settings.json +0 -0
  136. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  137. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/config/templates.json +0 -0
  138. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  139. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  140. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  141. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  142. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle/index.js +0 -0
  143. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  144. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  145. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  146. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  147. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  148. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  149. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_public/readme.md +0 -0
  150. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  151. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  152. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  153. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  154. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  155. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/command/gina.bat.tpl +0 -0
  156. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/command/gina.tpl +0 -0
  157. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/conf/env.json +0 -0
  158. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/conf/manifest.json +0 -0
  159. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/conf/package.json +0 -0
  160. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/conf/settings.json +0 -0
  161. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/conf/statics.json +0 -0
  162. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/conf/templates.json +0 -0
  163. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/error/client/json/401.json +0 -0
  164. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/error/client/json/403.json +0 -0
  165. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/error/client/json/404.json +0 -0
  166. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/error/server/html/50x.html +0 -0
  167. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/error/server/json/500.json +0 -0
  168. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/error/server/json/503.json +0 -0
  169. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/core/template/extensions/logger/config.json +0 -0
  170. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/console.js +0 -0
  171. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/context.js +0 -0
  172. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/data/LICENSE +0 -0
  173. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/data/README.md +0 -0
  174. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/data/package.json +0 -0
  175. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/data/src/main.js +0 -0
  176. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/dateFormat.js +0 -0
  177. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/index.js +0 -0
  178. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/json/LICENSE +0 -0
  179. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/json/README.md +0 -0
  180. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/json/package.json +0 -0
  181. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/json/src/main.js +0 -0
  182. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/path.js +0 -0
  183. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/plugins/README.md +0 -0
  184. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/plugins/package.json +0 -0
  185. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/plugins/src/api-error.js +0 -0
  186. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/plugins/src/main.js +0 -0
  187. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/prototypes.js +0 -0
  188. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/task.js +0 -0
  189. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/helpers/text.js +0 -0
  190. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/archiver/README.md +0 -0
  191. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/archiver/build.json +0 -0
  192. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/archiver/package.json +0 -0
  193. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/archiver/src/dep/jszip.min.js +0 -0
  194. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/archiver/src/main.js +0 -0
  195. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/async/package.json +0 -0
  196. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/async/src/main.js +0 -0
  197. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cache/README.md +0 -0
  198. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cache/build.json +0 -0
  199. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cache/package.json +0 -0
  200. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cache/src/main.js +0 -0
  201. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/aliases.json +0 -0
  202. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/add.js +0 -0
  203. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/arguments.json +0 -0
  204. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/build.js +0 -0
  205. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/copy.js +0 -0
  206. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/cp.js +0 -0
  207. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/help.js +0 -0
  208. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/help.txt +0 -0
  209. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/list.js +0 -0
  210. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/mcp-start.js +0 -0
  211. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/mcp.js +0 -0
  212. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/oas.js +0 -0
  213. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/openapi.js +0 -0
  214. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/remove.js +0 -0
  215. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/rename.js +0 -0
  216. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/restart.js +0 -0
  217. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/rm.js +0 -0
  218. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/start.js +0 -0
  219. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/status.js +0 -0
  220. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/bundle/stop.js +0 -0
  221. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/cache/stats.js +0 -0
  222. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/add.js +0 -0
  223. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/arguments.json +0 -0
  224. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/help.js +0 -0
  225. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/help.txt +0 -0
  226. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/list.js +0 -0
  227. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/migrate.js +0 -0
  228. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/remove.js +0 -0
  229. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/connector/rm.js +0 -0
  230. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/add.js +0 -0
  231. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/get.js +0 -0
  232. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/help.js +0 -0
  233. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/help.txt +0 -0
  234. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/link-dev.js +0 -0
  235. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/list.js +0 -0
  236. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/remove.js +0 -0
  237. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/rm.js +0 -0
  238. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/set.js +0 -0
  239. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/unset.js +0 -0
  240. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/env/use.js +0 -0
  241. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/arguments.json +0 -0
  242. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/dot.js +0 -0
  243. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/get.js +0 -0
  244. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/help.js +0 -0
  245. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/help.txt +0 -0
  246. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/link-node-modules.js +0 -0
  247. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/link.js +0 -0
  248. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/msg.json +0 -0
  249. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/open.js +0 -0
  250. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/restart.js +0 -0
  251. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/set.js +0 -0
  252. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/start.js +0 -0
  253. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/status.js +0 -0
  254. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/stop.js +0 -0
  255. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/tail.js +0 -0
  256. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/update.js +0 -0
  257. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/framework/version.js +0 -0
  258. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/gina-dev.1.md +0 -0
  259. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/gina-framework.1.md +0 -0
  260. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/gina.1.md +0 -0
  261. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/helper.js +0 -0
  262. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/index.js +0 -0
  263. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/inspector/help.js +0 -0
  264. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/inspector/help.txt +0 -0
  265. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/inspector/open.js +0 -0
  266. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/minion/help.js +0 -0
  267. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/minion/help.txt +0 -0
  268. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/msg.json +0 -0
  269. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/port/help.js +0 -0
  270. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/port/help.txt +0 -0
  271. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/port/inc/scan.js +0 -0
  272. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/port/list.js +0 -0
  273. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/port/reset.js +0 -0
  274. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/port/set.js +0 -0
  275. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/add.js +0 -0
  276. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/arguments.json +0 -0
  277. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/build.js +0 -0
  278. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/help.js +0 -0
  279. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/help.txt +0 -0
  280. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/import.js +0 -0
  281. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/list.js +0 -0
  282. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/move.js +0 -0
  283. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/remove.js +0 -0
  284. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/rename.js +0 -0
  285. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/restart.js +0 -0
  286. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/rm.js +0 -0
  287. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/start.js +0 -0
  288. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/status.js +0 -0
  289. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/project/stop.js +0 -0
  290. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/protocol/help.js +0 -0
  291. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/protocol/help.txt +0 -0
  292. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/protocol/list.js +0 -0
  293. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/protocol/set.js +0 -0
  294. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/add.js +0 -0
  295. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/help.js +0 -0
  296. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/help.txt +0 -0
  297. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/link-local.js +0 -0
  298. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/link-production.js +0 -0
  299. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/list.js +0 -0
  300. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/remove.js +0 -0
  301. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/rm.js +0 -0
  302. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/scope/use.js +0 -0
  303. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/service/help.js +0 -0
  304. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/service/help.txt +0 -0
  305. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/service/list.js +0 -0
  306. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cmd/view/add.js +0 -0
  307. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/collection/README.md +0 -0
  308. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/collection/build.json +0 -0
  309. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/collection/package.json +0 -0
  310. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/collection/src/main.js +0 -0
  311. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/config.js +0 -0
  312. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cron/README.md +0 -0
  313. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cron/package.json +0 -0
  314. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/cron/src/main.js +0 -0
  315. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/domain/LICENSE +0 -0
  316. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/domain/README.md +0 -0
  317. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/domain/package.json +0 -0
  318. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/domain/src/main.js +0 -0
  319. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/generator/index.js +0 -0
  320. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/index.js +0 -0
  321. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/inherits/LICENSE +0 -0
  322. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/inherits/README.md +0 -0
  323. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/inherits/package.json +0 -0
  324. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/inherits/src/main.js +0 -0
  325. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/inspector-redact/package.json +0 -0
  326. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/inspector-redact/src/main.js +0 -0
  327. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/README.md +0 -0
  328. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/package.json +0 -0
  329. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/containers/default/index.js +0 -0
  330. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/containers/file/index.js +0 -0
  331. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  332. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  333. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/containers/mq/index.js +0 -0
  334. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/containers/mq/listener.js +0 -0
  335. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/containers/mq/speaker.js +0 -0
  336. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/logger/src/helper.js +0 -0
  337. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/mcp-dispatch/package.json +0 -0
  338. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/mcp-dispatch/src/main.js +0 -0
  339. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/mcp-http/package.json +0 -0
  340. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/mcp-http/src/main.js +0 -0
  341. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/mcp-server/package.json +0 -0
  342. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/mcp-server/src/main.js +0 -0
  343. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/merge/README.md +0 -0
  344. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/merge/package.json +0 -0
  345. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/merge/src/main.js +0 -0
  346. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/model.js +0 -0
  347. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/nunjucks-filters/README.md +0 -0
  348. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/nunjucks-filters/package.json +0 -0
  349. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/nunjucks-filters/src/main.js +0 -0
  350. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/nunjucks-resolver/package.json +0 -0
  351. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/nunjucks-resolver/src/main.js +0 -0
  352. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/proc.js +0 -0
  353. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/routing/README.md +0 -0
  354. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/routing/build.json +0 -0
  355. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/routing/package.json +0 -0
  356. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/routing/src/main.js +0 -0
  357. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/routing/src/radix.js +0 -0
  358. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/routing-introspect/package.json +0 -0
  359. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/routing-introspect/src/main.js +0 -0
  360. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/session-store.js +0 -0
  361. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/shell.js +0 -0
  362. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/state.js +0 -0
  363. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/swig-filters/README.md +0 -0
  364. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/swig-filters/package.json +0 -0
  365. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/swig-filters/src/main.js +0 -0
  366. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/swig-resolver/package.json +0 -0
  367. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/swig-resolver/src/main.js +0 -0
  368. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/url/README.md +0 -0
  369. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/url/index.js +0 -0
  370. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/url/routing.json +0 -0
  371. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/uuid/package.json +0 -0
  372. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/uuid/src/main.js +0 -0
  373. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/validator.js +0 -0
  374. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/watcher/package.json +0 -0
  375. /package/framework/{v0.3.7-alpha.3 → v0.3.7-alpha.4}/lib/watcher/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ 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.7-alpha.4 - 2026-04-23 (npm only — no git tag)
10
+ ### Added
11
+ * Static HTML cache writes on the nunjucks render path (#NJ3) — bundles running `render.engine: "nunjucks"` now get the same `memory`/`fs` cache behaviour swig has shipped for years. A route declaring `"cache": { "type": "memory", "ttl": 300 }` (or the `"fs"` variant) is served from the shared server store on subsequent hits without re-entering the controller; the same `static:<bundle>:<url>` key-space + visibility/sliding-window/invalidateOnEvents controls apply. Cache writes run after asset + Inspector injection so the bytes on disk/in memory match what the client sees; the miss-path `Cache-Control: private, max-age=N` header is committed on the same response. Opt-in via your routing rule — there is no new setting to toggle.
12
+ * 103 Early Hints auto-send now works for bundles running `render.engine: "nunjucks"` (#NJ4). HTTP/2 non-dev requests to nunjucks bundles get automatic `Link: ...; rel=preload` hints for the bundle's CSS and JS assets, delivered as a 103 Early Hints informational response before the HTML body. Identical behaviour to swig — the firing point in `controller.js this.render()` is engine-agnostic and the data-feed was closed by #NJ2 (`deps.setResources` runs on both delegates, populating `h2Links` via the same `getNodeRes` path). Closes the final item in the four-session nunjucks parity track (#NJ1 filters / #NJ2 setResources & assets / #NJ3 static HTML cache / #NJ4 Early Hints) — nunjucks bundles now have full feature parity with swig.
13
+ ### Security
14
+ * Removed three server-side `eval` / `new Function` call sites (#SCS1). `core/server.js` built a static-path regex via `eval('/^…/')` and now uses `new RegExp`. `lib/logger/src/main.js` generated per-level logger methods via `new Function(...)` string concatenation and now uses a closure factory. `lib/math/index.js` `operate()` wrapped `new Function('return '+ expr)()` and is now a shunting-yard evaluator supporting `+ - * / %`, parentheses, decimals, and unary sign; any non-arithmetic character throws. Public contract unchanged — the expressions `math.operate` accepts are the same as before, but it now rejects arbitrary JS beyond pure arithmetic instead of silently executing it.
15
+ * Replaced the four `eval('async function on<Name>...')` async-chain scaffolding sites (#SCS1b) with direct `promisify` + `try`/`await`/`catch` IIFEs. Affected files: `lib/cmd/framework/build.js`, `lib/cmd/framework/init.js`, `script/pre_install.js`, `script/post_install.js`. Semantics unchanged — each step is still promisified, awaited, and error-exits via `console.error` + `process.exit(1)` before recursing to the next step. Old eval lines kept as comments with the `#SCS1b` tag per the replace-don't-delete convention.
16
+
9
17
  ## 0.3.7-alpha.3 - 2026-04-23 (npm only — no git tag)
10
18
  ### Added
11
19
  * The nunjucks render path now registers Gina's built-in filter registry automatically. Bundles with `render.engine: "nunjucks"` get the same 7 filters as the swig path — `getUrl`, `getWebroot`, `length`, `nl2br`, `addHours`, `addDays`, `addYears` — with no manual `env.addFilter()` calls needed. Templates can use `{{ 'home' | getUrl }}`, `{{ body | nl2br | safe }}`, or date helpers out of the box. User-registered filters on top (`env.addFilter('upper', fn)`) coexist with the built-in registry. Closes the most user-visible gap left by the 0.3.7-alpha.2 nunjucks MVP.
@@ -0,0 +1 @@
1
+ 0.3.7-alpha.4
@@ -55,11 +55,28 @@
55
55
  * recursing via `self.throwError` — recursion would re-enter this same
56
56
  * branch and could loop. The defensive `localOptions.isRenderingCustomError
57
57
  * = false` reset after render mirrors render-swig.js lines 804, 1434.
58
- * 4. **Early Hints 103** auto-send — lives in `controller.js this.render()`
59
- * before the delegate runs, so the port is controller-level rather than
60
- * render-nunjucks-level.
61
- * 5. **Static HTML cache writes** no `writeCache()` equivalent; every
62
- * request re-renders even when the route has `cache` configured.
58
+ * 4. ~~**Early Hints 103** auto-send~~**shipped 2026-04-23** (#NJ4).
59
+ * The #EH1 firing point in `controller.js this.render()` is already
60
+ * engine-agnostic — it reads `local.options.template.h2Links` and calls
61
+ * `self.setEarlyHints(_hints)` BEFORE the delegate dispatch, so both
62
+ * swig and nunjucks bundles reach it identically. The data-feed was
63
+ * closed by #NJ2: `deps.setResources(localTemplateConf)` is called below
64
+ * (same function object defined once in `controller.js:782` and passed
65
+ * to both delegates via `deps`), and `setResources` → `getNodeRes`
66
+ * writes to `local.options.template.h2Links` at `controller.js:901`
67
+ * (CSS) / `:930` (JS) on HTTP/2 non-dev requests. No nunjucks-specific
68
+ * h2Links logic is needed — a negative-invariant test locks that in.
69
+ * 5. ~~**Static HTML cache writes**~~ — **shipped 2026-04-23** (#NJ3).
70
+ * `writeCache(bundle, opt, htmlContent)` is a direct port of
71
+ * `render-swig.js:35-129` (same guards, cache-key shape, memory/fs
72
+ * dispatch, sliding-window support, invalidateOnEvents hook). It runs
73
+ * after `injectAssets` + `injectInspectorScripts` so the cached bytes
74
+ * match what the client sees, and BEFORE `sendHtmlResponse` so the
75
+ * miss-path `Cache-Control: private, max-age=N` header is committed
76
+ * alongside the response. Reads are engine-agnostic already — the
77
+ * server-layer read path at `server.isaac.js:1012-1067` keys on
78
+ * `static:${bundle}:${url}` regardless of which engine populated the
79
+ * entry, so no read-side port was needed.
63
80
  * 6. ~~**Asset cataloguing / `setResources`**~~ — **shipped 2026-04-23** (#NJ2).
64
81
  * `deps.setResources(localTemplateConf)` is now called before `env.render()`
65
82
  * so `data.page.view.stylesheets` and `data.page.view.scripts` are
@@ -111,6 +128,14 @@ var inspectorRedact = require('lib/inspector-redact');
111
128
  // the lib registry so the dev-mode hot-reload evictions of `lib/index.js`
112
129
  // don't poison the reference across requests.
113
130
  var Collection = require('../../lib').Collection;
131
+ // #NJ3 — static HTML cache writes. Module-scoped `cache` instance mirrors
132
+ // `render-swig.js:6` and `render-json.js:5`. Per-request, the main render
133
+ // function re-points it at the server's shared in-memory store (key:
134
+ // `static:<bundle>:<url>`). The server-layer read path
135
+ // (`server.isaac.js:1012-1067`) is engine-agnostic, so writes from this
136
+ // delegate are served back on subsequent hits without going through the
137
+ // controller at all.
138
+ var cache = new (require('../../lib').Cache)();
114
139
 
115
140
  /**
116
141
  * Caches a `nunjucks.Environment` per bundle template root so we don't
@@ -568,6 +593,109 @@ function injectAssets(html, data, localOptions) {
568
593
  return html;
569
594
  }
570
595
 
596
+ /**
597
+ * #NJ3 — write the rendered HTML to the static-HTML cache store (memory or
598
+ * file system). No-op when caching is disabled server-side or the route has
599
+ * no `cache` setting. Direct port of `render-swig.js:35-129` — same guards,
600
+ * cache-key shape, memory/fs dispatch, sliding-window support, and
601
+ * `invalidateOnEvents` hook.
602
+ *
603
+ * The cache-key namespace (`static:<bundle>:<url>`) matches the prefix the
604
+ * server-layer read path scans in `server.isaac.js:1012-1067`, so writes
605
+ * from this function are served back on subsequent hits without reaching
606
+ * the controller at all.
607
+ *
608
+ * @inner
609
+ * @param {object} local - Per-request closure (`req`, `res`) — captured explicitly because writeCache is declared at module scope
610
+ * @param {object} self - SuperController instance (for `self.serverInstance._cacheIsEnabled` / `self.throwError`)
611
+ * @param {string} bundle - Bundle name (used as cache-key namespace)
612
+ * @param {object} opt - Server cache configuration (`opt.path`, `opt.ttl`)
613
+ * @param {string} htmlContent - Final HTML string to cache (post injectAssets + injectInspectorScripts)
614
+ * @returns {Promise<void>}
615
+ */
616
+ async function writeCache(local, self, bundle, opt, htmlContent) {
617
+ if (
618
+ typeof(local.req.routing.cache) == 'undefined'
619
+ ||
620
+ ! local.req.routing.cache
621
+ ||
622
+ String(self.serverInstance._cacheIsEnabled).toLowerCase() !== 'true'
623
+ ) {
624
+ return;
625
+ }
626
+ // Bundle namespace prevents silent collisions when two bundles serve the
627
+ // same URL path — matches render-swig.js:47 and render-json.js:40 (#C3).
628
+ var cacheKey = "static:" + bundle + ":" + local.req.originalUrl;
629
+ var responseHeaders = local.res.getHeaders() || {};
630
+ if ( !cache.has(cacheKey) ) {
631
+ // Caching kinds are: `memory` & `fs`
632
+ var cachingOption = ( typeof(local.req.routing.cache) == 'string' ) ? { type: local.req.routing.cache } : JSON.clone(local.req.routing.cache);
633
+ if ( typeof(cachingOption.ttl) == 'undefined' ) {
634
+ cachingOption.ttl = opt.ttl
635
+ }
636
+ var cacheObject = {
637
+ responseHeaders : responseHeaders
638
+ };
639
+ // Store visibility for Cache-Control header on the hit path.
640
+ // Default is 'private' — opt in to 'public' explicitly for truly static pages.
641
+ cacheObject.visibility = ( cachingOption.visibility === 'public' ) ? 'public' : 'private';
642
+ if ( cachingOption.ttl > 0) {
643
+ cacheObject.ttl = cachingOption.ttl;
644
+ }
645
+ // Sliding window (opt-in, default false).
646
+ // When true, ttl becomes the idle eviction threshold (seconds since last access)
647
+ // rather than an absolute duration from creation.
648
+ if ( cachingOption.sliding === true ) {
649
+ cacheObject.sliding = true;
650
+ }
651
+ // Absolute expiration ceiling — only meaningful when sliding is enabled.
652
+ // The entry is evicted at createdAt + maxAge regardless of access patterns.
653
+ if ( cacheObject.sliding && typeof(cachingOption.maxAge) != 'undefined' && cachingOption.maxAge > 0 ) {
654
+ cacheObject.maxAge = cachingOption.maxAge;
655
+ }
656
+ // Caching to `memory`
657
+ if ( /^memory$/i.test(cachingOption.type) ) {
658
+ cacheObject.fromMemory = true;
659
+ cacheObject.content = htmlContent;
660
+
661
+ cache.set(cacheKey, cacheObject);
662
+ }
663
+
664
+ // Caching to `fs` (file system)
665
+ if ( /^fs$/i.test(cachingOption.type) ) {
666
+ var url = local.req.originalUrl;
667
+ if ( url.endsWith('/') ) {
668
+ url += 'index'
669
+ }
670
+ var htmlFilename = _(opt.path +'/'+ bundle +'/html'+ url + '.html', true);
671
+ var htmlDir = htmlFilename.split(/\//g).slice(0, -1).join('/');
672
+ var htmlDirObj = new _(htmlDir);
673
+ if ( !htmlDirObj.existsSync() ) {
674
+ htmlDirObj.mkdirSync()
675
+ }
676
+ htmlDirObj = null;
677
+
678
+ await fs.promises.writeFile(htmlFilename, htmlContent);
679
+
680
+ cacheObject.filename = htmlFilename;
681
+
682
+ // cleanupFn: delete the cached file from disk when the entry is evicted
683
+ cache.set(cacheKey, cacheObject, function() {
684
+ try { fs.rmSync(cacheObject.filename); } catch(e) {}
685
+ });
686
+ }
687
+
688
+ // Invalidation
689
+ if ( typeof(cachingOption.invalidateOnEvents) != 'undefined' ) {
690
+ if ( !Array.isArray(cachingOption.invalidateOnEvents) ) {
691
+ return self.throwError(local.res, 500, new Error('cache.invalidateOn must be an array'));
692
+ }
693
+ // Placing event listeners
694
+ cache.setEvents(cacheKey, cachingOption.invalidateOnEvents);
695
+ }
696
+ }
697
+ }
698
+
571
699
  module.exports = async function renderNunjucks(userData, displayInspector, errOptions, deps) {
572
700
  var self = deps.self;
573
701
  var local = deps.local;
@@ -580,6 +708,12 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
580
708
  // `localOptions.template.{stylesheets,javascripts}` arrays.
581
709
  var setResources = deps.setResources;
582
710
 
711
+ // #NJ3 — point the module-level `cache` at the server's shared in-memory
712
+ // store for this request. Same pattern as render-swig.js:171 and
713
+ // render-json.js:149. A guard is unnecessary: `self.serverInstance._cached`
714
+ // is always present by the time a controller action runs.
715
+ cache.from(self.serverInstance._cached);
716
+
583
717
  // Fetch the nunjucks module from the process-cache. `get()` throws if
584
718
  // the bundle-startup load did not succeed — we surface that cleanly
585
719
  // via throwError so the usual error page pipeline handles it.
@@ -799,5 +933,44 @@ module.exports = async function renderNunjucks(userData, displayInspector, errOp
799
933
  try { console.warn('[render-nunjucks] inspector injection skipped: ' + injectErr.message); } catch (e) {}
800
934
  }
801
935
 
936
+ // #NJ3 — static HTML cache write. Must run BEFORE sendHtmlResponse so
937
+ // the cached bytes reflect the final output AND the miss-path
938
+ // Cache-Control header we set next is committed alongside the response.
939
+ // The guard mirrors render-swig.js:821-830 exactly: cacheless mode
940
+ // allowed through when `_cacheIsEnabled === 'true'` (dev-mode cache
941
+ // testing), GETs only, route must declare a `cache` block.
942
+ if (
943
+ !self.isCacheless()
944
+ && typeof(local.req.routing.cache) != 'undefined'
945
+ && local.req.method.toUpperCase() === 'GET'
946
+ ||
947
+ // allowing caching even for dev env
948
+ String(self.serverInstance._cacheIsEnabled).toLowerCase() === 'true'
949
+ && typeof(local.req.routing.cache) != 'undefined'
950
+ && local.req.method.toUpperCase() === 'GET'
951
+ ) {
952
+ try {
953
+ await writeCache(local, self, localOptions.bundle, localOptions.conf.server.cache, html);
954
+ } catch (cacheErr) {
955
+ // Cache-write failures must never break the render. The response
956
+ // still goes out; subsequent requests will retry the write on the
957
+ // next miss. Mirrors the fire-and-forget treatment in render-json.js.
958
+ try { console.error('[render-nunjucks] writeCache failed: ' + (cacheErr.message || cacheErr)); } catch (e) {}
959
+ }
960
+ }
961
+
962
+ // Cache-Control: miss path — inform browsers/CDNs of the response lifetime (#C6).
963
+ // Mirror of render-swig.js:834-841. The hit path in server.isaac.js
964
+ // re-computes its own Cache-Control header from `cachedContentObj.ttl`
965
+ // so this header is only meaningful when a client receives the
966
+ // freshly-rendered bytes.
967
+ if ( typeof(local.req.routing.cache) != 'undefined' && local.req.routing.cache ) {
968
+ var _ccCfg = ( typeof(local.req.routing.cache) == 'string' ) ? { type: local.req.routing.cache } : local.req.routing.cache;
969
+ var _ccTtl = ( typeof(_ccCfg.ttl) != 'undefined' && _ccCfg.ttl > 0 ) ? _ccCfg.ttl : localOptions.conf.server.cache.ttl;
970
+ if ( _ccTtl > 0 ) {
971
+ local.res.setHeader('Cache-Control', ( _ccCfg.visibility === 'public' ? 'public' : 'private' ) + ', max-age=' + ~~(_ccTtl));
972
+ }
973
+ }
974
+
802
975
  sendHtmlResponse(local, html);
803
976
  };
@@ -1867,7 +1867,12 @@ function Server(options) {
1867
1867
  } else {
1868
1868
  var s = 0, sLen = bundleConf.staticResources.length;
1869
1869
  for ( ; s < sLen; ++s ) {
1870
- if ( eval('/^' + bundleConf.staticResources[s].replace(/\//g,'\\/') +'/').test(pathname) ) {
1870
+ // #SCS1 (2026-04-23) — swap `eval` for `new RegExp` so Socket no longer flags the
1871
+ // server-side `Uses eval` risk here. Semantics unchanged: both
1872
+ // forms build the same regex from the (already slash-escaped)
1873
+ // `staticResources` path.
1874
+ // if ( eval('/^' + bundleConf.staticResources[s].replace(/\//g,'\\/') +'/').test(pathname) ) {
1875
+ if ( new RegExp('^' + bundleConf.staticResources[s].replace(/\//g,'\\/')).test(pathname) ) {
1871
1876
  filename = bundleConf.content.statics[ bundleConf.staticResources[s] ] +'/'+ pathname.replace(bundleConf.staticResources[s], '');
1872
1877
  break;
1873
1878
  }
@@ -56,11 +56,11 @@ function Build(opt, cmd){
56
56
  for (let t in self) {
57
57
  if ( typeof(self[t]) == 'function') {
58
58
  if (n == i){
59
- //let func = 'self.' + t + '()';
60
- let func = 'self.' + t;
61
- console.debug('Running [ ' + func + '() ]');
62
- funct = func;
63
- functName = t;
59
+ // #SCS1b (2026-04-23) hold the function reference directly instead
60
+ // of building a `'self.' + t` string for eval.
61
+ functName = t;
62
+ funct = self[t];
63
+ console.debug('Running [ self.' + functName + '() ]');
64
64
  break;
65
65
  }
66
66
  n++;
@@ -69,7 +69,24 @@ function Build(opt, cmd){
69
69
 
70
70
  // to handle sync vs async to allow execution in order of declaration
71
71
  if (funct) {
72
- eval('async function on'+functName+'(){ await promisify('+ funct + ')().catch(function(e){ console.error(e.toString()); process.exit(1);}).then(function(){ begin('+(i+1)+')});}; on'+functName+'();');// jshint ignore:line
72
+ // #SCS1b (2026-04-23) replaced `eval('async function on<Name>...')` chain
73
+ // scaffolding with a direct promisify + try/await/catch
74
+ // so Socket no longer flags `Uses eval`. Semantics
75
+ // unchanged: promisify → await → error ⇒ console.error
76
+ // + process.exit(1) → recurse to begin(i+1). The
77
+ // per-function `on<Name>` stack-label is lost; functName
78
+ // is logged above instead.
79
+ // eval('async function on'+functName+'(){ await promisify('+ funct + ')().catch(function(e){ console.error(e.toString()); process.exit(1);}).then(function(){ begin('+(i+1)+')});}; on'+functName+'();');// jshint ignore:line
80
+ (async function() {
81
+ try {
82
+ await promisify(funct)();
83
+ } catch (e) {
84
+ console.error(e.toString());
85
+ process.exit(1);
86
+ return;
87
+ }
88
+ begin(i + 1);
89
+ })();
73
90
  } else {
74
91
  end();
75
92
  }
@@ -84,11 +84,11 @@ function Initialize(opt) {
84
84
  for (let t in self) {
85
85
  if ( typeof(self[t]) == 'function') {
86
86
  if (n == i) {
87
- //let func = 'self.' + t + '()';
88
- let func = 'self.' + t;
89
- console.debug('Running [ ' + func + '() ]');
90
- funct = func;
91
- functName = t;
87
+ // #SCS1b (2026-04-23) hold the function reference directly instead
88
+ // of building a `'self.' + t` string for eval.
89
+ functName = t;
90
+ funct = self[t];
91
+ console.debug('Running [ self.' + functName + '() ]');
92
92
  break;
93
93
  }
94
94
  n++;
@@ -97,7 +97,24 @@ function Initialize(opt) {
97
97
 
98
98
  // to handle sync vs async to allow execution in order of declaration
99
99
  if (funct) {
100
- eval('async function on'+functName+'(){ await promisify('+ funct + ')().catch(function(e){ console.error(e.toString()); process.exit(1);}).then(function(){ begin('+(i+1)+')});}; on'+functName+'();'); // jshint ignore:line
100
+ // #SCS1b (2026-04-23) replaced `eval('async function on<Name>...')` chain
101
+ // scaffolding with a direct promisify + try/await/catch
102
+ // so Socket no longer flags `Uses eval`. Semantics
103
+ // unchanged: promisify → await → error ⇒ console.error
104
+ // + process.exit(1) → recurse to begin(i+1). The
105
+ // per-function `on<Name>` stack-label is lost; functName
106
+ // is logged above instead.
107
+ // eval('async function on'+functName+'(){ await promisify('+ funct + ')().catch(function(e){ console.error(e.toString()); process.exit(1);}).then(function(){ begin('+(i+1)+')});}; on'+functName+'();'); // jshint ignore:line
108
+ (async function() {
109
+ try {
110
+ await promisify(funct)();
111
+ } catch (e) {
112
+ console.error(e.toString());
113
+ process.exit(1);
114
+ return;
115
+ }
116
+ begin(i + 1);
117
+ })();
101
118
  } else if ( i == self.functionCount() ) {
102
119
  e.emit('init#complete', false, run, self.opt);
103
120
  }
@@ -521,8 +521,18 @@ function Logger() {
521
521
  }
522
522
 
523
523
  for (let l in loggerOptions.levels) {
524
+ // #SCS1 (2026-04-23) — replaced `new Function(...)` dynamic method build with a
525
+ // closure factory so Socket no longer flags `Uses eval` on
526
+ // the server side. `write`, `parse`, `emit` are now captured
527
+ // by reference (they were previously stringified via
528
+ // `toString()` and embedded as literals into the generated
529
+ // function body). `setDefaultLevels` is called fresh on every
530
+ // `setLevel`, so methods still reflect the latest options.
524
531
  // override if existing
525
- logger[l] = new Function('return '+ write +'('+ JSON.stringify(loggerOptions) +', '+ parse +', "'+ l +'", arguments, '+ emit +');');// jshint ignore:line
532
+ // logger[l] = new Function('return '+ write +'('+ JSON.stringify(loggerOptions) +', '+ parse +', "'+ l +'", arguments, '+ emit +');');// jshint ignore:line
533
+ logger[l] = function() {
534
+ return write(loggerOptions, parse, l, arguments, emit);
535
+ };
526
536
  }
527
537
 
528
538
  } catch (err) {
@@ -36,7 +36,11 @@ function MathHelper() {
36
36
  // }
37
37
 
38
38
  /**
39
- * Operate from a string value
39
+ * Operate from a string value.
40
+ *
41
+ * Evaluates an arithmetic expression without using `eval` or `new Function`:
42
+ * supported operators are `+`, `-`, `*`, `/`, `%`, parentheses, decimals,
43
+ * and unary `+` / `-`. Any non-arithmetic character throws.
40
44
  *
41
45
  * e.g.:
42
46
  *
@@ -45,12 +49,92 @@ function MathHelper() {
45
49
  * var result = operate(computation);
46
50
  * => 20
47
51
  *
48
- * @param {string} calcultation
52
+ * @param {string} computation
49
53
  *
50
54
  * @returns {number} result
55
+ * @throws {Error} when the expression contains an invalid character or is malformed
51
56
  * */
57
+ // #SCS1 (2026-04-23) — replaced `new Function('return '+ computation)()` with a shunting-yard
58
+ // evaluator so Socket no longer flags `Uses eval` here. Same public
59
+ // contract (string expression → number); now rejects any non-arithmetic
60
+ // character instead of silently running arbitrary JS. Old body kept for
61
+ // reference:
62
+ //
63
+ // self.operate = function(computation) {
64
+ // return new Function('return ' + computation)();
65
+ // };
52
66
  self.operate = function(computation) {
53
- return new Function('return ' + computation)();
67
+ var input = String(computation);
68
+ var output = [];
69
+ var ops = [];
70
+ var prec = { '+': 1, '-': 1, '*': 2, '/': 2, '%': 2, 'u-': 3, 'u+': 3 };
71
+ var apply = function(op) {
72
+ if (op === 'u+') { return; }
73
+ if (op === 'u-') {
74
+ if (!output.length) { throw new Error('MathHelper.operate: malformed expression'); }
75
+ output.push(-output.pop());
76
+ return;
77
+ }
78
+ var b = output.pop();
79
+ var a = output.pop();
80
+ if (typeof a === 'undefined' || typeof b === 'undefined') {
81
+ throw new Error('MathHelper.operate: malformed expression');
82
+ }
83
+ if (op === '+') { output.push(a + b); }
84
+ else if (op === '-') { output.push(a - b); }
85
+ else if (op === '*') { output.push(a * b); }
86
+ else if (op === '/') { output.push(a / b); }
87
+ else if (op === '%') { output.push(a % b); }
88
+ };
89
+
90
+ var prev = 'op';
91
+ var i = 0;
92
+ while (i < input.length) {
93
+ var c = input[i];
94
+ if (/\s/.test(c)) { ++i; continue; }
95
+ if (/\d/.test(c) || (c === '.' && /\d/.test(input[i + 1]))) {
96
+ var num = '';
97
+ var hasDot = false;
98
+ while (i < input.length && /[\d.]/.test(input[i])) {
99
+ if (input[i] === '.') {
100
+ if (hasDot) { throw new Error('MathHelper.operate: invalid number literal'); }
101
+ hasDot = true;
102
+ }
103
+ num += input[i++];
104
+ }
105
+ output.push(parseFloat(num));
106
+ prev = 'num';
107
+ continue;
108
+ }
109
+ if (c === '(') { ops.push(c); prev = 'op'; ++i; continue; }
110
+ if (c === ')') {
111
+ while (ops.length && ops[ops.length - 1] !== '(') { apply(ops.pop()); }
112
+ if (!ops.length) { throw new Error('MathHelper.operate: mismatched parenthesis'); }
113
+ ops.pop();
114
+ prev = 'num';
115
+ ++i;
116
+ continue;
117
+ }
118
+ if (/[+\-*/%]/.test(c)) {
119
+ var op = c;
120
+ if ((op === '-' || op === '+') && prev === 'op') { op = 'u' + op; }
121
+ while (ops.length && ops[ops.length - 1] !== '(' && prec[ops[ops.length - 1]] >= prec[op]) {
122
+ apply(ops.pop());
123
+ }
124
+ ops.push(op);
125
+ prev = 'op';
126
+ ++i;
127
+ continue;
128
+ }
129
+ throw new Error('MathHelper.operate: invalid character `' + c + '`');
130
+ }
131
+ while (ops.length) {
132
+ var tail = ops.pop();
133
+ if (tail === '(') { throw new Error('MathHelper.operate: mismatched parenthesis'); }
134
+ apply(tail);
135
+ }
136
+ if (output.length !== 1) { throw new Error('MathHelper.operate: malformed expression'); }
137
+ return output[0];
54
138
  };
55
139
 
56
140
  /**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina-framework",
3
- "version": "0.3.7-alpha.3",
3
+ "version": "0.3.7-alpha.4",
4
4
  "dependencies": {
5
5
  "@rhinostone/swig": "^1.6.0",
6
6
  "psl": "^1.15.0"
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.7-alpha.3/core/gna');
18
+ var _gna = require('./framework/v0.3.7-alpha.4/core/gna');
19
19
 
20
20
  // SuperController and EntitySuper — loaded from their source modules
21
- var SuperController = require('./framework/v0.3.7-alpha.3/core/controller');
22
- var EntitySuper = require('./framework/v0.3.7-alpha.3/core/model/entity');
21
+ var SuperController = require('./framework/v0.3.7-alpha.4/core/controller');
22
+ var EntitySuper = require('./framework/v0.3.7-alpha.4/core/model/entity');
23
23
 
24
24
  // uuid — from the lib registry
25
- var uuid = require('./framework/v0.3.7-alpha.3/lib/uuid');
25
+ var uuid = require('./framework/v0.3.7-alpha.4/lib/uuid');
26
26
 
27
27
  module.exports = {
28
28
 
package/llms.txt CHANGED
@@ -817,7 +817,7 @@ Dev-mode query instrumentation captures every database query tied to the current
817
817
 
818
818
  66. **changie body strings — single-quote by default and escape `'` as `''`** — six `.changes/unreleased/*.yaml` files written across four separate sessions in April 2026 broke YAML parsing in two distinct ways, one loud and one silent. Loud: a quoted body without a closing `'` before the newline fails with `unexpected end of stream`; an unescaped literal `'` inside a quoted body closes the scalar early and the rest of the file parses as garbage (`did not find expected key`, `mapping values are not allowed`). Silent and worse: an unquoted body containing ` #` (space + hash) — YAML treats that as a comment marker, so `(#M8 / #AI3)` was stored as just `(#M8 /` and the rest of the sentence disappeared from the rendered changelog entirely; likewise an unquoted body with `:` at any depth breaks as a mapping. Cleaned up in commit `ca64f0735` (2026-04-22) — `Added-20260417-200100.yaml`, `Added-20260417-203000.yaml`, `Fixed-20260416-183051.yaml`, `Added-20260422-022257.yaml`, `Added-20260422-023136.yaml`, `Added-20260422-024132.yaml`. Author rule: every new changie entry uses `body: '...'` (single-quoted) even when the text looks "clean"; every literal `'` inside becomes `''`; never leave a body unquoted. Verification is now automatic: `.githooks/pre-commit` runs `script/check_changie_entries.js` against every staged `.changes/unreleased/*.yaml` file and refuses the commit when any body is unquoted, uses an unescaped literal `''` inside a single-quoted scalar, or fails to terminate before the `time:` key (commit `acbf91dd0`, 2026-04-22). The script is also callable standalone (`node script/check_changie_entries.js .changes/unreleased/*.yaml`) for CI use or on-demand audits. Pre-existing unquoted entries on disk are grandfathered until someone edits them — the hook only runs on staged AM files. The on-demand `changie batch --dry-run patch` still works for a visual sanity check of the rendered markdown.
819
819
 
820
- 67. **`lib/nunjucks-resolver` + `settings.render.engine` — opt-in nunjucks without a framework dep** — nunjucks is **never** declared in `framework/v*/package.json`; the resolver only looks in `<projectPath>/node_modules/nunjucks/`. Three-layer dispatch: (a) `schema/settings.json > render.engine` defaults to `"swig"`; set to `"nunjucks"` to opt in. (b) `server.js` `initNunjucksEngine(conf)` runs alongside `initSwigEngine` during bundle init when `hasViews()` is true — if `render.engine === 'nunjucks'`, it calls `nunjucksResolver.load(self.executionPath, settings.nunjucks)` which throws `NUNJUCKS_NOT_INSTALLED` when the project has not `npm install`ed the package (bundle startup fails loud, not mid-render). (c) `controller.js` `this.render()` reads `local.options.conf.content.settings.render.engine` and dispatches to either `controller.render-swig.js` (default) or `controller.render-nunjucks.js`; both delegates receive the same `deps` object (`self`, `local`, `getData`, `hasViews`, `headersSent`, etc.), `render-nunjucks.js` fetches the engine via `lib.nunjucksResolver.get()` so the `swig`/`SwigFilters` deps are harmless when unused. Environment caching: `new nunjucks.Environment(loader, ...)` is cached per template root on `process.gina._nunjucksEnvs` and invalidated via `process.gina._nunjucksEnvsOwner` whenever the underlying nunjucks module itself is hot-swapped (dev-mode mtime drift on the project''s `package.json`). Dev-mode also sets `FileSystemLoader({ noCache: true })` so `.njk` template edits take effect on the next request. **Deferred relative to render-swig.js** — documented inline so nothing is hidden: (1) ~~Inspector `__gdPayload`~~ **shipped 2026-04-22** (commit `7aef191ac`) — `<script>window.__ginaData</script>` + `<script>window.__ginaLogs</script>` injected before `</body>` in dev mode via `injectInspectorScripts`, redacted through `lib/inspector-redact`, stashed on `serverInstance._lastGinaData` (+ `_lastGinaDataUnredacted` on local scope), emitted via `process.emit('inspector#data')`, wrapped in try/catch so Inspector bugs never break the page render. Within the Inspector port, three sub-items remain deferred: `statusbar.html` include (swig-templated), `data.page.flow` pipeline from `local._timeline`, `data.page.queries` from `local._queryLog`. (2) ~~HTTP/2 `stream.respond()` direct path~~ **shipped 2026-04-22** (commit `6b11fc6dc`) — `sendHtmlResponse` implements the four-way branch from `class.controller.md §7b` (HEAD×stream, HEAD×HTTP1.1, body×stream, body×HTTP1.1) with the `stream.destroyed || stream.closed` disconnect guard, pipeline-header merge via `local.res.getHeaders()`, and `local.res.headersSent = true` flag. (3) ~~Error-page template routing~~ **shipped 2026-04-22** — when `controller.js renderCustomError()` injects `errOptions.file = <absolute path>` from `bundleConf.content.templates._common.errorFiles[code]`, `render-nunjucks.js` now detects `localOptions.isRenderingCustomError === true`, reads the file via `fs.readFileSync`, and renders it with `env.renderString(source, data)`. `env.renderString` bypasses the `FileSystemLoader` (which rejects absolute paths and cannot reach shared-path error templates outside the bundle root). **Never recurses via `self.throwError`** — every failure mode (missing file, read error, render error) falls back to a minimal inline HTML body served through `sendHtmlResponse`, because a `throwError` call would re-enter this same branch and could loop infinitely. Defensive `localOptions.isRenderingCustomError = false` reset after render mirrors `render-swig.js` lines 804 and 1434. +14 source-inspection tests in `test/lib/render-engine-dispatch.test.js` (78 total in the dispatch suite, 116 total across the nunjucks track, full suite 3326 → 3340 green). (4) Early Hints 103 auto-send — still deferred (lives in `controller.js this.render()` before the delegate is called). (5) static HTML cache writes, (6) `setResources` asset injection / `<gina>` layout placeholders, (7) Gina `SwigFilters` equivalents — users register their own filters via `env.addFilter()`. Negative invariants locked by source-inspection tests in `test/lib/render-engine-dispatch.test.js`: framework `package.json` must never declare nunjucks; `render-nunjucks.js` must never `require("nunjucks")` directly (always through the resolver); dispatch default must stay `"swig"`; the `isRenderingCustomError` branch must never call `self.throwError` (would loop). Nunjucks contrast vs swig-resolver: no framework fallback (different contract — `get()` throws instead of returning a framework copy), no version floor (any installed version accepted), same mtime hot-swap mechanism. Precedent: `63e7e569f` (N1 resolver primitive), `0980a00b7` (N2 dispatch + render-nunjucks.js MVP), `7aef191ac` (Inspector `__gdPayload` port), `6b11fc6dc` (HTTP/2 stream.respond four-way branch), and the error-page template-routing port (this commit), 2026-04-22.
820
+ 67. **`lib/nunjucks-resolver` + `settings.render.engine` — opt-in nunjucks without a framework dep** — nunjucks is **never** declared in `framework/v*/package.json`; the resolver only looks in `<projectPath>/node_modules/nunjucks/`. Three-layer dispatch: (a) `schema/settings.json > render.engine` defaults to `"swig"`; set to `"nunjucks"` to opt in. (b) `server.js` `initNunjucksEngine(conf)` runs alongside `initSwigEngine` during bundle init when `hasViews()` is true — if `render.engine === 'nunjucks'`, it calls `nunjucksResolver.load(self.executionPath, settings.nunjucks)` which throws `NUNJUCKS_NOT_INSTALLED` when the project has not `npm install`ed the package (bundle startup fails loud, not mid-render). (c) `controller.js` `this.render()` reads `local.options.conf.content.settings.render.engine` and dispatches to either `controller.render-swig.js` (default) or `controller.render-nunjucks.js`; both delegates receive the same `deps` object (`self`, `local`, `getData`, `hasViews`, `headersSent`, etc.), `render-nunjucks.js` fetches the engine via `lib.nunjucksResolver.get()` so the `swig`/`SwigFilters` deps are harmless when unused. Environment caching: `new nunjucks.Environment(loader, ...)` is cached per template root on `process.gina._nunjucksEnvs` and invalidated via `process.gina._nunjucksEnvsOwner` whenever the underlying nunjucks module itself is hot-swapped (dev-mode mtime drift on the project''s `package.json`). Dev-mode also sets `FileSystemLoader({ noCache: true })` so `.njk` template edits take effect on the next request. **Deferred relative to render-swig.js** — documented inline so nothing is hidden: (1) ~~Inspector `__gdPayload`~~ **shipped 2026-04-22** (commit `7aef191ac`) — `<script>window.__ginaData</script>` + `<script>window.__ginaLogs</script>` injected before `</body>` in dev mode via `injectInspectorScripts`, redacted through `lib/inspector-redact`, stashed on `serverInstance._lastGinaData` (+ `_lastGinaDataUnredacted` on local scope), emitted via `process.emit('inspector#data')`, wrapped in try/catch so Inspector bugs never break the page render. Within the Inspector port, three sub-items remain deferred: `statusbar.html` include (swig-templated), `data.page.flow` pipeline from `local._timeline`, `data.page.queries` from `local._queryLog`. (2) ~~HTTP/2 `stream.respond()` direct path~~ **shipped 2026-04-22** (commit `6b11fc6dc`) — `sendHtmlResponse` implements the four-way branch from `class.controller.md §7b` (HEAD×stream, HEAD×HTTP1.1, body×stream, body×HTTP1.1) with the `stream.destroyed || stream.closed` disconnect guard, pipeline-header merge via `local.res.getHeaders()`, and `local.res.headersSent = true` flag. (3) ~~Error-page template routing~~ **shipped 2026-04-22** — when `controller.js renderCustomError()` injects `errOptions.file = <absolute path>` from `bundleConf.content.templates._common.errorFiles[code]`, `render-nunjucks.js` now detects `localOptions.isRenderingCustomError === true`, reads the file via `fs.readFileSync`, and renders it with `env.renderString(source, data)`. `env.renderString` bypasses the `FileSystemLoader` (which rejects absolute paths and cannot reach shared-path error templates outside the bundle root). **Never recurses via `self.throwError`** — every failure mode (missing file, read error, render error) falls back to a minimal inline HTML body served through `sendHtmlResponse`, because a `throwError` call would re-enter this same branch and could loop infinitely. Defensive `localOptions.isRenderingCustomError = false` reset after render mirrors `render-swig.js` lines 804 and 1434. +14 source-inspection tests in `test/lib/render-engine-dispatch.test.js` (78 total in the dispatch suite, 116 total across the nunjucks track, full suite 3326 → 3340 green). (4) ~~Early Hints 103 auto-send~~ **shipped 2026-04-23** (#NJ4) feature-complete confirmation only, no code change needed. The `#EH1` firing point at `controller.js:1034-1044` is engine-agnostic (reads `local.options.template.h2Links` and calls `self.setEarlyHints(_hints)` BEFORE the delegate dispatch); the data-feed was closed by #NJ2 because `deps.setResources` is the same function object (defined once in `controller.js:782`) passed to both delegates, and `setResources` → `getNodeRes` writes to `local.options.template.h2Links` at `controller.js:901` (CSS) / `:930` (JS) on HTTP/2 non-dev requests regardless of which delegate invoked it. Negative invariants in `test/lib/render-engine-dispatch.test.js §05f` lock in the single-source rule (no `h2Links` reads or writes anywhere in `render-nunjucks.js` module code; `#EH1` marker present only in `controller.js`). +22 source-inspection + behavioural tests (160 total in the dispatch suite, 198 across the nunjucks track; full suite 3452 → 3474). **Closes the four-session ASAP nunjucks parity track** (#NJ1 filters / #NJ2 setResources & assets / #NJ3 static HTML cache / #NJ4 Early Hints) — nunjucks bundles now have full feature parity with swig. (5) ~~static HTML cache writes~~ **shipped 2026-04-23** (#NJ3) — `writeCache(local, self, bundle, opt, htmlContent)` ported verbatim from `render-swig.js:35-129` (same guards, `static:<bundle>:<url>` key shape, memory/fs dispatch, sliding-window, `invalidateOnEvents`). Helper takes `local`/`self` explicitly because render-nunjucks.js does not hoist those into module scope the way render-swig.js does. Module-level `cache = new lib.Cache()` re-pointed per-request via `cache.from(self.serverInstance._cached)`. Call site runs AFTER `injectAssets` + `injectInspectorScripts` and BEFORE `sendHtmlResponse`; wrapped in try/catch so a cache-write failure never breaks the render. Miss-path `Cache-Control: <visibility>, max-age=N` header set in the same block. READ path is engine-agnostic already — `server.isaac.js:1012-1067` reads from `static:<bundle>:<url>` regardless of which engine populated the entry, so no read-side port was needed. +33 source-inspection + behavioural tests in `test/lib/render-engine-dispatch.test.js` §05e (138 total in the dispatch suite, 176 across the nunjucks track; full suite 3419 → 3452). Third of the four-session ASAP nunjucks parity track. (6) ~~`setResources` asset injection / `<gina>` layout placeholders~~ **shipped 2026-04-23** (#NJ2). (7) ~~Gina `SwigFilters` equivalents~~ **shipped 2026-04-23** (#NJ1) `lib/nunjucks-filters` factory mirrors the 7 public `lib/swig-filters`, registered per-request via `env.addFilter`. Negative invariants locked by source-inspection tests in `test/lib/render-engine-dispatch.test.js`: framework `package.json` must never declare nunjucks; `render-nunjucks.js` must never `require("nunjucks")` directly (always through the resolver); dispatch default must stay `"swig"`; the `isRenderingCustomError` branch must never call `self.throwError` (would loop). Nunjucks contrast vs swig-resolver: no framework fallback (different contract — `get()` throws instead of returning a framework copy), no version floor (any installed version accepted), same mtime hot-swap mechanism. Precedent: `63e7e569f` (N1 resolver primitive), `0980a00b7` (N2 dispatch + render-nunjucks.js MVP), `7aef191ac` (Inspector `__gdPayload` port), `6b11fc6dc` (HTTP/2 stream.respond four-way branch), error-page template routing (commit `07b1ea087`), `6d5ab382` (#NJ1 filters), `b2466398` (#NJ2 setResources/injectAssets), `680c2637` (#NJ3 static HTML cache), and this commit (#NJ4 Early Hints 103 — closes the four-session nunjucks parity track), 2026-04-22 / 2026-04-23.
821
821
 
822
822
  68. **Local-tool path leaks have three surfaces — commit messages, changie YAML bodies, JSDoc comments in shipped source — and their cost scales with unpushed-commit backlog** — the CLAUDE.md HARD RULE on no-local-tool-paths-on-public-surfaces names the categories (filenames, directory names, feature-description mentions) but today's pre-flight scan before pushing 23 unpushed commits surfaced three distinct contamination surfaces that each need their own scanner. Notation: `<tool-dir>` = the ignored local-tool config tree named by the existing `.githooks/pre-commit` regex `(^|/)(CLAUDE\.md|\.claude[a-z]*)`; sub-paths below use `<tool-dir>/todo/<plan>.md`, `<tool-dir>/architecture/<file>.md`, etc. (1) **commit messages / bodies** — run `git log origin/<branch>..<branch> --format='%H%n%s%n%b%n==='` then pipe through the same regex the hook uses plus `anthropic|generated by|co-[aa]uthored-[bb]y|opus [0-9]`; today caught a `Plan: <tool-dir>/todo/<plan>.md` footer in three `#AI8 Phase 2b` commits (`79ed1fec5` / `13f767cff` / `1c6d39de3`). (2) **changie YAML bodies that ship as `CHANGELOG.md` content** — `.changes/unreleased/*.yaml` `body:` strings become the published changelog on npm + GitHub + the docs site. Today caught two entries (`Changed-20260422-141823.yaml`, `Changed-20260422-161419.yaml`) referencing `<tool-dir>/architecture/<file>.md §N` anchors. Scan with the leak-scan regex against `.changes/unreleased/*.yaml` before every `changie batch`. (3) **JSDoc comments in shipped source files** — `framework/v*/**/*.js` JSDoc headers travel inside the npm-packed tarball and are publicly visible via `npm view gina@<version>` + unpacked `node_modules/gina/`. Today caught a `sendHtmlResponse` JSDoc block in `controller.render-nunjucks.js` cross-referencing an internal architecture doc. Scan the full diff (`git diff origin/<branch>...<branch> -- | grep '^+' | grep -v '^+++'` piped through the leak-scan regex) not just the latest commit. **Neutral-replacement pattern**: `<tool-dir>/todo/<plan>.md` → "the internal plan doc"; `<tool-dir>/architecture/<file>.md §N` → "the internal architecture docs" (drop the `§N` anchor — it's meaningful only to a reader with access to the file). **Allowed exceptions** (do NOT rewrite): `.githooks/pre-commit`, `script/check_no_local_leak.js`, `.gitignore`, `.npmignore`, and the `CLAUDE.md` global rule itself — these ARE the leak-scan product functionality and must name the pattern they match. **Accumulation-tax observation**: skipping `git push` after each small-batch commit turns a one-commit remediation into a 5-of-23-commit rewrite pass at release time. The "Ship more in small batches" rule's "one commit per push when feasible" half is where the tax is paid — delay one week of pushes, pay a `git filter-repo --replace-text` + force-push + CI-wait round instead of a trivial `git push`. **Remediation commands** for an unreleased feature branch with mixed leaks: `git tag backup/<branch>-<date> <branch>` → write expressions file with `literal:<path>==><neutral>` lines → `git filter-repo --replace-text <file> --refs origin/<branch>..<branch> --force` (scoped to exclusive commits so origin's published history is untouched) → re-scan → `git push --force-with-lease origin <branch>`. Alternative for small commit counts with mixed message + content changes: cherry-pick-replay onto a temp branch from the origin baseline, `git commit --amend -m '<new msg>'` or edit + `git add <file>` + `git commit --amend --no-edit` for the problematic ones, then `git branch -f <branch> temp` and force-push. Precedent: this session's docs-repo PR `gina-io/docs#8` (3 commits rewritten via cherry-pick-replay for a shared-path filename + 2 msg mentions) and the deferred gina alpha release (5 commits queued for `git filter-repo --replace-text` per the internal release plan doc), 2026-04-22.
823
823
 
@@ -846,3 +846,5 @@ YAML indent trap: the heredoc body and the `EOF` terminator must land at column
846
846
  70. **Per-request mutation of a cached `nunjucks.Environment` is safe under Node's single-threaded event loop — as long as `env.render()` stays synchronous** — when porting `lib/swig-filters` → `lib/nunjucks-filters` for the nunjucks render path (#NJ1, 2026-04-23), two of the 7 filters (`getUrl`, `getWebroot`) need per-request context (`req`, `options`, `isProxyHost`). The obvious design is: build the env once per template root (cached on `process.gina._nunjucksEnvs`), register Gina's filters on it once at startup. That fails because filters would close over stale request context. The less-obvious safe design is: **register filters on the cached env on every request, immediately before `env.render()`** — `registerGinaFilters(env, self, local, localOptions)` after env construction and before `env.render(templateRel, data)`. The singleton factory (`NunjucksFilters.instance._options`) refreshes on every call, and filter functions read from the singleton during the render pass that follows synchronously. Why it's safe: (a) `env.render()` is synchronous (no `await`, no yield); (b) Node's event loop cannot interleave request A's `addFilter → render` sequence with request B — one completes before the other can touch the env; (c) nunjucks' `addFilter` silently replaces an existing filter of the same name, which is the desired behaviour (Gina's registry is authoritative for the 7 public names). Two hard invariants preserve the safety: (1) **`env.render()` MUST remain synchronous** — if a future session adopts `env.renderAsync()` or a custom async loader that yields between addFilter and the actual template execution, another request can race in and stomp the filter table. Any async-render port MUST switch to a per-request env (no cache), not keep this pattern. (2) **User-side `env.addFilter()` calls coexist** — user filters whose names DON'T collide with Gina's 7 are preserved across the loop because Gina only iterates its own `filters` object. A user-registered filter with the same name as one of Gina's 7 loses on every request (Gina wins last). Locked by source-inspection tests in `test/lib/nunjucks-filters.test.js` — §06 "registers filters AFTER env construction but BEFORE template render" enforces the ordering via a single regex with three landmarks; §07 negative invariants guard against copy-paste mistakes (no `swig.setFilter` in runtime code, the lib itself doesn't call `env.addFilter` — that's caller-side only, which keeps the lib portable to any future template engine). Precedent: `#NJ1` (2026-04-23) — first of four sessions in the nunjucks parity ASAP track (#NJ1–#NJ4, `0.3.7` roadmap). The same design works for any sync-render template engine (eta, liquid-sync); an async-render engine would need a different caching strategy.
847
847
 
848
848
  71. **The nunjucks render path needs BOTH a pre-render `setResources()` call AND a post-render `injectAssets()` pass — the two cooperate via exact-substring user-placement detection** — when porting the swig path's asset cataloguing + `<gina>` layout placeholder system (#NJ2, 2026-04-23), the obvious design is "do it one way or the other". Both fail. Pre-render-only: `data.page.view.stylesheets` / `.scripts` are populated, but only templates that explicitly reference `{{ page.view.stylesheets | safe }}` / `{{ page.view.scripts | safe }}` get any assets — existing bundles that relied on swig's auto-injection would silently ship no stylesheets. Post-render-only: assets are injected everywhere, but templates that DO reference `{{ page.view.stylesheets | safe }}` end up with the tags twice. The working design is: (1) `setResources(localTemplateConf)` runs before `env.render()` so `data.page.view.*` are populated for opt-in templates, (2) `injectAssets(html, data, localOptions)` runs after `env.render()` and auto-injects only when the rendered HTML does NOT already contain the exact stylesheet/script string. User-placement detection is exact-substring match on the final HTML — because `getNodeRes()` emits bundle-specific URLs (hostname + port + webroot), false-positive collisions with unrelated template content are essentially zero. Four additional invariants lock the port: (1) **`injectAssets` runs BEFORE `injectInspectorScripts`** — the Inspector payload (`__ginaData` / `__ginaLogs`) must remain the last `<script>` before `</body>` for dev-mode consumers; reversing the order scatters the payload above user scripts and breaks the flow panel's tail-reading heuristic. (2) **Both `setResources` and `injectAssets` wrap their bodies in try/catch and pass the un-mutated HTML through on any error** — a mis-shaped `localTemplateConf` (common during template migration) must NOT 500 the page. Swig's equivalent mutation runs at compile-time where failures have a separate error channel; the nunjucks pass inspects the production HTML and can't afford to fail. (3) **`isWithoutLayout` filters via `Collection.find({isCommon: false}, {isCommon: true, name: 'gina'})` after `JSON.clone(localTemplateConf)`** — mirrors `render-swig.js:494-498` exactly. The OR-clause keeps private user assets AND common-gina assets, drops common-other; cloning first prevents poisoning the bundle's cached template config object across requests. (4) **HEAD / partial / bodyless templates pass through unchanged** — `injectAssets` only inserts when `</head>` / `</body>` anchors exist in the HTML; it never grows truncated markup. `javascriptsDeferEnabled` controls whether scripts go before `</head>` or before `</body>`; `javascriptsExcluded === '**'` or an already-present `window.onGinaLoaded` suppresses the ginaLoader injection — both mirror swig-side semantics. Locked by +27 source-inspection + behavioural tests in `test/lib/render-engine-dispatch.test.js` §05d (78 → 105 in file, 3419/3419 suite-wide). Precedent: `#NJ2` (2026-04-23) — second of four sessions in the nunjucks parity ASAP track (#NJ1–#NJ4, `0.3.7` roadmap).
849
+
850
+ 72. **Socket's category flags (`Uses eval`, `Network access`, `Shell access`, `Install scripts`, `Obfuscated code`) are boolean per package — one site fires the flag for the whole tarball.** Before promising to "clear" a flag in a session, enumerate ALL sites in the published tarball — not just the ones visible while reading a single file. The enumeration path: `npm view <pkg>@<ver> dist.tarball` → `curl -sSL <url> -o pkg.tgz` → `tar tzf pkg.tgz` (**never** `npm pack --dry-run` without flagging the cost first — in gina it runs `prepare_version.js` which creates a "Prerelease update" commit). Then grep the extracted file list for the offending pattern, because `.npmignore` + `files:` in `package.json` exclude/include things that greps against the working tree miss. For `Uses eval`: both `\beval\s*\(` and `new\s+Function\s*\(` surface under the same Socket category. Hiding spots in gina: (1) **load-bearing** circular-require workarounds that LOOK like dead test-time fallbacks — `merge = eval(fs.readFileSync('.../merge/src/main.js'))` in `lib/logger/src/main.js:69` + the two logger containers (`file/index.js:16`, `mq/index.js:10`) fires when `require('../../merge')` returns a partial `{}` during the circular chain `merge → helpers → logger → merge-partial`. Eval is load-bearing here because it bypasses the require cache AND relies on `JSON.clone` being defined by the time it executes (so merge's own `typeof(JSON.clone) == 'undefined'` → `require('../../../helpers')` branch is skipped, breaking the circular). Removing the fallback without a runtime probe crashes every logger-consuming test with `TypeError: merge is not a function at init (logger/src/main.js:350)` — hand-on confirmation during the #SCS1c attempt (reverted 2026-04-23). Takeaway: any `eval`/`new Function` site wearing a `// if needed for unit tests` or `// publishing hack` comment is the FIRST suspect for load-bearing status; run the suite with the site commented out before writing a removal commit. (2) install-time scripts that ship via npm lifecycle (`script/pre_install.js`, `script/post_install.js`); (3) vendored client-side code shipped as-is (`core/plugins/lib/validator/src/*`); (4) CLI helpers that chain async work via generated function bodies (`lib/cmd/framework/build.js`, `lib/cmd/framework/init.js`) — same pattern, 4 call sites (CLEARED in #SCS1b, commit `04cd05b2`, 2026-04-23 — direct `promisify` + `try/await/catch` IIFE replaces the eval'd `async function on<Name>()` chain). Count BEFORE claiming a fix will clear a flag; the inverse (claim three, find twenty-one) is a credibility cost you can't redeem mid-session. The **replace-don't-delete convention** (`// #SCS1 (YYYY-MM-DD) — <why>` + commented-out old body on the preceding lines) serves as the navigation aid for future passes: `git grep '#SCS1' framework/v*/ | grep -v '^\s*//'` returns zero hits when every in-file tag has been properly paired with a comment block. Precedent: `#SCS1` (2026-04-23, commit `03eec441`) — three server-side sites replaced (`core/server.js:1870` eval→`new RegExp`; `lib/logger/src/main.js:525` `new Function`→closure factory; `lib/math/index.js:53` `new Function`→shunting-yard evaluator with `+ - * / %`, parens, decimals, unary sign, hard-fails on any non-arithmetic character). Socket's `Uses eval` flag still fires because the 21 remaining sites did not all prove removable: #SCS1b (`04cd05b2`) cleared the 4 async-chain sites cleanly; the 3 logger-container `merge = eval(...)` sites turned out to be load-bearing circular-require workarounds (#SCS1c reverted). The remaining real-work buckets are (a) structural refactor of the `merge → helpers → logger` circular chain so the eval fallback can be deleted without breaking init-time loads, (b) a safe expression parser for `lib/collection/src/main.js:90,383` (currently eval'ing user-supplied query strings — real attack surface), and (c) a separate session for the 12 client-side `core/plugins/lib/validator/src/*` evals. Three spot fixes + one pattern refactor cleared 7 of 24 eval sites; the rest are structural.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina",
3
- "version": "0.3.7-alpha.3",
3
+ "version": "0.3.7-alpha.4",
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.7-alpha.3/core/gna",
59
+ "main": "./framework/v0.3.7-alpha.4/core/gna",
60
60
  "types": "./types/index.d.ts",
61
61
  "typesVersions": {
62
62
  "*": {