gina 0.4.1-alpha.1 → 0.4.2-alpha.1

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