gina 0.3.15-alpha.1 → 0.3.15-alpha.3

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 (444) hide show
  1. package/ROADMAP.md +24 -0
  2. package/framework/v0.3.15-alpha.3/VERSION +1 -0
  3. package/framework/v0.3.15-alpha.3/core/plugins/index.js +75 -0
  4. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/README.md +243 -0
  5. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coep/README.md +134 -0
  6. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coep/package.json +22 -0
  7. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coep/src/main.js +200 -0
  8. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coop/README.md +145 -0
  9. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coop/package.json +22 -0
  10. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/coop/src/main.js +219 -0
  11. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/corp/README.md +139 -0
  12. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/corp/package.json +22 -0
  13. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/corp/src/main.js +204 -0
  14. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/csp/README.md +201 -0
  15. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/csp/package.json +22 -0
  16. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/csp/src/main.js +461 -0
  17. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hide-powered-by/README.md +117 -0
  18. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hide-powered-by/package.json +22 -0
  19. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hide-powered-by/src/main.js +167 -0
  20. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hsts/README.md +145 -0
  21. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hsts/package.json +22 -0
  22. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/hsts/src/main.js +272 -0
  23. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/origin-agent-cluster/README.md +85 -0
  24. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/origin-agent-cluster/package.json +22 -0
  25. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +155 -0
  26. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/package.json +22 -0
  27. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/referrer-policy/README.md +98 -0
  28. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/referrer-policy/package.json +22 -0
  29. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/referrer-policy/src/main.js +200 -0
  30. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/src/main.js +340 -0
  31. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-content-type-options/README.md +65 -0
  32. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-content-type-options/package.json +22 -0
  33. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-content-type-options/src/main.js +147 -0
  34. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +104 -0
  35. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +22 -0
  36. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +193 -0
  37. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-download-options/README.md +88 -0
  38. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-download-options/package.json +22 -0
  39. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-download-options/src/main.js +161 -0
  40. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-frame-options/README.md +95 -0
  41. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-frame-options/package.json +22 -0
  42. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-frame-options/src/main.js +192 -0
  43. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +136 -0
  44. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +22 -0
  45. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +202 -0
  46. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-xss-protection/README.md +107 -0
  47. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-xss-protection/package.json +22 -0
  48. package/framework/v0.3.15-alpha.3/core/plugins/lib/security-headers/x-xss-protection/src/main.js +161 -0
  49. package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/server.isaac.js +62 -57
  50. package/framework/v0.3.15-alpha.3/core/template/boilerplate/bundle/index.js +272 -0
  51. package/framework/v0.3.15-alpha.3/core/template/conf/settings.json +420 -0
  52. package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/package.json +1 -1
  53. package/gna.js +4 -4
  54. package/llms.txt +58 -27
  55. package/package.json +2 -2
  56. package/script/check_no_local_leak.js +1 -1
  57. package/framework/v0.3.15-alpha.1/VERSION +0 -1
  58. package/framework/v0.3.15-alpha.1/core/plugins/index.js +0 -45
  59. package/framework/v0.3.15-alpha.1/core/template/boilerplate/bundle/index.js +0 -87
  60. package/framework/v0.3.15-alpha.1/core/template/conf/settings.json +0 -176
  61. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/AUTHORS +0 -0
  62. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/LICENSE +0 -0
  63. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/html/nolayout.html +0 -0
  64. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/html/static.html +0 -0
  65. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/android-chrome-192x192.png +0 -0
  66. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/android-chrome-512x512.png +0 -0
  67. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/apple-touch-icon.png +0 -0
  68. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/favicon-16x16.png +0 -0
  69. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/favicon-32x32.png +0 -0
  70. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/img/favicon.ico +0 -0
  71. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/README.md +0 -0
  72. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  73. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  74. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  75. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  76. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  77. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  78. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  79. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  80. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  81. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  82. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  83. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  84. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  85. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  86. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
  87. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  88. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  89. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  90. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  91. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  92. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  93. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/config.js +0 -0
  94. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/ai/index.js +0 -0
  95. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/ai/lib/connector.js +0 -0
  96. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/index.js +0 -0
  97. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.js +0 -0
  98. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  99. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  100. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  101. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/n1ql.js +0 -0
  102. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.js +0 -0
  103. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  104. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  105. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  106. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/index.js +0 -0
  107. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/lib/connector.js +0 -0
  108. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  109. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mongodb/lib/session-store.js +0 -0
  110. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mysql/index.js +0 -0
  111. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/mysql/lib/connector.js +0 -0
  112. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/postgresql/index.js +0 -0
  113. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/postgresql/lib/connector.js +0 -0
  114. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/redis/index.js +0 -0
  115. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/redis/lib/session-store.js +0 -0
  116. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/scylladb/index.js +0 -0
  117. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/scylladb/lib/connector.js +0 -0
  118. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/scylladb/lib/session-store.js +0 -0
  119. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sql-parser.js +0 -0
  120. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sqlite/index.js +0 -0
  121. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sqlite/lib/connector.js +0 -0
  122. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/connectors/sqlite/lib/session-store.js +0 -0
  123. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/content.encoding +0 -0
  124. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.framework.js +0 -0
  125. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.js +0 -0
  126. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-json.js +0 -0
  127. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-nunjucks.js +0 -0
  128. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-stream.js +0 -0
  129. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-swig.js +0 -0
  130. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/controller.render-v1.js +0 -0
  131. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/controller/index.js +0 -0
  132. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/LICENSE +0 -0
  133. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/README.md +0 -0
  134. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  135. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  136. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  137. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  138. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/busboy-1.6.0/package.json +0 -0
  139. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  140. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  141. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/deps/streamsearch-1.1.0/package.json +0 -0
  142. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/index.js +0 -0
  143. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/lib/class.js +0 -0
  144. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/lib/factory.js +0 -0
  145. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/dev/lib/tools.js +0 -0
  146. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/gna.js +0 -0
  147. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/README.md +0 -0
  148. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/currency.json +0 -0
  149. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/language/en.json +0 -0
  150. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/language/fr.json +0 -0
  151. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/region/en.json +0 -0
  152. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/dist/region/fr.json +0 -0
  153. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/locales/index.js +0 -0
  154. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/mime.types +0 -0
  155. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/entity.js +0 -0
  156. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/index.js +0 -0
  157. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/template/entityFactory.js +0 -0
  158. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/model/template/index.js +0 -0
  159. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/README.md +0 -0
  160. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/csrf/README.md +0 -0
  161. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/csrf/package.json +0 -0
  162. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/csrf/src/main.js +0 -0
  163. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/session/README.md +0 -0
  164. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/session/package.json +0 -0
  165. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/session/src/main.js +0 -0
  166. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/README.md +0 -0
  167. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/build.json +0 -0
  168. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/package.json +0 -0
  169. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/storage/src/main.js +0 -0
  170. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/README.md +0 -0
  171. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/build.json +0 -0
  172. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/package.json +0 -0
  173. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/src/form-validator.js +0 -0
  174. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/plugins/lib/validator/src/main.js +0 -0
  175. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/router.js +0 -0
  176. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/server.express.js +0 -0
  177. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/server.js +0 -0
  178. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/status.codes +0 -0
  179. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/_gitignore +0 -0
  180. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/app.json +0 -0
  181. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  182. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/routing.json +0 -0
  183. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/settings.json +0 -0
  184. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  185. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/templates.json +0 -0
  186. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  187. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  188. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  189. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  190. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle/locales/en.json +0 -0
  191. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  192. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  193. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  194. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  195. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  196. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  197. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  198. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/readme.md +0 -0
  199. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_public/sw.js +0 -0
  200. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  201. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  202. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  203. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  204. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  205. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/command/gina.bat.tpl +0 -0
  206. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/command/gina.tpl +0 -0
  207. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/env.json +0 -0
  208. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/manifest.json +0 -0
  209. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/package.json +0 -0
  210. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/statics.json +0 -0
  211. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/conf/templates.json +0 -0
  212. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/client/json/401.json +0 -0
  213. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/client/json/403.json +0 -0
  214. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/client/json/404.json +0 -0
  215. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/server/html/50x.html +0 -0
  216. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/server/json/500.json +0 -0
  217. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/error/server/json/503.json +0 -0
  218. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/core/template/extensions/logger/config.json +0 -0
  219. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/console.js +0 -0
  220. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/context.js +0 -0
  221. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/LICENSE +0 -0
  222. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/README.md +0 -0
  223. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/package.json +0 -0
  224. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/data/src/main.js +0 -0
  225. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/dateFormat.js +0 -0
  226. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/index.js +0 -0
  227. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/LICENSE +0 -0
  228. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/README.md +0 -0
  229. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/package.json +0 -0
  230. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/json/src/main.js +0 -0
  231. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/path.js +0 -0
  232. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/README.md +0 -0
  233. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/package.json +0 -0
  234. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/src/api-error.js +0 -0
  235. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/plugins/src/main.js +0 -0
  236. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/prototypes.js +0 -0
  237. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/task.js +0 -0
  238. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/helpers/text.js +0 -0
  239. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/README.md +0 -0
  240. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/build.json +0 -0
  241. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/package.json +0 -0
  242. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/src/dep/jszip.min.js +0 -0
  243. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/archiver/src/main.js +0 -0
  244. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/async/package.json +0 -0
  245. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/async/src/main.js +0 -0
  246. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/README.md +0 -0
  247. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/build.json +0 -0
  248. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/package.json +0 -0
  249. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cache/src/main.js +0 -0
  250. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/aliases.json +0 -0
  251. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/add.js +0 -0
  252. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/arguments.json +0 -0
  253. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/build.js +0 -0
  254. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/copy.js +0 -0
  255. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/cp.js +0 -0
  256. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/help.js +0 -0
  257. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/help.txt +0 -0
  258. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/list.js +0 -0
  259. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/mcp-start.js +0 -0
  260. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/mcp.js +0 -0
  261. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/oas.js +0 -0
  262. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/openapi.js +0 -0
  263. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/remove.js +0 -0
  264. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/rename.js +0 -0
  265. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/restart.js +0 -0
  266. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/rm.js +0 -0
  267. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/start.js +0 -0
  268. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/status.js +0 -0
  269. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/bundle/stop.js +0 -0
  270. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/cache/stats.js +0 -0
  271. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/add.js +0 -0
  272. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/arguments.json +0 -0
  273. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/help.js +0 -0
  274. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/help.txt +0 -0
  275. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/list.js +0 -0
  276. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/migrate.js +0 -0
  277. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/remove.js +0 -0
  278. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/connector/rm.js +0 -0
  279. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/add.js +0 -0
  280. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/get.js +0 -0
  281. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/help.js +0 -0
  282. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/help.txt +0 -0
  283. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/link-dev.js +0 -0
  284. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/list.js +0 -0
  285. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/remove.js +0 -0
  286. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/rm.js +0 -0
  287. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/set.js +0 -0
  288. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/unset.js +0 -0
  289. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/env/use.js +0 -0
  290. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/arguments.json +0 -0
  291. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/build.js +0 -0
  292. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/dot.js +0 -0
  293. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/get.js +0 -0
  294. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/help.js +0 -0
  295. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/help.txt +0 -0
  296. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/init.js +0 -0
  297. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/link-node-modules.js +0 -0
  298. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/link.js +0 -0
  299. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/msg.json +0 -0
  300. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/open.js +0 -0
  301. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/restart.js +0 -0
  302. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/set.js +0 -0
  303. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/start.js +0 -0
  304. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/status.js +0 -0
  305. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/stop.js +0 -0
  306. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/tail.js +0 -0
  307. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/update.js +0 -0
  308. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/framework/version.js +0 -0
  309. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/gina-dev.1.md +0 -0
  310. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/gina-framework.1.md +0 -0
  311. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/gina.1.md +0 -0
  312. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/helper.js +0 -0
  313. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/add.js +0 -0
  314. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/arguments.json +0 -0
  315. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/export.js +0 -0
  316. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/help.js +0 -0
  317. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/help.txt +0 -0
  318. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/import.js +0 -0
  319. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/i18n/scan.js +0 -0
  320. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/index.js +0 -0
  321. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/inspector/help.js +0 -0
  322. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/inspector/help.txt +0 -0
  323. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/inspector/open.js +0 -0
  324. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/minion/help.js +0 -0
  325. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/minion/help.txt +0 -0
  326. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/msg.json +0 -0
  327. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/help.js +0 -0
  328. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/help.txt +0 -0
  329. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/inc/scan.js +0 -0
  330. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/list.js +0 -0
  331. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/reset.js +0 -0
  332. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/port/set.js +0 -0
  333. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/add.js +0 -0
  334. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/arguments.json +0 -0
  335. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/build.js +0 -0
  336. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/help.js +0 -0
  337. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/help.txt +0 -0
  338. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/import.js +0 -0
  339. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/list.js +0 -0
  340. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/move.js +0 -0
  341. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/remove.js +0 -0
  342. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/rename.js +0 -0
  343. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/restart.js +0 -0
  344. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/rm.js +0 -0
  345. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/start.js +0 -0
  346. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/status.js +0 -0
  347. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/project/stop.js +0 -0
  348. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/help.js +0 -0
  349. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/help.txt +0 -0
  350. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/list.js +0 -0
  351. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/protocol/set.js +0 -0
  352. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/add.js +0 -0
  353. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/help.js +0 -0
  354. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/help.txt +0 -0
  355. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/link-local.js +0 -0
  356. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/link-production.js +0 -0
  357. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/list.js +0 -0
  358. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/remove.js +0 -0
  359. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/rm.js +0 -0
  360. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/scope/use.js +0 -0
  361. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/service/help.js +0 -0
  362. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/service/help.txt +0 -0
  363. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/service/list.js +0 -0
  364. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cmd/view/add.js +0 -0
  365. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/README.md +0 -0
  366. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/build.json +0 -0
  367. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/package.json +0 -0
  368. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/collection/src/main.js +0 -0
  369. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/config.js +0 -0
  370. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/connector-registry/package.json +0 -0
  371. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/connector-registry/src/main.js +0 -0
  372. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cron/README.md +0 -0
  373. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cron/package.json +0 -0
  374. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/cron/src/main.js +0 -0
  375. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/LICENSE +0 -0
  376. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/README.md +0 -0
  377. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/package.json +0 -0
  378. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/domain/src/main.js +0 -0
  379. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/generator/index.js +0 -0
  380. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/i18n/package.json +0 -0
  381. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/i18n/src/main.js +0 -0
  382. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/index.js +0 -0
  383. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/LICENSE +0 -0
  384. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/README.md +0 -0
  385. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/package.json +0 -0
  386. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inherits/src/main.js +0 -0
  387. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inspector-redact/package.json +0 -0
  388. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/inspector-redact/src/main.js +0 -0
  389. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/README.md +0 -0
  390. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/package.json +0 -0
  391. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/default/index.js +0 -0
  392. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/file/index.js +0 -0
  393. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  394. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  395. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/mq/index.js +0 -0
  396. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/mq/listener.js +0 -0
  397. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/containers/mq/speaker.js +0 -0
  398. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/helper.js +0 -0
  399. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/logger/src/main.js +0 -0
  400. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/math/index.js +0 -0
  401. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-dispatch/package.json +0 -0
  402. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-dispatch/src/main.js +0 -0
  403. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-http/package.json +0 -0
  404. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-http/src/main.js +0 -0
  405. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-server/package.json +0 -0
  406. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/mcp-server/src/main.js +0 -0
  407. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/merge/README.md +0 -0
  408. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/merge/package.json +0 -0
  409. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/merge/src/main.js +0 -0
  410. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/metrics/package.json +0 -0
  411. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/metrics/src/main.js +0 -0
  412. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/model.js +0 -0
  413. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-filters/README.md +0 -0
  414. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-filters/package.json +0 -0
  415. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-filters/src/main.js +0 -0
  416. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-resolver/package.json +0 -0
  417. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/nunjucks-resolver/src/main.js +0 -0
  418. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/proc.js +0 -0
  419. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/README.md +0 -0
  420. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/build.json +0 -0
  421. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/package.json +0 -0
  422. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/src/main.js +0 -0
  423. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing/src/radix.js +0 -0
  424. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing-introspect/package.json +0 -0
  425. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/routing-introspect/src/main.js +0 -0
  426. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/secrets/package.json +0 -0
  427. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/secrets/src/backends/env.js +0 -0
  428. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/secrets/src/main.js +0 -0
  429. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/session-store.js +0 -0
  430. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/shell.js +0 -0
  431. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/state.js +0 -0
  432. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-filters/README.md +0 -0
  433. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-filters/package.json +0 -0
  434. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-filters/src/main.js +0 -0
  435. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-resolver/package.json +0 -0
  436. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/swig-resolver/src/main.js +0 -0
  437. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/url/README.md +0 -0
  438. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/url/index.js +0 -0
  439. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/url/routing.json +0 -0
  440. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/uuid/package.json +0 -0
  441. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/uuid/src/main.js +0 -0
  442. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/validator.js +0 -0
  443. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/watcher/package.json +0 -0
  444. /package/framework/{v0.3.15-alpha.1 → v0.3.15-alpha.3}/lib/watcher/src/main.js +0 -0
package/ROADMAP.md CHANGED
@@ -156,6 +156,30 @@ Cross-site request forgery protection. Three-phase defense-in-depth plan aligned
156
156
 
157
157
  ---
158
158
 
159
+ ## Web Security Headers
160
+
161
+ HTTP security response headers as opt-in `gina.plugins.*` middlewares, mirroring the `Session` (#CSRF1) and `Csrf` (#CSRF2/#CSRF3) plugin shape. Each plugin is single-concern, opt-in by default-off, and reads its config from a flat top-level `settings.json` key. Native implementation — no `helmet` dependency. **Phase 1** covers the five modern critical headers (X-Content-Type-Options, X-Frame-Options, Referrer-Policy, HSTS, Origin-Agent-Cluster) — all shipped in `0.3.15-alpha`. **Phase 1.5** covers helmet-parity gap-fill (HidePoweredBy, X-DNS-Prefetch-Control, X-XSS-Protection, X-Download-Options, X-Permitted-Cross-Domain-Policies) — defense-in-depth + parity-with-helmet narrative; modest practical value. **Phase 2** (targeted at `0.4.0-alpha`) covers CSP + COEP/COOP/CORP + combined wrapper — CSP (#HDR5), COEP (#HDR6), COOP (#HDR13), CORP (#HDR14) and the `SecurityHeaders` combined wrapper (#HDR15) all shipped 2026-05-17 — **Phase 2 closed**. CORS handling is separate and already lives in `core/server.js` (request-side).
162
+
163
+ | Status | Feature | Version | Target |
164
+ | --- | --- | --- | --- |
165
+ | ✅ | **`X-Content-Type-Options: nosniff` middleware** — Opt-in plugin `gina.plugins.XContentTypeOptions()` returns an Express-compatible middleware that emits the `X-Content-Type-Options: nosniff` response header on every response (the only valid value per RFC 7034 / WHATWG Fetch Standard). Adoption is two lines: `var xContentTypeOptions = require('gina').plugins.XContentTypeOptions(); app.use(xContentTypeOptions);`. Idempotent — if an earlier middleware already set the header, the existing value is preserved (safe to stack with helmet-style upstream gates). No `enabled` flag — register to opt in, don't register to opt out. Settings template seeds `xContentTypeOptions: {}` with the block reserved for future fields (per-route opt-out, etc.); future additions do not need an API break. Establishes the per-header response-middleware shape that the rest of Phase 1 (X-Frame-Options, Referrer-Policy, HSTS, Origin-Agent-Cluster) will mirror. 33 unit tests; full suite 5467/5467. | `0.3.15-alpha` | 2026-05-17 |
166
+ | ✅ | **`X-Frame-Options` clickjacking-defense middleware** — Opt-in plugin `gina.plugins.XFrameOptions({ value })`. Settings: `xFrameOptions.value: "DENY"` or `"SAMEORIGIN"` (default `"SAMEORIGIN"`). Caller options always win over settings; values are normalised to uppercase. Validation rejects the legacy `"ALLOW-FROM"` value at factory call time with a dedicated error pointing at the modern `Content-Security-Policy: frame-ancestors` replacement (modern browsers never honoured ALLOW-FROM cross-vendor). Idempotent — first-writer-wins. 51 unit tests. | `0.3.15-alpha` | 2026-05-17 |
167
+ | ✅ | **`Referrer-Policy` middleware** — Opt-in plugin `gina.plugins.ReferrerPolicy({ value })`. Settings: `referrerPolicy.value` is one of the eight W3C tokens (`"no-referrer"`, `"no-referrer-when-downgrade"`, `"origin"`, `"origin-when-cross-origin"`, `"same-origin"`, `"strict-origin"`, `"strict-origin-when-cross-origin"`, `"unsafe-url"`). Default `"strict-origin-when-cross-origin"` matches the browser default since ~2021. Caller options always win over settings; values are normalised to lowercase per the W3C spec's case-insensitive matching. Invalid tokens throw at factory call time with the full eight-token list + W3C spec URL in the message. Idempotent — first-writer-wins. 56 unit tests. | `0.3.15-alpha` | 2026-05-17 |
168
+ | ✅ | **`Strict-Transport-Security` (HSTS) middleware** — Opt-in plugin `gina.plugins.Hsts({ maxAge, includeSubDomains, preload })`. Defaults: `maxAge: 15552000` (180 days), `includeSubDomains: false`, `preload: false`. Caller options always win over settings. Browser-parity invariant: `preload: true` requires `includeSubDomains: true` AND `maxAge >= 31536000` (1 year) per the HSTS preload-list submission requirements; factory throws at call time on invariant violations with a pointer at https://hstspreload.org/. Also throws on non-integer / negative / NaN / Infinity `maxAge`. Header value built per RFC 6797 §6.1 directive order (`max-age=<n>; includeSubDomains; preload`). Spec deviation documented: emits on every response (helmet-aligned) rather than gating HTTPS-only — receiver enforces correctly anyway per RFC 6797 §8.1. Idempotent — first-writer-wins. 69 unit tests. | `0.3.15-alpha` | 2026-05-17 |
169
+ | ✅ | **`Origin-Agent-Cluster: ?1` middleware** — Opt-in plugin `gina.plugins.OriginAgentCluster()` requests origin-keyed agent clustering — same-site cross-origin pages get isolated agents (can no longer reach in via `document.domain`), mitigating one class of Spectre side-channel attack. Per the HTML spec, `?1` (Structured Header boolean true) is the only useful value; no tunable options. Browser support: Chrome 88+, Edge 88+, Firefox 109+, Safari 15+. Mirrors the #HDR1 shape exactly. Idempotent — first-writer-wins. 33 unit tests. **Closes Phase 1 (modern critical coverage).** | `0.3.15-alpha` | 2026-05-17 |
170
+ | ✅ | **Phase 1.5 — `HidePoweredBy` (#HDR8)** — Opt-in plugin `gina.plugins.HidePoweredBy()` removes the `X-Powered-By` response header that gina emits by default at `server.js:2425` (plus `env.json > response.header`). Reduces the attacker's reconnaissance surface — they no longer learn the server stack identity from the response header. **Different SHAPE from the other HDR plugins**: REMOVE (`res.removeHeader`) not SET. No tunable options today (mirrors helmet's no-opts shape). **Two-engine pairing**: Phase 1 covers the Express engine (`server.js:2425` setHeader fires in early framework middleware before user `app.use()` mounts, so `removeHeader` succeeds). Isaac's 15 direct `response.writeHead({ 'X-Powered-By': ... })` call sites bypass the setHeader/removeHeader interface, so the middleware can't reach them on Isaac. **Phase 2 (shipped 2026-05-17) closed the Isaac gap** via the framework-level `server.hidePoweredBy: true` settings flag (default `false`) that the Isaac engine reads at boot — `_setPoweredByHeader(headers)` closure inside `onPath` wraps 14 object-literal sites + 1 inline `if (!options.hidePoweredBy)` guard at the routing.json setHeader site. Bundles pick the right shape: Express → middleware; Isaac → flag; belt-and-suspenders → both (each no-op on the other engine). Idempotent — `removeHeader` is a no-op when the header is absent. 37 unit tests. **Opens Phase 1.5 (helmet-parity gap-fill).** | `0.3.16-alpha` | 2026-05-17 |
171
+ | ✅ | **Phase 1.5 — `X-DNS-Prefetch-Control` (#HDR9)** — Opt-in plugin `gina.plugins.XDnsPrefetchControl({ value })`. Settings: `xDnsPrefetchControl.value` is one of two tokens (`"on"`, `"off"`); default `"off"` matches helmet (privacy-respecting choice — browser does not pre-resolve DNS for unclicked links, so the resolver only sees hostnames the user actually navigates to). **API-shape divergence from helmet**: helmet uses `{ allow: boolean }`; gina uses `{ value: 'on' \| 'off' }` matching the existing single-token-enum convention (HDR2 / HDR3 / HDR6 / HDR13 / HDR14). README documents the helmet-to-gina mapping for migrators. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR14 Corp single-enum plugin shape exactly (`resolveSettingsDefaults` + `mergeOptions` + `resolveValue` throw-on-invalid + idempotent first-writer-wins middleware via `res.getHeader`). Marginal practical value in 2026 — modern Chrome / Firefox have their own DNS-prefetch heuristics that mostly ignore the header; defense-in-depth + helmet-parity narrative. 57 unit tests including a negative-invariant lock on the helmet-shape `{ allow: true }` silent-fallback (it does NOT enable DNS prefetching in gina — emits default `off`). | `0.3.16-alpha` | 2026-05-17 |
172
+ | ✅ | **Phase 1.5 — `X-XSS-Protection: 0` (#HDR10)** — Opt-in plugin `gina.plugins.XXssProtection()` emits the literal header `X-XSS-Protection: 0` to DISABLE Chrome's legacy XSS auditor (the auditor itself had its own vulnerabilities; disabling is the modern recommendation per MDN). **The value `0` is deliberate — not a typo**: HEADER_VALUE is the literal string `"0"`, with a negative-invariant test pinning that the value is NOT any `"1"` enable variant. No tunable options (mirrors helmet's no-opts shape + the #HDR1 XContentTypeOptions plugin shape). Use #HDR5 Csp with a strong policy for the actual XSS defense; this header is defense-in-depth + helmet-parity narrative only. Browser status in 2026: Chrome dropped the auditor in v78 (2019); Edge follows Chrome; Firefox / Safari never implemented; IE11 honoured but is EOL. Idempotent — first-writer-wins via `res.getHeader`; if an upstream middleware accidentally emits the unsafe `"1; mode=block"`, this plugin does NOT override it (mount BEFORE the upstream to win). Mirrors the #HDR1 XContentTypeOptions plugin shape (no opts, single fixed value, same `resolveSettingsDefaults` + `mergeOptions` helpers). 37 unit tests including the negative-invariant lock on no-"1"-variant + the string-not-number "0" emission lock. | `0.3.16-alpha` | 2026-05-17 |
173
+ | ✅ | **Phase 1.5 — `X-Download-Options: noopen` (#HDR11)** — Opt-in plugin `gina.plugins.XDownloadOptions()` emits the literal header `X-Download-Options: noopen` on every response. IE-legacy: prevents IE8+ from opening downloads in the site's security context (an old IE vulnerability shape where the "Open" button on a download dialog opened the file in the SITE's origin, allowing XSS-equivalent via downloaded HTML from a trusted site). `noopen` is the only valid value per MSDN. No tunable options (mirrors helmet's no-opts shape + the #HDR1 / #HDR10 plugin shape). Modern browsers (Chrome / Firefox / Safari / Edge) ignore the header silently; only IE10 / IE11 honour it (both EOL since June 2022). Effectively no-op in modern browsers; defense-in-depth + helmet-parity narrative. Idempotent — first-writer-wins via `res.getHeader`. Mirrors the #HDR1 XContentTypeOptions plugin shape exactly. 35 unit tests. | `0.3.16-alpha` | 2026-05-17 |
174
+ | ✅ | **Phase 1.5 — `X-Permitted-Cross-Domain-Policies` (#HDR12)** — Opt-in plugin `gina.plugins.XPermittedCrossDomainPolicies({ value })` emits the `X-Permitted-Cross-Domain-Policies` response header on every response. Settings: `xPermittedCrossDomainPolicies.value` is one of four Adobe spec tokens (`"none"`, `"master-only"`, `"by-content-type"`, `"all"`); default `"none"` matches helmet (most restrictive — no Flash/PDF cross-domain policy files honoured). **API-shape divergence from helmet**: helmet uses `{ permittedPolicies: <enum> }`; gina uses `{ value: <enum> }` matching the existing single-token-enum convention (HDR2 / HDR3 / HDR6 / HDR9 / HDR13 / HDR14). README documents the helmet-to-gina mapping. Mirrors the #HDR14 Corp single-enum plugin shape exactly (`resolveSettingsDefaults` + `mergeOptions` + `resolveValue` throw-on-invalid + idempotent first-writer-wins via `res.getHeader`). Flash EOL since December 2020; Adobe Reader historically honoured the header but most modern PDF readers ignore it; defense-in-depth + helmet-parity narrative. 60 unit tests including a negative-invariant lock on the helmet-shape `{ permittedPolicies }` silent-fallback (it does NOT switch the gina default — emits default `"none"`). **Closes Phase 1.5.** | `0.3.16-alpha` | 2026-05-17 |
175
+ | ✅ | **`Content-Security-Policy` middleware (Phase 2 — static directives)** — Opt-in plugin `gina.plugins.Csp({ directives, reportOnly })`. **Opens Phase 2** of the security-headers track. v0 ships static directives only; per-response nonce wiring requires template-render integration and defers to a future CSP-aware view-layer plugin. Strict whitelist of 27 CSP Level 3 standard directives — unknown directive names throw at factory call time (CSP typos are silent at the browser; fail-fast catches them). Value parsing accepts arrays of source-list tokens (joined with space), pre-formatted strings, `true` (boolean-only directives + `sandbox`), or `false` (omit). `reportOnly: true` emits `Content-Security-Policy-Report-Only` for non-enforcing migration testing. `directives` is required — no sensible cross-bundle default. Mirrors the HDR1-7 shape (idempotent first-writer-wins via `res.getHeader`). 92 unit tests; full suite 5768/5768. HDR6 Coep/Coop/Corp three-plugin split (per wrapper-consistency design) + HDR15 `SecurityHeaders` combined wrapper composing HDR1-7 + HDR5 + HDR6/13/14 to follow. | `0.4.0-alpha` | 2026-05-17 |
176
+ | ✅ | **`Cross-Origin-Embedder-Policy` (COEP) middleware (Phase 2)** — Opt-in plugin `gina.plugins.Coep({ value })`. Settings: `coep.value` is one of three W3C HTML spec tokens (`"require-corp"`, `"credentialless"`, `"unsafe-none"`); default `"require-corp"` matches helmet. Required (paired with `Coop: same-origin` / #HDR13) to enable SharedArrayBuffer and high-resolution `performance.now()` in the page. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR3 ReferrerPolicy single-enum shape with throw-on-invalid validation. The `require-corp` default BREAKS embeds without matching CORP/CORS headers — README walks users through the three escape hatches (set CORP via #HDR14, downgrade to `credentialless`, downgrade to `unsafe-none`). Idempotent — first-writer-wins. 56 unit tests. **First of the three Phase 2 cross-origin policies**; HDR13 Coop and HDR14 Corp to follow, then HDR15 SecurityHeaders combined wrapper closes Phase 2. | `0.4.0-alpha` | 2026-05-17 |
177
+ | ✅ | **`Cross-Origin-Opener-Policy` (COOP) middleware (Phase 2)** — Opt-in plugin `gina.plugins.Coop({ value })`. Settings: `coop.value` is one of four W3C HTML spec tokens (`"same-origin"`, `"same-origin-allow-popups"`, `"noopener-allow-popups"`, `"unsafe-none"`); default `"same-origin"` matches helmet. Required (paired with `Coep: require-corp` / #HDR6) to enable cross-origin isolation. Same-origin isolates `window.opener` references on top-level navigation; same-origin-allow-popups is more compat-friendly for OAuth popup flows. The fourth token `noopener-allow-popups` (W3C spec addition, Chrome 119+/Firefox 131+) severs `window.opener` for popups even at same-origin while keeping the popup window open. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR6 Coep single-enum shape. The `same-origin` default BREAKS OAuth popup flows where the popup needs to call back into the opener — README walks users through the three escape hatches. Idempotent — first-writer-wins. 61 unit tests. **Second of the three Phase 2 cross-origin policies**; HDR14 Corp follows, then HDR15 SecurityHeaders combined wrapper closes Phase 2. | `0.4.0-alpha` | 2026-05-17 |
178
+ | ✅ | **`Cross-Origin-Resource-Policy` (CORP) middleware (Phase 2)** — Opt-in plugin `gina.plugins.Corp({ value })`. Settings: `corp.value` is one of three W3C HTML spec tokens (`"same-origin"`, `"same-site"`, `"cross-origin"`); default `"same-origin"` matches helmet's per-middleware default. Resource-side complement to #HDR6 Coep's `require-corp` enforcement — cross-origin embeds under `Coep: require-corp` require the embed-target bundle to set `Corp: cross-origin` (or wider) to load. Most restrictive practical default; defends against side-channel attacks that load a resource cross-origin to measure size/timing for fingerprinting. Caller options always win over settings; values are normalised to lowercase. Mirrors the #HDR6 Coep + #HDR13 Coop single-enum shape. The `same-origin` default BREAKS cross-origin embeds when the resource serves at a separate origin from the embedding page — README walks users through the three escape hatches (pick `same-site` for first-party multi-subdomain setups, pick `cross-origin` for publicly-embeddable CDN assets, per-bundle scoping where the page bundle keeps strict + the CDN bundle adopts `cross-origin`). Idempotent — first-writer-wins. 60 unit tests. **Third and final of the three Phase 2 cross-origin policies**; HDR15 SecurityHeaders combined wrapper follows as the closing slice. | `0.4.0-alpha` | 2026-05-17 |
179
+ | ✅ | **`SecurityHeaders` combined wrapper (Phase 2 — closes #HDR + Phase 1.5 extension)** — Opt-in plugin `gina.plugins.SecurityHeaders({...})` composes the full HDR1-14 set in a single mount with one `settings.json` block (`securityHeaders.*`). **Batteries-included safe set**: calling `SecurityHeaders()` with no opts mounts the **12 non-footgun plugins** (xContentTypeOptions, xFrameOptions, referrerPolicy, hsts, originAgentCluster, hidePoweredBy, xDnsPrefetchControl, xXssProtection, xDownloadOptions, xPermittedCrossDomainPolicies, coop, corp) with per-plugin defaults. CSP (#HDR5) and COEP (#HDR6) are opt-in only (CSP throws on missing directives; COEP `require-corp` breaks embeds without CORP). Per-sub-config explicit opt-out via `<key>: false` or `null` (e.g. `SecurityHeaders({ hsts: false })` for HTTP-only bundles). Individual plugins remain mountable independently as power-user escape hatches — the idempotent first-writer-wins pattern means no double-emit when stacking. Mirrors helmet's `helmet()` orchestrator. **Originally shipped 2026-05-17 with 9 sub-plugins** (HDR1-7 + HDR5 + HDR6/13/14) closing Phase 2; **extended 2026-05-17 to 14 sub-plugins** when Phase 1.5 (HDR8-12) closed — wrapper safe-set grew from 7 to 12 plugins. 92 unit tests (was 83 + 9 for the HDR8-12 sub-config opt-out + override coverage). **Closes Phase 2 + Phase 1.5 extension.** | `0.4.0-alpha` | 2026-05-17 |
180
+
181
+ ---
182
+
159
183
  ## Secrets & Configuration
160
184
 
161
185
  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.
@@ -0,0 +1 @@
1
+ 0.3.15-alpha.3
@@ -0,0 +1,75 @@
1
+ /*
2
+ * This file is part of the gina package.
3
+ * Copyright (c) 2009-2026 Rhinostone <contact@gina.io>
4
+ *
5
+ * For the full copyright and license information, please view the LICENSE
6
+ * file that was distributed with this source code.
7
+ */
8
+
9
+ /**
10
+ * Gina.Core.Plugins Class
11
+ *
12
+ * @package Gina.Core
13
+ * @author Rhinostone <contact@gina.io>
14
+ */
15
+
16
+ function Plugins() {
17
+
18
+ var _require = function(path) {
19
+ var isCacheless = (process.env.NODE_ENV_IS_DEV == 'false') ? false : true;
20
+ if (isCacheless) {
21
+ try {
22
+ delete require.cache[require.resolve(path)];
23
+ return require(path)
24
+ } catch (err) {
25
+ throw err
26
+ }
27
+
28
+ } else {
29
+ return require(path)
30
+ }
31
+ }
32
+
33
+
34
+ var self = {
35
+ Validator : _require('./lib/validator'),
36
+ // #CSRF1 — hardened session-cookie wrapper around express-session.
37
+ Session : _require('./lib/session'),
38
+ // #CSRF2 — signed double-submit token CSRF middleware.
39
+ Csrf : _require('./lib/csrf'),
40
+ // #HDR1 — X-Content-Type-Options: nosniff response header.
41
+ XContentTypeOptions : _require('./lib/security-headers/x-content-type-options'),
42
+ // #HDR2 — X-Frame-Options clickjacking-defense response header.
43
+ XFrameOptions : _require('./lib/security-headers/x-frame-options'),
44
+ // #HDR3 — Referrer-Policy response header.
45
+ ReferrerPolicy : _require('./lib/security-headers/referrer-policy'),
46
+ // #HDR4 — HSTS (Strict-Transport-Security) response header.
47
+ Hsts : _require('./lib/security-headers/hsts'),
48
+ // #HDR5 — Content-Security-Policy response header.
49
+ Csp : _require('./lib/security-headers/csp'),
50
+ // #HDR6 — Cross-Origin-Embedder-Policy response header.
51
+ Coep : _require('./lib/security-headers/coep'),
52
+ // #HDR7 — Origin-Agent-Cluster response header (origin-keyed isolation).
53
+ OriginAgentCluster : _require('./lib/security-headers/origin-agent-cluster'),
54
+ // #HDR8 — X-Powered-By response-header removal (helmet-parity gap-fill, opens Phase 1.5).
55
+ HidePoweredBy : _require('./lib/security-headers/hide-powered-by'),
56
+ // #HDR9 — X-DNS-Prefetch-Control response header (helmet-parity gap-fill).
57
+ XDnsPrefetchControl : _require('./lib/security-headers/x-dns-prefetch-control'),
58
+ // #HDR10 — X-XSS-Protection: 0 response header — DISABLES Chrome legacy XSS auditor (helmet-parity).
59
+ XXssProtection : _require('./lib/security-headers/x-xss-protection'),
60
+ // #HDR11 — X-Download-Options: noopen response header — IE-legacy (helmet-parity).
61
+ XDownloadOptions : _require('./lib/security-headers/x-download-options'),
62
+ // #HDR12 — X-Permitted-Cross-Domain-Policies response header — Adobe Flash/PDF legacy (closes Phase 1.5).
63
+ XPermittedCrossDomainPolicies : _require('./lib/security-headers/x-permitted-cross-domain-policies'),
64
+ // #HDR13 — Cross-Origin-Opener-Policy response header.
65
+ Coop : _require('./lib/security-headers/coop'),
66
+ // #HDR14 — Cross-Origin-Resource-Policy response header.
67
+ Corp : _require('./lib/security-headers/corp'),
68
+ // #HDR15 — Security Headers combined wrapper (composes HDR1-7 + HDR5 + HDR6/13/14).
69
+ SecurityHeaders : _require('./lib/security-headers')
70
+ };
71
+
72
+ return self
73
+ };
74
+
75
+ module.exports = Plugins()
@@ -0,0 +1,243 @@
1
+ # Security Headers Combined Wrapper (#HDR15)
2
+
3
+ Opt-in middleware that composes the fourteen per-header security
4
+ plugins into a single mount point with one `settings.json` block.
5
+ Closes Phase 2 of the gina Web Security Headers track; extended with
6
+ the Phase 1.5 helmet-parity plugins (HDR8-12) post-Phase-1.5-closure.
7
+
8
+ ## Why
9
+
10
+ The individual `#HDR` plugins are deliberately single-concern — each
11
+ emits one response header, reads one settings.json key, has its own
12
+ README. That makes each plugin easy to reason about but verbose to
13
+ adopt: bundles wanting all fourteen end up with fourteen `require(...)`
14
+ calls, fourteen `app.use(...)` mounts, and fourteen settings.json
15
+ blocks.
16
+
17
+ `gina.plugins.SecurityHeaders({...})` is the one-mount + one-config
18
+ convenience layer over the fourteen. Mirrors helmet's `helmet()` shape
19
+ so bundles migrating from helmet find the API familiar.
20
+
21
+ ## Adoption
22
+
23
+ ### Default — batteries-included safe set
24
+
25
+ One block in the bundle bootstrap (`bundles/<name>/index.js`):
26
+
27
+ ```js
28
+ var myapp = require('gina');
29
+ var securityHeaders = require('gina').plugins.SecurityHeaders();
30
+
31
+ myapp.onInitialize(function(event, app) {
32
+ app.use(securityHeaders);
33
+ event.emit('complete', app);
34
+ });
35
+ ```
36
+
37
+ With no opts, mounts the **twelve non-footgun plugins** with their
38
+ per-plugin defaults:
39
+
40
+ | Sub-plugin | Header | Default value |
41
+ |-------------------------------------------|-------------------------------------|----------------------------------------------|
42
+ | `XContentTypeOptions` (HDR1) | `X-Content-Type-Options` | `nosniff` |
43
+ | `XFrameOptions` (HDR2) | `X-Frame-Options` | `SAMEORIGIN` |
44
+ | `ReferrerPolicy` (HDR3) | `Referrer-Policy` | `strict-origin-when-cross-origin` |
45
+ | `Hsts` (HDR4) | `Strict-Transport-Security` | `max-age=15552000` (180 days) |
46
+ | `OriginAgentCluster` (HDR7) | `Origin-Agent-Cluster` | `?1` |
47
+ | `HidePoweredBy` (HDR8) | `X-Powered-By` | **REMOVED** (Express engine only) |
48
+ | `XDnsPrefetchControl` (HDR9) | `X-DNS-Prefetch-Control` | `off` |
49
+ | `XXssProtection` (HDR10) | `X-XSS-Protection` | `0` (deliberately disables Chrome auditor) |
50
+ | `XDownloadOptions` (HDR11) | `X-Download-Options` | `noopen` (IE-legacy) |
51
+ | `XPermittedCrossDomainPolicies` (HDR12) | `X-Permitted-Cross-Domain-Policies` | `none` (Flash/PDF-legacy) |
52
+ | `Coop` (HDR13) | `Cross-Origin-Opener-Policy` | `same-origin` |
53
+ | `Corp` (HDR14) | `Cross-Origin-Resource-Policy` | `same-origin` |
54
+
55
+ The two **opt-in-only plugins** (#HDR5 Csp + #HDR6 Coep) are NOT
56
+ mounted by default because they have known footguns:
57
+
58
+ - **CSP** (#HDR5) throws on missing directives — there's no sensible
59
+ cross-bundle default since every bundle has its own resource graph.
60
+ - **COEP** (#HDR6) default `require-corp` BREAKS pages that load
61
+ cross-origin resources without matching CORP / CORS headers.
62
+
63
+ Bundles that want either must opt in explicitly (see below).
64
+
65
+ ### Opt in to CSP and COEP
66
+
67
+ ```js
68
+ var securityHeaders = require('gina').plugins.SecurityHeaders({
69
+ csp: {
70
+ directives: {
71
+ 'default-src': ["'self'"],
72
+ 'script-src': ["'self'", 'https://cdn.example.com'],
73
+ 'style-src': ["'self'", "'unsafe-inline'"],
74
+ 'img-src': ["'self'", 'data:']
75
+ }
76
+ },
77
+ coep: true // require-corp default
78
+ });
79
+ app.use(securityHeaders);
80
+ ```
81
+
82
+ `csp: { directives: {...} }` is required when opting in — `csp: {}`
83
+ or `csp: true` will throw at factory call time (CSP needs directives,
84
+ this is a config error). Use `csp: false` (or omit the key) to keep
85
+ CSP off.
86
+
87
+ ### Opt out of a safe-set plugin
88
+
89
+ ```js
90
+ var securityHeaders = require('gina').plugins.SecurityHeaders({
91
+ hsts: false // HTTP-only bundle — HSTS is a no-op anyway
92
+ });
93
+ app.use(securityHeaders);
94
+ ```
95
+
96
+ Per-sub-config `false` (or `null`) skips that plugin even when it's
97
+ in the safe set. Useful for:
98
+
99
+ - HTTP-only bundles (skip HSTS)
100
+ - Bundles relying on `document.domain` (skip OriginAgentCluster)
101
+ - Multi-domain bundles with permissive cross-origin needs (skip Coop /
102
+ Corp, set explicit policy elsewhere)
103
+
104
+ ### Override defaults on a safe-set plugin
105
+
106
+ ```js
107
+ var securityHeaders = require('gina').plugins.SecurityHeaders({
108
+ xFrameOptions: { value: 'DENY' }, // override SAMEORIGIN default
109
+ referrerPolicy: { value: 'no-referrer' },
110
+ hsts: { maxAge: 31536000, includeSubDomains: true, preload: true }
111
+ });
112
+ app.use(securityHeaders);
113
+ ```
114
+
115
+ Sub-config objects replace the per-plugin defaults wholesale (shallow
116
+ merge — the standalone plugins' own settings.json reads still apply
117
+ underneath, see "Settings precedence" below).
118
+
119
+ ## Configuration
120
+
121
+ In `bundles/<name>/config/settings.json`:
122
+
123
+ ```jsonc
124
+ {
125
+ "securityHeaders": {
126
+ "xContentTypeOptions": true,
127
+ "xFrameOptions": { "value": "SAMEORIGIN" },
128
+ "referrerPolicy": { "value": "strict-origin-when-cross-origin" },
129
+ "hsts": { "maxAge": 15552000, "includeSubDomains": false, "preload": false },
130
+ "originAgentCluster": true,
131
+ "hidePoweredBy": true,
132
+ "xDnsPrefetchControl": { "value": "off" },
133
+ "xXssProtection": true,
134
+ "xDownloadOptions": true,
135
+ "xPermittedCrossDomainPolicies": { "value": "none" },
136
+ "coop": { "value": "same-origin" },
137
+ "corp": { "value": "same-origin" },
138
+
139
+ "csp": { "directives": { "default-src": ["'self'"] } },
140
+ "coep": { "value": "require-corp" }
141
+ }
142
+ }
143
+ ```
144
+
145
+ All sub-config keys are optional. Sub-configs absent from `settings.json`
146
+ fall back to the per-plugin defaults (safe-set plugins are mounted;
147
+ CSP / COEP stay opt-in-only).
148
+
149
+ ### Per-sub-config shapes
150
+
151
+ | Sub-config key | Value shape | Mount behaviour |
152
+ |-----------------------------------|--------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
153
+ | `xContentTypeOptions` | `true` / `false` / `null` / `{}` | Default mount; `false` or `null` opts out |
154
+ | `xFrameOptions` | `{ value: 'DENY' \| 'SAMEORIGIN' }` / `true` / `false` / `null` / `{}` | Default mount with SAMEORIGIN |
155
+ | `referrerPolicy` | `{ value: '<one-of-8-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with strict-origin-when-cross-origin |
156
+ | `hsts` | `{ maxAge, includeSubDomains, preload }` / `true` / `false` / `null` / `{}` | Default mount with 180-day maxAge |
157
+ | `csp` | `{ directives: {...}, reportOnly: false }` / `false` / `null` | Opt-in only; throws on `{}` or `true` (no directives) |
158
+ | `coep` | `{ value: '<one-of-3-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Opt-in only; default require-corp |
159
+ | `originAgentCluster` | `true` / `false` / `null` / `{}` | Default mount |
160
+ | `hidePoweredBy` | `true` / `false` / `null` / `{}` | Default mount (Express engine only; Isaac engine writeHead path unaffected) |
161
+ | `xDnsPrefetchControl` | `{ value: 'on' \| 'off' }` / `true` / `false` / `null` / `{}` | Default mount with `off` |
162
+ | `xXssProtection` | `true` / `false` / `null` / `{}` | Default mount (emits literal `0` to DISABLE Chrome legacy auditor) |
163
+ | `xDownloadOptions` | `true` / `false` / `null` / `{}` | Default mount (emits `noopen`; IE-legacy) |
164
+ | `xPermittedCrossDomainPolicies` | `{ value: '<one-of-4-Adobe-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with `none` |
165
+ | `coop` | `{ value: '<one-of-4-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with same-origin |
166
+ | `corp` | `{ value: '<one-of-3-W3C-tokens>' }` / `true` / `false` / `null` / `{}` | Default mount with same-origin |
167
+
168
+ ## Settings precedence
169
+
170
+ Three layers, lowest-to-highest:
171
+
172
+ 1. **Per-plugin defaults** (in each plugin's source — e.g. `xFrameOptions` defaults to `SAMEORIGIN`).
173
+ 2. **`settings.json > <key>.*`** (each standalone plugin reads its own settings key — e.g. `xFrameOptions.value` in `settings.json`).
174
+ 3. **`settings.json > securityHeaders.<key>.*`** (the wrapper reads this and passes to the per-plugin factory).
175
+ 4. **Wrapper opts (`SecurityHeaders({...})`)** (caller opts override everything).
176
+
177
+ The wrapper passes its resolved sub-config to each per-plugin factory
178
+ as `opts`. The per-plugin factory merges its own settings reads, then
179
+ those opts win.
180
+
181
+ ## Power-user escape hatch — individual plugins still mountable
182
+
183
+ The standalone plugins continue to work independently:
184
+
185
+ ```js
186
+ var csp = require('gina').plugins.Csp({
187
+ directives: {
188
+ 'default-src': ["'self'"],
189
+ 'script-src': ["'self'", "'nonce-XXXXX'"]
190
+ }
191
+ });
192
+ app.use(csp);
193
+ ```
194
+
195
+ Each plugin uses the **idempotent first-writer-wins** pattern (via
196
+ `res.getHeader`), so stacking the wrapper with an upstream individual
197
+ mount produces no double-emit — the first one to set the header wins,
198
+ the second skips.
199
+
200
+ This means you can mix-and-match: use `SecurityHeaders()` for the
201
+ seven safe-set plugins, mount `gina.plugins.Csp()` separately with a
202
+ per-request nonce, mount nothing for COEP. All three behaviours
203
+ coexist cleanly.
204
+
205
+ ## Per-sub-plugin references
206
+
207
+ For the full details on each per-header plugin's behaviour, tradeoffs,
208
+ and failure modes, see the standalone READMEs:
209
+
210
+ - [`gina-core-plugin-x-content-type-options`](../x-content-type-options/README.md) (HDR1)
211
+ - [`gina-core-plugin-x-frame-options`](../x-frame-options/README.md) (HDR2)
212
+ - [`gina-core-plugin-referrer-policy`](../referrer-policy/README.md) (HDR3)
213
+ - [`gina-core-plugin-hsts`](../hsts/README.md) (HDR4)
214
+ - [`gina-core-plugin-csp`](../csp/README.md) (HDR5)
215
+ - [`gina-core-plugin-coep`](../coep/README.md) (HDR6)
216
+ - [`gina-core-plugin-origin-agent-cluster`](../origin-agent-cluster/README.md) (HDR7)
217
+ - [`gina-core-plugin-hide-powered-by`](../hide-powered-by/README.md) (HDR8)
218
+ - [`gina-core-plugin-x-dns-prefetch-control`](../x-dns-prefetch-control/README.md) (HDR9)
219
+ - [`gina-core-plugin-x-xss-protection`](../x-xss-protection/README.md) (HDR10)
220
+ - [`gina-core-plugin-x-download-options`](../x-download-options/README.md) (HDR11)
221
+ - [`gina-core-plugin-x-permitted-cross-domain-policies`](../x-permitted-cross-domain-policies/README.md) (HDR12)
222
+ - [`gina-core-plugin-coop`](../coop/README.md) (HDR13)
223
+ - [`gina-core-plugin-corp`](../corp/README.md) (HDR14)
224
+
225
+ ## Failure modes
226
+
227
+ | Condition | Outcome |
228
+ |----------------------------------------------------------------------------|-------------------------------------------------------------------------------|
229
+ | Plugin not registered | No security headers emitted; browsers apply their built-in defaults |
230
+ | `SecurityHeaders()` with no opts | Safe-set mounted (HDR1/2/3/4/7/13/14); CSP and COEP skipped |
231
+ | Sub-config = `false` or `null` | That plugin skipped — explicit opt-out |
232
+ | Sub-config = `true` | That plugin mounted with per-plugin defaults (boolean shorthand) |
233
+ | Sub-config = `{}` | Same as `true` for safe-set plugins. CSP throws (directives required); COEP mounts with `require-corp` default. |
234
+ | Sub-config = object with invalid keys/values | Per-plugin factory throws at call time (matches standalone behaviour) |
235
+ | Sub-config = string / number / array / function | Wrapper throws at call time with the offending sub-config key in the message |
236
+ | Header already set by an earlier middleware | Existing value preserved (idempotent first-writer-wins, per-plugin) |
237
+ | Response already sent (`res.headersSent === true`) | Node's `setHeader` no-ops; request resumes |
238
+ | Stacked with an upstream individual `gina.plugins.<X>` mount | First writer wins; the second skip is a no-op |
239
+
240
+ The fail-fast posture (throws at factory call time for invalid
241
+ sub-configs) is inherited from each per-plugin factory. A
242
+ misconfigured bundle won't start — the throw points at the specific
243
+ sub-config that's wrong, with the plugin's standalone error message.
@@ -0,0 +1,134 @@
1
+ # Cross-Origin-Embedder-Policy Plugin (#HDR6)
2
+
3
+ Opt-in middleware that sets the `Cross-Origin-Embedder-Policy` (COEP)
4
+ response header on every response, controlling which cross-origin
5
+ resources the page may embed.
6
+
7
+ ## Why
8
+
9
+ COEP is half of the "cross-origin isolation" pair (the other half is
10
+ `Cross-Origin-Opener-Policy` / #HDR13). Setting both to their strictest
11
+ values (`COEP: require-corp` + `COOP: same-origin`) unlocks features
12
+ that browsers gate behind cross-origin isolation:
13
+
14
+ - `SharedArrayBuffer` — required by WebAssembly threads, `OffscreenCanvas`
15
+ with multi-threaded rendering, and any code that needs zero-copy
16
+ shared memory between worker threads.
17
+ - High-resolution `performance.now()` — sub-millisecond timer precision
18
+ needed for accurate performance profiling. Without isolation, browsers
19
+ coarsen the resolution to mitigate Spectre side-channel attacks.
20
+
21
+ COEP also independently provides defense-in-depth against cross-site
22
+ script injection: with `require-corp` set, the browser refuses to
23
+ load any cross-origin resource that doesn't explicitly opt in via
24
+ `Cross-Origin-Resource-Policy` (CORP) or CORS. An attacker who can
25
+ inject a `<script src="https://evil.com/x.js">` tag can't load the
26
+ script unless evil.com returns the matching CORP or CORS header.
27
+
28
+ Browser support: Chrome 83+, Edge 83+, Firefox 79+, Safari 15.2+.
29
+
30
+ ## Adoption
31
+
32
+ One block in the bundle bootstrap (`bundles/<name>/index.js`):
33
+
34
+ ```js
35
+ var myapp = require('gina');
36
+ var coep = require('gina').plugins.Coep();
37
+
38
+ myapp.onInitialize(function(event, app) {
39
+ app.use(coep);
40
+ event.emit('complete', app);
41
+ });
42
+ ```
43
+
44
+ Order with other gina security plugins does not matter — the header is
45
+ emitted on the response, not consumed from the request.
46
+
47
+ ## Configuration
48
+
49
+ In `bundles/<name>/config/settings.json`:
50
+
51
+ ```jsonc
52
+ {
53
+ "coep": {
54
+ "value": "require-corp"
55
+ }
56
+ }
57
+ ```
58
+
59
+ | Field | Type | Default | Valid values |
60
+ |---------|--------|----------------|----------------------------------------------------|
61
+ | `value` | string | `require-corp` | `require-corp`, `credentialless`, `unsafe-none` |
62
+
63
+ ### Three values per the W3C HTML spec
64
+
65
+ | Token | Behaviour |
66
+ |------------------|--------------------------------------------------------------------------------------------|
67
+ | `require-corp` | **Default**. Cross-origin resources must opt-in via CORP or CORS, otherwise blocked. Required (paired with `COOP: same-origin`) for `SharedArrayBuffer` and high-res `performance.now()`. |
68
+ | `credentialless` | Cross-origin no-CORS requests sent WITHOUT credentials (cookies, HTTP auth). Less restrictive than `require-corp` but still gates the cross-origin-isolation combo. |
69
+ | `unsafe-none` | Browser default. No restrictions; equivalent to not setting the header. Use to explicitly opt OUT (e.g. to override a stricter upstream default). |
70
+
71
+ Caller-supplied options always win over settings:
72
+
73
+ ```js
74
+ var coep = require('gina').plugins.Coep({ value: 'credentialless' });
75
+ ```
76
+
77
+ Tokens are case-insensitive at this layer — values are normalised to
78
+ lowercase before validation and emission. The spec defines them as
79
+ lowercase enumerated strings; browsers parse case-sensitively, so the
80
+ emitted header is always lowercase.
81
+
82
+ ## Tradeoff with the `require-corp` default
83
+
84
+ The strict default `require-corp` enables the SharedArrayBuffer +
85
+ cross-origin-isolation combo, but BREAKS pages that load cross-origin
86
+ resources (images, fonts, scripts on a CDN, embedded videos) that
87
+ don't carry the matching `Cross-Origin-Resource-Policy` (CORP) or
88
+ CORS header. Symptoms: blocked resources appear as failed network
89
+ requests in DevTools with a
90
+ `NotSameOriginAfterDefaultedToSameOriginByCoep` error.
91
+
92
+ Options when `require-corp` breaks an embed:
93
+
94
+ 1. **Set CORP on the embedded resource** (preferred) — if you control
95
+ the origin serving the embed, add `Cross-Origin-Resource-Policy:
96
+ cross-origin` (or use #HDR14 `gina.plugins.Corp()` on that bundle).
97
+ 2. **Downgrade to `credentialless`** — cookies and HTTP auth are
98
+ stripped on cross-origin no-CORS requests, but no explicit CORP
99
+ header is required. Compatible with most public CDN content
100
+ (fonts, images) that don't need credentials.
101
+ 3. **Downgrade to `unsafe-none`** — gives up cross-origin isolation
102
+ entirely. The page can embed anything but loses SharedArrayBuffer
103
+ and high-res timers.
104
+
105
+ ## Pair with COOP for the SharedArrayBuffer combo
106
+
107
+ To enable `SharedArrayBuffer` and the rest of the
108
+ cross-origin-isolated-context features, register BOTH plugins together:
109
+
110
+ ```js
111
+ var coep = require('gina').plugins.Coep(); // require-corp (default)
112
+ var coop = require('gina').plugins.Coop({ value: 'same-origin' }); // default
113
+ app.use(coep);
114
+ app.use(coop);
115
+ ```
116
+
117
+ The page becomes cross-origin-isolated and `window.crossOriginIsolated`
118
+ returns `true`. See the W3C HTML spec section on
119
+ [cross-origin isolation](https://html.spec.whatwg.org/multipage/browsers.html#cross-origin-isolated)
120
+ for the full feature gate.
121
+
122
+ ## Failure modes
123
+
124
+ | Condition | Outcome |
125
+ |----------------------------------------------------------|------------------------------------------------------|
126
+ | `value` omitted | Defaults to `require-corp` |
127
+ | `value` is not one of the 3 W3C tokens | Factory throws at call time (bundle won't start) |
128
+ | Plugin not registered | Header not emitted; browser uses default behaviour |
129
+ | Header already set by an earlier middleware | Existing value preserved (idempotent) |
130
+ | Response already sent (`res.headersSent === true`) | Node's `setHeader` no-ops; request resumes |
131
+
132
+ The idempotent behaviour makes the plugin safe to register more than
133
+ once or alongside another middleware that emits the same header — the
134
+ first writer wins.
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "gina-core-plugin-coep",
3
+ "version": "1.0.0",
4
+ "description": "Cross-Origin-Embedder-Policy response header middleware (#HDR6)",
5
+ "authors": [
6
+ {
7
+ "name": "Martin-Luther ETOUMAN",
8
+ "email": "contact@gina.io"
9
+ },
10
+ {
11
+ "name": "Fabrice DELANEAU",
12
+ "email": "contact@gina.io"
13
+ }
14
+ ],
15
+ "copyright": "Copyright (c) 2009-2026 Rhinostone <contact@gina.io>",
16
+ "engines": {
17
+ "node": ">=0.10.22"
18
+ },
19
+ "main": "src/main",
20
+ "license": "MIT",
21
+ "readmeFilename": "README.md"
22
+ }