unleash-server 4.1.2 → 4.2.0-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 (511) hide show
  1. package/CHANGELOG.md +920 -0
  2. package/README.md +3 -2
  3. package/dist/lib/addons/addon.js +1 -1
  4. package/dist/lib/addons/addon.js.map +1 -1
  5. package/dist/lib/addons/slack.js +9 -9
  6. package/dist/lib/addons/slack.js.map +1 -1
  7. package/dist/lib/addons/teams.js +1 -1
  8. package/dist/lib/addons/teams.js.map +1 -1
  9. package/dist/lib/app.js +20 -20
  10. package/dist/lib/app.js.map +1 -1
  11. package/dist/lib/app.test.js +11 -7
  12. package/dist/lib/app.test.js.map +1 -1
  13. package/dist/lib/create-config.js +9 -9
  14. package/dist/lib/create-config.js.map +1 -1
  15. package/dist/lib/db/api-token-store.d.ts +2 -1
  16. package/dist/lib/db/api-token-store.js +5 -0
  17. package/dist/lib/db/api-token-store.js.map +1 -1
  18. package/dist/lib/db/client-metrics-store.d.ts +6 -0
  19. package/dist/lib/db/client-metrics-store.js +6 -1
  20. package/dist/lib/db/client-metrics-store.js.map +1 -1
  21. package/dist/lib/db/db-pool.js +1 -1
  22. package/dist/lib/db/db-pool.js.map +1 -1
  23. package/dist/lib/db/environment-store.d.ts +7 -7
  24. package/dist/lib/db/environment-store.js +59 -54
  25. package/dist/lib/db/environment-store.js.map +1 -1
  26. package/dist/lib/db/event-store.d.ts +5 -2
  27. package/dist/lib/db/event-store.js +27 -4
  28. package/dist/lib/db/event-store.js.map +1 -1
  29. package/dist/lib/db/event-store.test.js +2 -2
  30. package/dist/lib/db/event-store.test.js.map +1 -1
  31. package/dist/lib/db/feature-environment-store.d.ts +8 -6
  32. package/dist/lib/db/feature-environment-store.js +53 -19
  33. package/dist/lib/db/feature-environment-store.js.map +1 -1
  34. package/dist/lib/db/feature-strategy-store.d.ts +7 -11
  35. package/dist/lib/db/feature-strategy-store.js +77 -147
  36. package/dist/lib/db/feature-strategy-store.js.map +1 -1
  37. package/dist/lib/db/feature-toggle-client-store.d.ts +26 -0
  38. package/dist/lib/db/feature-toggle-client-store.js +106 -0
  39. package/dist/lib/db/feature-toggle-client-store.js.map +1 -0
  40. package/dist/lib/db/feature-toggle-store.d.ts +10 -22
  41. package/dist/lib/db/feature-toggle-store.js +9 -42
  42. package/dist/lib/db/feature-toggle-store.js.map +1 -1
  43. package/dist/lib/db/index.js +2 -0
  44. package/dist/lib/db/index.js.map +1 -1
  45. package/dist/lib/db/project-store.d.ts +4 -6
  46. package/dist/lib/db/project-store.js +7 -43
  47. package/dist/lib/db/project-store.js.map +1 -1
  48. package/dist/lib/event-hook.test.js +8 -7
  49. package/dist/lib/event-hook.test.js.map +1 -1
  50. package/dist/lib/logger.js +1 -1
  51. package/dist/lib/logger.js.map +1 -1
  52. package/dist/lib/logger.test.js +26 -4
  53. package/dist/lib/logger.test.js.map +1 -1
  54. package/dist/lib/metrics.test.js +3 -3
  55. package/dist/lib/metrics.test.js.map +1 -1
  56. package/dist/lib/middleware/api-token-middleware.js +10 -2
  57. package/dist/lib/middleware/api-token-middleware.js.map +1 -1
  58. package/dist/lib/middleware/api-token-middleware.test.js +44 -8
  59. package/dist/lib/middleware/api-token-middleware.test.js.map +1 -1
  60. package/dist/lib/middleware/content_type_checker.test.js +4 -4
  61. package/dist/lib/middleware/content_type_checker.test.js.map +1 -1
  62. package/dist/lib/middleware/demo-authentication.js +1 -1
  63. package/dist/lib/middleware/demo-authentication.js.map +1 -1
  64. package/dist/lib/middleware/no-authentication.test.js +3 -3
  65. package/dist/lib/middleware/no-authentication.test.js.map +1 -1
  66. package/dist/lib/middleware/oss-authentication.js +0 -3
  67. package/dist/lib/middleware/oss-authentication.js.map +1 -1
  68. package/dist/lib/middleware/oss-authentication.test.js +7 -7
  69. package/dist/lib/middleware/oss-authentication.test.js.map +1 -1
  70. package/dist/lib/middleware/rbac-middleware.js +2 -2
  71. package/dist/lib/middleware/rbac-middleware.js.map +1 -1
  72. package/dist/lib/middleware/rbac-middleware.test.js +51 -12
  73. package/dist/lib/middleware/rbac-middleware.test.js.map +1 -1
  74. package/dist/lib/middleware/secure-headers.js +1 -1
  75. package/dist/lib/middleware/secure-headers.js.map +1 -1
  76. package/dist/lib/middleware/session-db.js +2 -2
  77. package/dist/lib/middleware/session-db.js.map +1 -1
  78. package/dist/lib/routes/admin-api/addon.d.ts +4 -3
  79. package/dist/lib/routes/admin-api/addon.js +4 -4
  80. package/dist/lib/routes/admin-api/addon.js.map +1 -1
  81. package/dist/lib/routes/admin-api/api-token-controller.js +10 -38
  82. package/dist/lib/routes/admin-api/api-token-controller.js.map +1 -1
  83. package/dist/lib/routes/admin-api/archive.d.ts +4 -3
  84. package/dist/lib/routes/admin-api/archive.js +3 -3
  85. package/dist/lib/routes/admin-api/archive.js.map +1 -1
  86. package/dist/lib/routes/admin-api/config.test.js +5 -5
  87. package/dist/lib/routes/admin-api/config.test.js.map +1 -1
  88. package/dist/lib/routes/admin-api/context.d.ts +4 -3
  89. package/dist/lib/routes/admin-api/context.js +4 -4
  90. package/dist/lib/routes/admin-api/context.js.map +1 -1
  91. package/dist/lib/routes/admin-api/context.test.js +6 -6
  92. package/dist/lib/routes/admin-api/context.test.js.map +1 -1
  93. package/dist/lib/routes/admin-api/email.test.js +6 -6
  94. package/dist/lib/routes/admin-api/email.test.js.map +1 -1
  95. package/dist/lib/routes/admin-api/environments-controller.d.ts +4 -4
  96. package/dist/lib/routes/admin-api/environments-controller.js +17 -43
  97. package/dist/lib/routes/admin-api/environments-controller.js.map +1 -1
  98. package/dist/lib/routes/admin-api/event.js +7 -1
  99. package/dist/lib/routes/admin-api/event.js.map +1 -1
  100. package/dist/lib/routes/admin-api/events.test.js +5 -5
  101. package/dist/lib/routes/admin-api/events.test.js.map +1 -1
  102. package/dist/lib/routes/admin-api/feature.d.ts +11 -10
  103. package/dist/lib/routes/admin-api/feature.js +26 -24
  104. package/dist/lib/routes/admin-api/feature.js.map +1 -1
  105. package/dist/lib/routes/admin-api/metrics.js +25 -66
  106. package/dist/lib/routes/admin-api/metrics.js.map +1 -1
  107. package/dist/lib/routes/admin-api/metrics.test.js +6 -6
  108. package/dist/lib/routes/admin-api/metrics.test.js.map +1 -1
  109. package/dist/lib/routes/admin-api/project/environments.js +6 -15
  110. package/dist/lib/routes/admin-api/project/environments.js.map +1 -1
  111. package/dist/lib/routes/admin-api/project/features.d.ts +29 -11
  112. package/dist/lib/routes/admin-api/project/features.js +97 -35
  113. package/dist/lib/routes/admin-api/project/features.js.map +1 -1
  114. package/dist/lib/routes/admin-api/project/health-report.js +7 -18
  115. package/dist/lib/routes/admin-api/project/health-report.js.map +1 -1
  116. package/dist/lib/routes/admin-api/project/index.d.ts +3 -0
  117. package/dist/lib/routes/admin-api/project/index.js +8 -0
  118. package/dist/lib/routes/admin-api/project/index.js.map +1 -1
  119. package/dist/lib/routes/admin-api/state.d.ts +2 -1
  120. package/dist/lib/routes/admin-api/state.js +7 -6
  121. package/dist/lib/routes/admin-api/state.js.map +1 -1
  122. package/dist/lib/routes/admin-api/strategy.d.ts +1 -1
  123. package/dist/lib/routes/admin-api/strategy.js +24 -22
  124. package/dist/lib/routes/admin-api/strategy.js.map +1 -1
  125. package/dist/lib/routes/admin-api/strategy.test.js +6 -6
  126. package/dist/lib/routes/admin-api/strategy.test.js.map +1 -1
  127. package/dist/lib/routes/admin-api/tag-type.d.ts +4 -3
  128. package/dist/lib/routes/admin-api/tag-type.js +19 -50
  129. package/dist/lib/routes/admin-api/tag-type.js.map +1 -1
  130. package/dist/lib/routes/admin-api/tag.d.ts +3 -2
  131. package/dist/lib/routes/admin-api/tag.js +3 -4
  132. package/dist/lib/routes/admin-api/tag.js.map +1 -1
  133. package/dist/lib/routes/admin-api/tag.test.js +6 -6
  134. package/dist/lib/routes/admin-api/tag.test.js.map +1 -1
  135. package/dist/lib/routes/admin-api/user-admin.js +11 -37
  136. package/dist/lib/routes/admin-api/user-admin.js.map +1 -1
  137. package/dist/lib/routes/admin-api/user.test.js +5 -5
  138. package/dist/lib/routes/admin-api/user.test.js.map +1 -1
  139. package/dist/lib/routes/api-def.d.ts +49 -52
  140. package/dist/lib/routes/api-def.js +13 -9
  141. package/dist/lib/routes/api-def.js.map +1 -1
  142. package/dist/lib/routes/backstage.test.js +5 -5
  143. package/dist/lib/routes/backstage.test.js.map +1 -1
  144. package/dist/lib/routes/client-api/feature.d.ts +7 -8
  145. package/dist/lib/routes/client-api/feature.js +40 -28
  146. package/dist/lib/routes/client-api/feature.js.map +1 -1
  147. package/dist/lib/routes/client-api/feature.test.js +15 -15
  148. package/dist/lib/routes/client-api/feature.test.js.map +1 -1
  149. package/dist/lib/routes/client-api/metrics.d.ts +3 -2
  150. package/dist/lib/routes/client-api/metrics.js +8 -13
  151. package/dist/lib/routes/client-api/metrics.js.map +1 -1
  152. package/dist/lib/routes/client-api/metrics.test.js +7 -12
  153. package/dist/lib/routes/client-api/metrics.test.js.map +1 -1
  154. package/dist/lib/routes/client-api/register.js +3 -14
  155. package/dist/lib/routes/client-api/register.js.map +1 -1
  156. package/dist/lib/routes/client-api/register.test.js +5 -5
  157. package/dist/lib/routes/client-api/register.test.js.map +1 -1
  158. package/dist/lib/routes/controller.d.ts +1 -0
  159. package/dist/lib/routes/controller.js +4 -1
  160. package/dist/lib/routes/controller.js.map +1 -1
  161. package/dist/lib/routes/health-check.test.js +9 -9
  162. package/dist/lib/routes/health-check.test.js.map +1 -1
  163. package/dist/lib/routes/index.js +5 -5
  164. package/dist/lib/routes/index.js.map +1 -1
  165. package/dist/lib/routes/index.test.js +5 -5
  166. package/dist/lib/routes/index.test.js.map +1 -1
  167. package/dist/lib/routes/logout.test.js +15 -15
  168. package/dist/lib/routes/logout.test.js.map +1 -1
  169. package/dist/lib/routes/unleash-types.d.ts +1 -2
  170. package/dist/lib/routes/util.js +1 -0
  171. package/dist/lib/routes/util.js.map +1 -1
  172. package/dist/lib/schema/api-token-schema.d.ts +2 -0
  173. package/dist/lib/schema/api-token-schema.js +28 -0
  174. package/dist/lib/schema/api-token-schema.js.map +1 -0
  175. package/dist/lib/schema/feature-schema.test.js +17 -16
  176. package/dist/lib/schema/feature-schema.test.js.map +1 -1
  177. package/dist/lib/schema/project-schema.d.ts +2 -0
  178. package/dist/lib/schema/project-schema.js +12 -0
  179. package/dist/lib/schema/project-schema.js.map +1 -0
  180. package/dist/lib/server-impl.d.ts +2 -2
  181. package/dist/lib/server-impl.js +20 -18
  182. package/dist/lib/server-impl.js.map +1 -1
  183. package/dist/lib/server-impl.test.js +28 -21
  184. package/dist/lib/server-impl.test.js.map +1 -1
  185. package/dist/lib/services/access-service.d.ts +1 -1
  186. package/dist/lib/services/access-service.js.map +1 -1
  187. package/dist/lib/services/addon-service.js +2 -2
  188. package/dist/lib/services/addon-service.js.map +1 -1
  189. package/dist/lib/services/addon-service.test.js +1 -1
  190. package/dist/lib/services/addon-service.test.js.map +1 -1
  191. package/dist/lib/services/api-token-service.d.ts +3 -8
  192. package/dist/lib/services/api-token-service.js +43 -8
  193. package/dist/lib/services/api-token-service.js.map +1 -1
  194. package/dist/lib/services/client-metrics/client-metrics-schema.js +1 -0
  195. package/dist/lib/services/client-metrics/client-metrics-schema.js.map +1 -1
  196. package/dist/lib/services/client-metrics/client-metrics.test.js +18 -18
  197. package/dist/lib/services/client-metrics/client-metrics.test.js.map +1 -1
  198. package/dist/lib/services/client-metrics/index.js +5 -3
  199. package/dist/lib/services/client-metrics/index.js.map +1 -1
  200. package/dist/lib/services/context-schema.d.ts +3 -3
  201. package/dist/lib/services/context-schema.js +15 -11
  202. package/dist/lib/services/context-schema.js.map +1 -1
  203. package/dist/lib/services/email-service.js +5 -5
  204. package/dist/lib/services/email-service.js.map +1 -1
  205. package/dist/lib/services/environment-service.d.ts +4 -5
  206. package/dist/lib/services/environment-service.js +14 -14
  207. package/dist/lib/services/environment-service.js.map +1 -1
  208. package/dist/lib/services/event-service.d.ts +1 -0
  209. package/dist/lib/services/event-service.js +4 -3
  210. package/dist/lib/services/event-service.js.map +1 -1
  211. package/dist/lib/services/feature-toggle-service-v2.d.ts +27 -12
  212. package/dist/lib/services/feature-toggle-service-v2.js +157 -55
  213. package/dist/lib/services/feature-toggle-service-v2.js.map +1 -1
  214. package/dist/lib/services/index.js +1 -1
  215. package/dist/lib/services/index.js.map +1 -1
  216. package/dist/lib/services/project-health-service.d.ts +3 -1
  217. package/dist/lib/services/project-health-service.js +7 -3
  218. package/dist/lib/services/project-health-service.js.map +1 -1
  219. package/dist/lib/services/project-schema.d.ts +2 -3
  220. package/dist/lib/services/project-schema.js +12 -7
  221. package/dist/lib/services/project-schema.js.map +1 -1
  222. package/dist/lib/services/project-service.d.ts +4 -2
  223. package/dist/lib/services/project-service.js +21 -11
  224. package/dist/lib/services/project-service.js.map +1 -1
  225. package/dist/lib/services/state-schema.d.ts +2 -0
  226. package/dist/lib/services/state-schema.js +16 -6
  227. package/dist/lib/services/state-schema.js.map +1 -1
  228. package/dist/lib/services/state-service.d.ts +7 -0
  229. package/dist/lib/services/state-service.js +75 -17
  230. package/dist/lib/services/state-service.js.map +1 -1
  231. package/dist/lib/services/state-service.test.js +73 -28
  232. package/dist/lib/services/state-service.test.js.map +1 -1
  233. package/dist/lib/services/state-util.js +1 -1
  234. package/dist/lib/services/state-util.js.map +1 -1
  235. package/dist/lib/services/user-service.js +1 -1
  236. package/dist/lib/services/user-service.js.map +1 -1
  237. package/dist/lib/services/user-service.test.js +1 -1
  238. package/dist/lib/services/user-service.test.js.map +1 -1
  239. package/dist/lib/services/version-service.js +1 -1
  240. package/dist/lib/services/version-service.js.map +1 -1
  241. package/dist/lib/services/version-service.test.js +3 -3
  242. package/dist/lib/services/version-service.test.js.map +1 -1
  243. package/dist/lib/types/api-user.d.ts +11 -4
  244. package/dist/lib/types/api-user.js +4 -1
  245. package/dist/lib/types/api-user.js.map +1 -1
  246. package/dist/lib/types/events.d.ts +7 -0
  247. package/dist/lib/types/events.js +9 -1
  248. package/dist/lib/types/events.js.map +1 -1
  249. package/dist/lib/types/model.d.ts +25 -7
  250. package/dist/lib/types/model.js.map +1 -1
  251. package/dist/lib/types/models/api-token.d.ts +19 -0
  252. package/dist/lib/types/models/api-token.js +10 -0
  253. package/dist/lib/types/models/api-token.js.map +1 -0
  254. package/dist/lib/types/permissions.d.ts +2 -0
  255. package/dist/lib/types/permissions.js +3 -1
  256. package/dist/lib/types/permissions.js.map +1 -1
  257. package/dist/lib/types/stores/api-token-store.d.ts +1 -14
  258. package/dist/lib/types/stores/api-token-store.js +0 -6
  259. package/dist/lib/types/stores/api-token-store.js.map +1 -1
  260. package/dist/lib/types/stores/environment-store.d.ts +6 -6
  261. package/dist/lib/types/stores/event-store.d.ts +1 -0
  262. package/dist/lib/types/stores/feature-environment-store.d.ts +8 -6
  263. package/dist/lib/types/stores/feature-strategies-store.d.ts +6 -12
  264. package/dist/lib/types/stores/feature-toggle-client-store.d.ts +5 -0
  265. package/dist/lib/types/stores/feature-toggle-client-store.js +3 -0
  266. package/dist/lib/types/stores/feature-toggle-client-store.js.map +1 -0
  267. package/dist/lib/types/stores/feature-toggle-store.d.ts +7 -14
  268. package/dist/lib/types/stores/project-store.d.ts +5 -2
  269. package/dist/lib/types/stores.d.ts +2 -0
  270. package/dist/lib/types/user.js +1 -1
  271. package/dist/lib/types/user.js.map +1 -1
  272. package/dist/lib/util/constants.d.ts +1 -0
  273. package/dist/lib/util/constants.js +2 -1
  274. package/dist/lib/util/constants.js.map +1 -1
  275. package/dist/lib/util/extract-user.d.ts +2 -0
  276. package/dist/lib/util/extract-user.js +8 -0
  277. package/dist/lib/util/extract-user.js.map +1 -0
  278. package/dist/lib/util/format-base-uri.test.js +6 -6
  279. package/dist/lib/util/format-base-uri.test.js.map +1 -1
  280. package/dist/lib/util/graceful-shutdown.js +1 -1
  281. package/dist/lib/util/graceful-shutdown.js.map +1 -1
  282. package/dist/lib/util/rewriteHTML.test.js +4 -4
  283. package/dist/lib/util/rewriteHTML.test.js.map +1 -1
  284. package/dist/lib/util/snakeCase.d.ts +6 -0
  285. package/dist/lib/util/snakeCase.js +28 -0
  286. package/dist/lib/util/snakeCase.js.map +1 -0
  287. package/dist/{test/e2e/api/admin/boostrap.test.d.ts → lib/util/snakeCase.test.d.ts} +0 -0
  288. package/dist/lib/util/snakeCase.test.js +23 -0
  289. package/dist/lib/util/snakeCase.test.js.map +1 -0
  290. package/dist/migrations/20210831072631-add-sort-order-and-type-to-env.d.ts +5 -0
  291. package/dist/migrations/20210831072631-add-sort-order-and-type-to-env.js +14 -0
  292. package/dist/migrations/20210831072631-add-sort-order-and-type-to-env.js.map +1 -0
  293. package/dist/migrations/20210907124058-add-dbcritic-indices.d.ts +5 -0
  294. package/dist/migrations/20210907124058-add-dbcritic-indices.js +30 -0
  295. package/dist/migrations/20210907124058-add-dbcritic-indices.js.map +1 -0
  296. package/dist/migrations/20210907124850-add-dbcritic-primary-keys.d.ts +5 -0
  297. package/dist/migrations/20210907124850-add-dbcritic-primary-keys.js +18 -0
  298. package/dist/migrations/20210907124850-add-dbcritic-primary-keys.js.map +1 -0
  299. package/dist/migrations/20210908100701-add-enabled-to-environments.d.ts +5 -0
  300. package/dist/migrations/20210908100701-add-enabled-to-environments.js +14 -0
  301. package/dist/migrations/20210908100701-add-enabled-to-environments.js.map +1 -0
  302. package/dist/migrations/20210909085651-add-protected-field-to-environments.d.ts +5 -0
  303. package/dist/migrations/20210909085651-add-protected-field-to-environments.js +15 -0
  304. package/dist/migrations/20210909085651-add-protected-field-to-environments.js.map +1 -0
  305. package/dist/migrations/20210913103159-api-keys-scoping.d.ts +2 -0
  306. package/dist/migrations/20210913103159-api-keys-scoping.js +13 -0
  307. package/dist/migrations/20210913103159-api-keys-scoping.js.map +1 -0
  308. package/dist/migrations/20210915122001-add-project-and-environment-columns-to-events.d.ts +2 -0
  309. package/dist/migrations/20210915122001-add-project-and-environment-columns-to-events.js +22 -0
  310. package/dist/migrations/20210915122001-add-project-and-environment-columns-to-events.js.map +1 -0
  311. package/dist/migrations/20210920104218-rename-global-env-to-default-env.d.ts +2 -0
  312. package/dist/migrations/20210920104218-rename-global-env-to-default-env.js +25 -0
  313. package/dist/migrations/20210920104218-rename-global-env-to-default-env.js.map +1 -0
  314. package/dist/migrations/20210921105032-client-api-tokens-default.d.ts +2 -0
  315. package/dist/migrations/20210921105032-client-api-tokens-default.js +13 -0
  316. package/dist/migrations/20210921105032-client-api-tokens-default.js.map +1 -0
  317. package/dist/migrations/20210922084509-add-non-null-constraint-to-environment-type.d.ts +2 -0
  318. package/dist/migrations/20210922084509-add-non-null-constraint-to-environment-type.js +10 -0
  319. package/dist/migrations/20210922084509-add-non-null-constraint-to-environment-type.js.map +1 -0
  320. package/dist/migrations/20210922120521-add-tag-type-permission.d.ts +2 -0
  321. package/dist/migrations/20210922120521-add-tag-type-permission.js +19 -0
  322. package/dist/migrations/20210922120521-add-tag-type-permission.js.map +1 -0
  323. package/dist/migrations/20210928065411-remove-displayname-from-environments.d.ts +2 -0
  324. package/dist/migrations/20210928065411-remove-displayname-from-environments.js +10 -0
  325. package/dist/migrations/20210928065411-remove-displayname-from-environments.js.map +1 -0
  326. package/dist/migrations/20210928080601-add-development-and-production-environments.d.ts +2 -0
  327. package/dist/migrations/20210928080601-add-development-and-production-environments.js +16 -0
  328. package/dist/migrations/20210928080601-add-development-and-production-environments.js.map +1 -0
  329. package/dist/migrations/20210928082228-connect-default-environment-to-all-existing-projects.d.ts +2 -0
  330. package/dist/migrations/20210928082228-connect-default-environment-to-all-existing-projects.js +16 -0
  331. package/dist/migrations/20210928082228-connect-default-environment-to-all-existing-projects.js.map +1 -0
  332. package/dist/migrator.d.ts +3 -4
  333. package/dist/migrator.js +19 -5
  334. package/dist/migrator.js.map +1 -1
  335. package/dist/server-dev.js +1 -1
  336. package/dist/server-dev.js.map +1 -1
  337. package/dist/test/config/create-config.test.js +20 -20
  338. package/dist/test/config/create-config.test.js.map +1 -1
  339. package/dist/test/config/test-config.js +1 -1
  340. package/dist/test/config/test-config.js.map +1 -1
  341. package/dist/test/e2e/api/admin/addon.e2e.test.js +2 -2
  342. package/dist/test/e2e/api/admin/addon.e2e.test.js.map +1 -1
  343. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +8 -8
  344. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
  345. package/dist/test/e2e/api/admin/api-token.e2e.test.js +161 -12
  346. package/dist/test/e2e/api/admin/api-token.e2e.test.js.map +1 -1
  347. package/dist/test/e2e/api/admin/archive.test.js +2 -2
  348. package/dist/test/e2e/api/admin/archive.test.js.map +1 -1
  349. package/dist/test/e2e/api/admin/bootstrap.test.d.ts +1 -0
  350. package/dist/test/e2e/api/admin/{boostrap.test.js → bootstrap.test.js} +3 -3
  351. package/dist/test/e2e/api/admin/bootstrap.test.js.map +1 -0
  352. package/dist/test/e2e/api/admin/context.e2e.test.js +2 -2
  353. package/dist/test/e2e/api/admin/context.e2e.test.js.map +1 -1
  354. package/dist/test/e2e/api/admin/environment.test.js +82 -55
  355. package/dist/test/e2e/api/admin/environment.test.js.map +1 -1
  356. package/dist/test/e2e/api/admin/event.e2e.test.js +30 -2
  357. package/dist/test/e2e/api/admin/event.e2e.test.js.map +1 -1
  358. package/dist/test/e2e/api/admin/feature-archive.e2e.test.js +2 -2
  359. package/dist/test/e2e/api/admin/feature-archive.e2e.test.js.map +1 -1
  360. package/dist/test/e2e/api/admin/feature-type.test.js +2 -2
  361. package/dist/test/e2e/api/admin/feature-type.test.js.map +1 -1
  362. package/dist/test/e2e/api/admin/feature.auth.e2e.test.js +3 -3
  363. package/dist/test/e2e/api/admin/feature.auth.e2e.test.js.map +1 -1
  364. package/dist/test/e2e/api/admin/feature.custom-auth.e2e.test.js +3 -3
  365. package/dist/test/e2e/api/admin/feature.custom-auth.e2e.test.js.map +1 -1
  366. package/dist/test/e2e/api/admin/feature.e2e.test.js +71 -65
  367. package/dist/test/e2e/api/admin/feature.e2e.test.js.map +1 -1
  368. package/dist/test/e2e/api/admin/feedback.e2e.test.js +2 -2
  369. package/dist/test/e2e/api/admin/feedback.e2e.test.js.map +1 -1
  370. package/dist/test/e2e/api/admin/metrics.e2e.test.js +2 -2
  371. package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
  372. package/dist/test/e2e/api/admin/project/environments.e2e.test.d.ts +1 -0
  373. package/dist/test/e2e/api/admin/project/environments.e2e.test.js +65 -0
  374. package/dist/test/e2e/api/admin/project/environments.e2e.test.js.map +1 -0
  375. package/dist/test/e2e/api/admin/project/feature.strategy.e2e.test.js +503 -72
  376. package/dist/test/e2e/api/admin/project/feature.strategy.e2e.test.js.map +1 -1
  377. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js +4 -2
  378. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js.map +1 -1
  379. package/dist/test/e2e/api/admin/project/projects.e2e.test.d.ts +1 -0
  380. package/dist/test/e2e/api/admin/project/projects.e2e.test.js +30 -0
  381. package/dist/test/e2e/api/admin/project/projects.e2e.test.js.map +1 -0
  382. package/dist/test/e2e/api/admin/state.e2e.test.js +163 -2
  383. package/dist/test/e2e/api/admin/state.e2e.test.js.map +1 -1
  384. package/dist/test/e2e/api/admin/strategy.e2e.test.js +2 -2
  385. package/dist/test/e2e/api/admin/strategy.e2e.test.js.map +1 -1
  386. package/dist/test/e2e/api/admin/tag-types.e2e.test.js +2 -2
  387. package/dist/test/e2e/api/admin/tag-types.e2e.test.js.map +1 -1
  388. package/dist/test/e2e/api/admin/tags.e2e.test.js +2 -2
  389. package/dist/test/e2e/api/admin/tags.e2e.test.js.map +1 -1
  390. package/dist/test/e2e/api/admin/user-admin.e2e.test.js +3 -3
  391. package/dist/test/e2e/api/admin/user-admin.e2e.test.js.map +1 -1
  392. package/dist/test/e2e/api/admin/user.test.js +2 -2
  393. package/dist/test/e2e/api/admin/user.test.js.map +1 -1
  394. package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js +5 -5
  395. package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js.map +1 -1
  396. package/dist/test/e2e/api/client/feature.e2e.test.js +74 -19
  397. package/dist/test/e2e/api/client/feature.e2e.test.js.map +1 -1
  398. package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.d.ts +1 -0
  399. package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js +49 -0
  400. package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js.map +1 -0
  401. package/dist/test/e2e/api/client/feature.token.access.e2e.test.d.ts +1 -0
  402. package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +156 -0
  403. package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -0
  404. package/dist/test/e2e/api/client/metrics.e2e.access.e2e.test.d.ts +1 -0
  405. package/dist/test/e2e/api/client/metrics.e2e.access.e2e.test.js +42 -0
  406. package/dist/test/e2e/api/client/metrics.e2e.access.e2e.test.js.map +1 -0
  407. package/dist/test/e2e/api/client/metrics.e2e.test.js +12 -8
  408. package/dist/test/e2e/api/client/metrics.e2e.test.js.map +1 -1
  409. package/dist/test/e2e/api/client/register.e2e.test.js +18 -14
  410. package/dist/test/e2e/api/client/register.e2e.test.js.map +1 -1
  411. package/dist/test/e2e/custom-auth.test.js +3 -3
  412. package/dist/test/e2e/custom-auth.test.js.map +1 -1
  413. package/dist/test/e2e/health.e2e.test.js +2 -2
  414. package/dist/test/e2e/health.e2e.test.js.map +1 -1
  415. package/dist/test/e2e/helpers/database-config.d.ts +1 -1
  416. package/dist/test/e2e/helpers/database-config.js +12 -8
  417. package/dist/test/e2e/helpers/database-config.js.map +1 -1
  418. package/dist/test/e2e/helpers/database-init.d.ts +7 -1
  419. package/dist/test/e2e/helpers/database-init.js +12 -11
  420. package/dist/test/e2e/helpers/database-init.js.map +1 -1
  421. package/dist/test/e2e/helpers/database.json +5 -2
  422. package/dist/test/e2e/helpers/test-helper.js +4 -4
  423. package/dist/test/e2e/helpers/test-helper.js.map +1 -1
  424. package/dist/test/e2e/routes/routes.test.js +2 -2
  425. package/dist/test/e2e/routes/routes.test.js.map +1 -1
  426. package/dist/test/e2e/services/access-service.e2e.test.js +1 -1
  427. package/dist/test/e2e/services/access-service.e2e.test.js.map +1 -1
  428. package/dist/test/e2e/services/addon-service.e2e.test.js +2 -2
  429. package/dist/test/e2e/services/addon-service.e2e.test.js.map +1 -1
  430. package/dist/test/e2e/services/api-token-service.e2e.test.js +30 -17
  431. package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
  432. package/dist/test/e2e/services/environment-service.test.js +38 -40
  433. package/dist/test/e2e/services/environment-service.test.js.map +1 -1
  434. package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js +19 -13
  435. package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js.map +1 -1
  436. package/dist/test/e2e/services/project-health-service.e2e.test.js +12 -12
  437. package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
  438. package/dist/test/e2e/services/project-service.e2e.test.js +27 -4
  439. package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
  440. package/dist/test/e2e/services/reset-token-service.e2e.test.js +3 -3
  441. package/dist/test/e2e/services/reset-token-service.e2e.test.js.map +1 -1
  442. package/dist/test/e2e/services/session-service.e2e.test.js +1 -1
  443. package/dist/test/e2e/services/session-service.e2e.test.js.map +1 -1
  444. package/dist/test/e2e/services/setting-service.test.js +2 -2
  445. package/dist/test/e2e/services/setting-service.test.js.map +1 -1
  446. package/dist/test/e2e/services/user-service.e2e.test.js +2 -2
  447. package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
  448. package/dist/test/e2e/stores/client-application-store.e2e.test.js +1 -1
  449. package/dist/test/e2e/stores/client-application-store.e2e.test.js.map +1 -1
  450. package/dist/test/e2e/stores/event-store.e2e.test.js +1 -1
  451. package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
  452. package/dist/test/e2e/stores/feature-tag-store.e2e.test.js +4 -4
  453. package/dist/test/e2e/stores/feature-tag-store.e2e.test.js.map +1 -1
  454. package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js +1 -1
  455. package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js.map +1 -1
  456. package/dist/test/e2e/stores/feature-type-store.e2e.test.js +1 -1
  457. package/dist/test/e2e/stores/feature-type-store.e2e.test.js.map +1 -1
  458. package/dist/test/e2e/stores/project-store.e2e.test.js +5 -2
  459. package/dist/test/e2e/stores/project-store.e2e.test.js.map +1 -1
  460. package/dist/test/e2e/stores/setting-store.e2e.test.js +1 -1
  461. package/dist/test/e2e/stores/setting-store.e2e.test.js.map +1 -1
  462. package/dist/test/e2e/stores/user-feedback-store.e2e.test.js +1 -1
  463. package/dist/test/e2e/stores/user-feedback-store.e2e.test.js.map +1 -1
  464. package/dist/test/e2e/stores/user-store.e2e.test.js +1 -1
  465. package/dist/test/e2e/stores/user-store.e2e.test.js.map +1 -1
  466. package/dist/test/fixtures/fake-api-token-store.d.ts +2 -1
  467. package/dist/test/fixtures/fake-api-token-store.js.map +1 -1
  468. package/dist/test/fixtures/fake-environment-store.d.ts +5 -3
  469. package/dist/test/fixtures/fake-environment-store.js +22 -15
  470. package/dist/test/fixtures/fake-environment-store.js.map +1 -1
  471. package/dist/test/fixtures/fake-event-store.d.ts +1 -0
  472. package/dist/test/fixtures/fake-event-store.js +3 -0
  473. package/dist/test/fixtures/fake-event-store.js.map +1 -1
  474. package/dist/test/fixtures/fake-feature-environment-store.d.ts +7 -5
  475. package/dist/test/fixtures/fake-feature-environment-store.js +31 -10
  476. package/dist/test/fixtures/fake-feature-environment-store.js.map +1 -1
  477. package/dist/test/fixtures/fake-feature-strategies-store.d.ts +7 -13
  478. package/dist/test/fixtures/fake-feature-strategies-store.js +14 -51
  479. package/dist/test/fixtures/fake-feature-strategies-store.js.map +1 -1
  480. package/dist/test/fixtures/fake-feature-toggle-client-store.d.ts +9 -0
  481. package/dist/test/fixtures/fake-feature-toggle-client-store.js +50 -0
  482. package/dist/test/fixtures/fake-feature-toggle-client-store.js.map +1 -0
  483. package/dist/test/fixtures/fake-feature-toggle-store.d.ts +7 -9
  484. package/dist/test/fixtures/fake-feature-toggle-store.js +7 -14
  485. package/dist/test/fixtures/fake-feature-toggle-store.js.map +1 -1
  486. package/dist/test/fixtures/fake-project-store.d.ts +1 -2
  487. package/dist/test/fixtures/fake-project-store.js +0 -7
  488. package/dist/test/fixtures/fake-project-store.js.map +1 -1
  489. package/dist/test/fixtures/permissions.d.ts +3 -3
  490. package/dist/test/fixtures/permissions.js +5 -4
  491. package/dist/test/fixtures/permissions.js.map +1 -1
  492. package/dist/test/fixtures/store.js +2 -0
  493. package/dist/test/fixtures/store.js.map +1 -1
  494. package/package.json +51 -45
  495. package/dist/lib/extract-user.d.ts +0 -2
  496. package/dist/lib/extract-user.js +0 -6
  497. package/dist/lib/extract-user.js.map +0 -1
  498. package/dist/test/e2e/api/admin/boostrap.test.js.map +0 -1
  499. package/docs/api/oas/swagger-ui-bundle.js +0 -3
  500. package/docs/api/oas/swagger-ui-bundle.js.map +0 -1
  501. package/docs/api/oas/swagger-ui-es-bundle-core.js +0 -3
  502. package/docs/api/oas/swagger-ui-es-bundle-core.js.map +0 -1
  503. package/docs/api/oas/swagger-ui-es-bundle.js +0 -3
  504. package/docs/api/oas/swagger-ui-es-bundle.js.map +0 -1
  505. package/docs/api/oas/swagger-ui-standalone-preset.js +0 -3
  506. package/docs/api/oas/swagger-ui-standalone-preset.js.map +0 -1
  507. package/docs/api/oas/swagger-ui.css +0 -8906
  508. package/docs/api/oas/swagger-ui.css.map +0 -1
  509. package/docs/api/oas/swagger-ui.js +0 -3
  510. package/docs/api/oas/swagger-ui.js.map +0 -1
  511. package/docs/api/oas/swagger.json +0 -1479
@@ -6,16 +6,58 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const database_init_1 = __importDefault(require("../../../helpers/database-init"));
7
7
  const test_helper_1 = require("../../../helpers/test-helper");
8
8
  const no_logger_1 = __importDefault(require("../../../../fixtures/no-logger"));
9
+ const constants_1 = require("../../../../../lib/util/constants");
10
+ const events_1 = require("../../../../../lib/types/events");
9
11
  let app;
10
12
  let db;
13
+ const sortOrderFirst = 0;
14
+ const sortOrderSecond = 10;
15
+ const sortOrderDefault = 9999;
11
16
  beforeAll(async () => {
12
- db = await database_init_1.default('feature_strategy_api_serial', no_logger_1.default);
13
- app = await test_helper_1.setupApp(db.stores);
17
+ db = await (0, database_init_1.default)('feature_strategy_api_serial', no_logger_1.default);
18
+ app = await (0, test_helper_1.setupApp)(db.stores);
19
+ });
20
+ afterEach(async () => {
21
+ const all = await db.stores.projectStore.getEnvironmentsForProject('default');
22
+ await Promise.all(all
23
+ .filter((env) => env !== constants_1.DEFAULT_ENV)
24
+ .map(async (env) => db.stores.projectStore.deleteEnvironmentForProject('default', env)));
14
25
  });
15
26
  afterAll(async () => {
16
27
  await app.destroy();
17
28
  await db.destroy();
18
29
  });
30
+ async function addStrategies(featureName, envName) {
31
+ await app.request
32
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`)
33
+ .send({
34
+ name: 'default',
35
+ parameters: {
36
+ userId: 'string',
37
+ },
38
+ })
39
+ .expect(200);
40
+ await app.request
41
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`)
42
+ .send({
43
+ name: 'default',
44
+ parameters: {
45
+ userId: 'string',
46
+ },
47
+ sortOrder: sortOrderFirst,
48
+ })
49
+ .expect(200);
50
+ await app.request
51
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`)
52
+ .send({
53
+ name: 'default',
54
+ parameters: {
55
+ userId: 'string',
56
+ },
57
+ sortOrder: sortOrderSecond,
58
+ })
59
+ .expect(200);
60
+ }
19
61
  test('Trying to add a strategy configuration to environment not connected to toggle should fail', async () => {
20
62
  await app.request
21
63
  .post('/api/admin/features')
@@ -100,11 +142,10 @@ test('Project overview includes environment connected to feature', async () => {
100
142
  expect(res.body.name).toBe('com.test.environment');
101
143
  expect(res.body.createdAt).toBeTruthy();
102
144
  });
103
- await app.request
104
- .post('/api/admin/environments')
105
- .send({ name: 'project-overview', displayName: 'Project Overview' })
106
- .set('Content-Type', 'application/json')
107
- .expect(201);
145
+ await db.stores.environmentStore.create({
146
+ name: 'project-overview',
147
+ type: 'production',
148
+ });
108
149
  await app.request
109
150
  .post('/api/admin/projects/default/environments')
110
151
  .send({ environment: 'project-overview' })
@@ -113,7 +154,7 @@ test('Project overview includes environment connected to feature', async () => {
113
154
  .get('/api/admin/projects/default')
114
155
  .expect(200)
115
156
  .expect((r) => {
116
- expect(r.body.features[0].environments[0].name).toBe(':global:');
157
+ expect(r.body.features[0].environments[0].name).toBe(constants_1.DEFAULT_ENV);
117
158
  expect(r.body.features[0].environments[1].name).toBe('project-overview');
118
159
  });
119
160
  });
@@ -131,11 +172,10 @@ test('Disconnecting environment from project, removes environment from features
131
172
  expect(res.body.name).toBe('com.test.disconnect.environment');
132
173
  expect(res.body.createdAt).toBeTruthy();
133
174
  });
134
- await app.request
135
- .post('/api/admin/environments')
136
- .send({ name: 'dis-project-overview', displayName: 'Project Overview' })
137
- .set('Content-Type', 'application/json')
138
- .expect(201);
175
+ await db.stores.environmentStore.create({
176
+ name: 'dis-project-overview',
177
+ type: 'production',
178
+ });
139
179
  await app.request
140
180
  .post('/api/admin/projects/default/environments')
141
181
  .send({ environment: 'dis-project-overview' })
@@ -150,17 +190,14 @@ test('Disconnecting environment from project, removes environment from features
150
190
  expect(r.body.features.some((e) => e.environment === 'dis-project-overview')).toBeFalsy();
151
191
  });
152
192
  });
153
- test('Can enable/disable environment for feature', async () => {
193
+ test('Can enable/disable environment for feature with strategies', async () => {
154
194
  const envName = 'enable-feature-environment';
195
+ const featureName = 'com.test.enable.environment';
155
196
  // Create environment
156
- await app.request
157
- .post('/api/admin/environments')
158
- .send({
197
+ await db.stores.environmentStore.create({
159
198
  name: envName,
160
- displayName: 'Enable feature for environment',
161
- })
162
- .set('Content-Type', 'application/json')
163
- .expect(201);
199
+ type: 'production',
200
+ });
164
201
  // Connect environment to project
165
202
  await app.request
166
203
  .post('/api/admin/projects/default/environments')
@@ -172,21 +209,30 @@ test('Can enable/disable environment for feature', async () => {
172
209
  await app.request
173
210
  .post('/api/admin/projects/default/features')
174
211
  .send({
175
- name: 'com.test.enable.environment',
176
- strategies: [{ name: 'default' }],
212
+ name: featureName,
177
213
  })
178
214
  .set('Content-Type', 'application/json')
179
215
  .expect(201)
180
216
  .expect((res) => {
181
- expect(res.body.name).toBe('com.test.enable.environment');
217
+ expect(res.body.name).toBe(featureName);
182
218
  expect(res.body.createdAt).toBeTruthy();
183
219
  });
220
+ // Add strategy to it
184
221
  await app.request
185
- .post('/api/admin/projects/default/features/com.test.enable.environment/environments/enable-feature-environment/on')
186
- .send({})
222
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`)
223
+ .send({
224
+ name: 'default',
225
+ parameters: {
226
+ userId: 'string',
227
+ },
228
+ })
187
229
  .expect(200);
188
230
  await app.request
189
- .get('/api/admin/projects/default/features/com.test.enable.environment')
231
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${envName}/on`)
232
+ .set('Content-Type', 'application/json')
233
+ .expect(200);
234
+ await app.request
235
+ .get(`/api/admin/projects/default/features/${featureName}`)
190
236
  .expect(200)
191
237
  .expect('Content-Type', /json/)
192
238
  .expect((res) => {
@@ -195,11 +241,11 @@ test('Can enable/disable environment for feature', async () => {
195
241
  expect(enabledFeatureEnv.enabled).toBe(true);
196
242
  });
197
243
  await app.request
198
- .post('/api/admin/projects/default/features/com.test.enable.environment/environments/enable-feature-environment/off')
244
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${envName}/off`)
199
245
  .send({})
200
246
  .expect(200);
201
247
  await app.request
202
- .get('/api/admin/projects/default/features/com.test.enable.environment')
248
+ .get(`/api/admin/projects/default/features/${featureName}`)
203
249
  .expect(200)
204
250
  .expect('Content-Type', /json/)
205
251
  .expect((res) => {
@@ -230,6 +276,15 @@ test('Can use new project feature toggle endpoint to create feature toggle witho
230
276
  expect(res.body.project).toBe('default');
231
277
  });
232
278
  });
279
+ test('Can create feature toggle without strategies', async () => {
280
+ const name = 'new.toggle.without.strategy.2';
281
+ await app.request
282
+ .post('/api/admin/projects/default/features')
283
+ .send({ name });
284
+ const { body: toggle } = await app.request.get(`/api/admin/projects/default/features/${name}`);
285
+ expect(toggle.environments).toHaveLength(1);
286
+ expect(toggle.environments[0].strategies).toHaveLength(0);
287
+ });
233
288
  test('Still validates feature toggle input when creating', async () => {
234
289
  await app.request
235
290
  .post('/api/admin/projects/default/features')
@@ -266,14 +321,10 @@ test('Trying to create toggle under project that does not exist should fail', as
266
321
  test('Can get environment info for feature toggle', async () => {
267
322
  const envName = 'environment-info';
268
323
  // Create environment
269
- await app.request
270
- .post('/api/admin/environments')
271
- .send({
324
+ await db.stores.environmentStore.create({
272
325
  name: envName,
273
- displayName: 'Enable feature for environment',
274
- })
275
- .set('Content-Type', 'application/json')
276
- .expect(201);
326
+ type: 'production',
327
+ });
277
328
  // Connect environment to project
278
329
  await app.request
279
330
  .post('/api/admin/projects/default/environments')
@@ -322,17 +373,96 @@ test('Getting feature that does not exist should yield 404', async () => {
322
373
  .get('/api/admin/projects/default/features/non.existing.feature')
323
374
  .expect(404);
324
375
  });
325
- test('Can add strategy to feature toggle', async () => {
326
- const envName = 'add-strategy';
327
- // Create environment
376
+ test('Should update feature toggle', async () => {
377
+ const url = '/api/admin/projects/default/features';
378
+ const name = 'new.toggle.update';
379
+ await app.request
380
+ .post(url)
381
+ .send({ name, description: 'some', type: 'release' })
382
+ .expect(201);
383
+ await app.request
384
+ .put(`${url}/${name}`)
385
+ .send({ name, description: 'updated', type: 'kill-switch' })
386
+ .expect(200);
387
+ const { body: toggle } = await app.request.get(`${url}/${name}`);
388
+ expect(toggle.name).toBe(name);
389
+ expect(toggle.description).toBe('updated');
390
+ expect(toggle.type).toBe('kill-switch');
391
+ expect(toggle.archived).toBeFalsy();
392
+ });
393
+ test('Should not change name of feature toggle', async () => {
394
+ const url = '/api/admin/projects/default/features';
395
+ const name = 'new.toggle.update.2';
396
+ await app.request
397
+ .post(url)
398
+ .send({ name, description: 'some', type: 'release' })
399
+ .expect(201);
400
+ await app.request
401
+ .put(`${url}/${name}`)
402
+ .send({ name: 'new name', description: 'updated', type: 'kill-switch' })
403
+ .expect(400);
404
+ });
405
+ test('Should not change project of feature toggle even if it is part of body', async () => {
406
+ const url = '/api/admin/projects/default/features';
407
+ const name = 'new.toggle.update.3';
328
408
  await app.request
329
- .post('/api/admin/environments')
409
+ .post(url)
410
+ .send({ name, description: 'some', type: 'release' })
411
+ .expect(201);
412
+ const { body } = await app.request
413
+ .put(`${url}/${name}`)
330
414
  .send({
331
- name: envName,
332
- displayName: 'Enable feature for environment',
415
+ name,
416
+ description: 'updated',
417
+ type: 'kill-switch',
418
+ project: 'new',
333
419
  })
334
- .set('Content-Type', 'application/json')
420
+ .expect(200);
421
+ expect(body.project).toBe('default');
422
+ });
423
+ test('Should patch feature toggle', async () => {
424
+ const url = '/api/admin/projects/default/features';
425
+ const name = 'new.toggle.patch';
426
+ await app.request
427
+ .post(url)
428
+ .send({ name, description: 'some', type: 'release' })
429
+ .expect(201);
430
+ await app.request
431
+ .patch(`${url}/${name}`)
432
+ .send([
433
+ { op: 'replace', path: '/description', value: 'New desc' },
434
+ { op: 'replace', path: '/type', value: 'kill-switch' },
435
+ ])
436
+ .expect(200);
437
+ const { body: toggle } = await app.request.get(`${url}/${name}`);
438
+ expect(toggle.name).toBe(name);
439
+ expect(toggle.description).toBe('New desc');
440
+ expect(toggle.type).toBe('kill-switch');
441
+ expect(toggle.archived).toBeFalsy();
442
+ });
443
+ test('Should archive feature toggle', async () => {
444
+ const url = '/api/admin/projects/default/features';
445
+ const name = 'new.toggle.archive';
446
+ await app.request
447
+ .post(url)
448
+ .send({ name, description: 'some', type: 'release' })
335
449
  .expect(201);
450
+ await app.request.delete(`${url}/${name}`);
451
+ await app.request.get(`${url}/${name}`).expect(404);
452
+ const { body } = await app.request
453
+ .get(`/api/admin/archive/features`)
454
+ .expect(200);
455
+ const toggle = body.features.find((f) => f.name === name);
456
+ expect(toggle).toBeDefined();
457
+ });
458
+ test('Can add strategy to feature toggle to a "some-env-2"', async () => {
459
+ const envName = 'some-env-2';
460
+ const featureName = 'feature.strategy.toggle';
461
+ // Create environment
462
+ await db.stores.environmentStore.create({
463
+ name: envName,
464
+ type: 'production',
465
+ });
336
466
  // Connect environment to project
337
467
  await app.request
338
468
  .post('/api/admin/projects/default/environments')
@@ -340,7 +470,6 @@ test('Can add strategy to feature toggle', async () => {
340
470
  environment: envName,
341
471
  })
342
472
  .expect(200);
343
- const featureName = 'feature.strategy.toggle';
344
473
  await app.request
345
474
  .post('/api/admin/projects/default/features')
346
475
  .send({ name: featureName })
@@ -357,20 +486,79 @@ test('Can add strategy to feature toggle', async () => {
357
486
  await app.request
358
487
  .get(`/api/admin/projects/default/features/${featureName}`)
359
488
  .expect((res) => {
360
- expect(res.body.environments[0].strategies).toHaveLength(1);
489
+ const env = res.body.environments.find((e) => e.name === envName);
490
+ expect(env.strategies).toHaveLength(1);
361
491
  });
362
492
  });
363
- test('Can get strategies for feature and environment', async () => {
364
- const envName = 'get-strategy';
365
- // Create environment
493
+ test('Environments are returned in sortOrder', async () => {
494
+ const sortedSecond = 'sortedSecond';
495
+ const sortedLast = 'sortedLast';
496
+ const featureName = 'feature.strategy.toggle.sortOrder';
497
+ // Create environments
498
+ await db.stores.environmentStore.create({
499
+ name: sortedLast,
500
+ type: 'production',
501
+ sortOrder: 8000,
502
+ });
503
+ await db.stores.environmentStore.create({
504
+ name: sortedSecond,
505
+ type: 'production',
506
+ sortOrder: 8,
507
+ });
508
+ // Connect environments to project
366
509
  await app.request
367
- .post('/api/admin/environments')
510
+ .post('/api/admin/projects/default/environments')
368
511
  .send({
369
- name: envName,
370
- displayName: 'Enable feature for environment',
512
+ environment: sortedSecond,
371
513
  })
372
- .set('Content-Type', 'application/json')
514
+ .expect(200);
515
+ await app.request
516
+ .post('/api/admin/projects/default/environments')
517
+ .send({
518
+ environment: sortedLast,
519
+ })
520
+ .expect(200);
521
+ /* Create feature toggle */
522
+ await app.request
523
+ .post('/api/admin/projects/default/features')
524
+ .send({ name: featureName })
373
525
  .expect(201);
526
+ /* create strategies connected to feature toggle */
527
+ await app.request
528
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${sortedSecond}/strategies`)
529
+ .send({
530
+ name: 'default',
531
+ parameters: {
532
+ userId: 'string',
533
+ },
534
+ })
535
+ .expect(200);
536
+ await app.request
537
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${sortedLast}/strategies`)
538
+ .send({
539
+ name: 'default',
540
+ parameters: {
541
+ userId: 'string',
542
+ },
543
+ })
544
+ .expect(200);
545
+ await app.request
546
+ .get(`/api/admin/projects/default/features/${featureName}`)
547
+ .expect(200)
548
+ .expect((res) => {
549
+ expect(res.body.environments).toHaveLength(3);
550
+ expect(res.body.environments[0].name).toBe(constants_1.DEFAULT_ENV);
551
+ expect(res.body.environments[1].name).toBe(sortedSecond);
552
+ expect(res.body.environments[2].name).toBe(sortedLast);
553
+ });
554
+ });
555
+ test('Can get strategies for feature and environment', async () => {
556
+ const envName = 'get-strategy';
557
+ // Create environment
558
+ await db.stores.environmentStore.create({
559
+ name: envName,
560
+ type: 'production',
561
+ });
374
562
  // Connect environment to project
375
563
  await app.request
376
564
  .post('/api/admin/projects/default/environments')
@@ -413,14 +601,10 @@ test('Getting strategies for environment that does not exist yields 404', async
413
601
  test('Can update a strategy based on id', async () => {
414
602
  const envName = 'feature.update.strategies';
415
603
  // Create environment
416
- await app.request
417
- .post('/api/admin/environments')
418
- .send({
604
+ await db.stores.environmentStore.create({
419
605
  name: envName,
420
- displayName: 'Enable feature for environment',
421
- })
422
- .set('Content-Type', 'application/json')
423
- .expect(201);
606
+ type: 'production',
607
+ });
424
608
  // Connect environment to project
425
609
  await app.request
426
610
  .post('/api/admin/projects/default/environments')
@@ -461,14 +645,10 @@ test('Can update a strategy based on id', async () => {
461
645
  test('Trying to update a non existing feature strategy should yield 404', async () => {
462
646
  const envName = 'feature.non.existing.strategy';
463
647
  // Create environment
464
- await app.request
465
- .post('/api/admin/environments')
466
- .send({
648
+ await db.stores.environmentStore.create({
467
649
  name: envName,
468
- displayName: 'Enable feature for environment',
469
- })
470
- .set('Content-Type', 'application/json')
471
- .expect(201);
650
+ type: 'production',
651
+ });
472
652
  // Connect environment to project
473
653
  await app.request
474
654
  .post('/api/admin/projects/default/environments')
@@ -486,17 +666,59 @@ test('Trying to update a non existing feature strategy should yield 404', async
486
666
  .send({ parameters: { fancyField: 'string' } })
487
667
  .expect(404);
488
668
  });
489
- test('Trying to get a non existing feature strategy should yield 404', async () => {
490
- const envName = 'feature.non.existing.strategy.get';
669
+ test('Can patch a strategy based on id', async () => {
670
+ const BASE_URI = '/api/admin/projects/default';
671
+ const envName = 'feature.patch.strategies';
672
+ const featureName = 'feature.patch.strategies';
491
673
  // Create environment
674
+ await db.stores.environmentStore.create({
675
+ name: envName,
676
+ type: 'test',
677
+ });
678
+ // Connect environment to project
492
679
  await app.request
493
- .post('/api/admin/environments')
680
+ .post(`${BASE_URI}/environments`)
494
681
  .send({
495
- name: envName,
496
- displayName: 'Enable feature for environment',
682
+ environment: envName,
497
683
  })
498
- .set('Content-Type', 'application/json')
684
+ .expect(200);
685
+ await app.request
686
+ .post(`${BASE_URI}/features`)
687
+ .send({ name: featureName })
499
688
  .expect(201);
689
+ let strategy;
690
+ await app.request
691
+ .post(`${BASE_URI}/features/${featureName}/environments/${envName}/strategies`)
692
+ .send({
693
+ name: 'flexibleRollout',
694
+ parameters: {
695
+ groupId: 'demo',
696
+ rollout: 20,
697
+ stickiness: 'default',
698
+ },
699
+ })
700
+ .expect(200)
701
+ .expect((res) => {
702
+ strategy = res.body;
703
+ });
704
+ await app.request
705
+ .patch(`${BASE_URI}/features/${featureName}/environments/${envName}/strategies/${strategy.id}`)
706
+ .send([{ op: 'replace', path: '/parameters/rollout', value: 42 }])
707
+ .expect(200);
708
+ await app.request
709
+ .get(`${BASE_URI}/features/${featureName}/environments/${envName}/strategies/${strategy.id}`)
710
+ .expect(200)
711
+ .expect((res) => {
712
+ expect(res.body.parameters.rollout).toBe(42);
713
+ });
714
+ });
715
+ test('Trying to get a non existing feature strategy should yield 404', async () => {
716
+ const envName = 'feature.non.existing.strategy.get';
717
+ // Create environment
718
+ await db.stores.environmentStore.create({
719
+ name: envName,
720
+ type: 'production',
721
+ });
500
722
  // Connect environment to project
501
723
  await app.request
502
724
  .post('/api/admin/projects/default/environments')
@@ -513,4 +735,213 @@ test('Trying to get a non existing feature strategy should yield 404', async ()
513
735
  .get(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies/some-non-existing-id`)
514
736
  .expect(404);
515
737
  });
738
+ test('Can not enable environment for feature without strategies', async () => {
739
+ const environment = 'some-env';
740
+ const featureName = 'com.test.enable.environment.disabled';
741
+ // Create environment
742
+ await db.stores.environmentStore.create({
743
+ name: environment,
744
+ type: 'test',
745
+ });
746
+ // Connect environment to project
747
+ await app.request
748
+ .post('/api/admin/projects/default/environments')
749
+ .send({ environment })
750
+ .expect(200);
751
+ // Create feature
752
+ await app.request
753
+ .post('/api/admin/projects/default/features')
754
+ .send({
755
+ name: featureName,
756
+ })
757
+ .set('Content-Type', 'application/json')
758
+ .expect(201);
759
+ await app.request
760
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${environment}/on`)
761
+ .set('Content-Type', 'application/json')
762
+ .expect(403);
763
+ await app.request
764
+ .get(`/api/admin/projects/default/features/${featureName}`)
765
+ .expect(200)
766
+ .expect('Content-Type', /json/)
767
+ .expect((res) => {
768
+ const enabledFeatureEnv = res.body.environments.find((e) => e.name === environment);
769
+ expect(enabledFeatureEnv.enabled).toBe(false);
770
+ expect(enabledFeatureEnv.type).toBe('test');
771
+ });
772
+ });
773
+ test('Enabling environment creates a FEATURE_ENVIRONMENT_ENABLED event', async () => {
774
+ const environment = 'environment_enabled_env';
775
+ const featureName = 'com.test.enable.environment.event.sent';
776
+ // Create environment
777
+ await db.stores.environmentStore.create({
778
+ name: environment,
779
+ type: 'test',
780
+ });
781
+ // Connect environment to project
782
+ await app.request
783
+ .post('/api/admin/projects/default/environments')
784
+ .send({ environment })
785
+ .expect(200);
786
+ // Create feature
787
+ await app.request
788
+ .post('/api/admin/projects/default/features')
789
+ .send({
790
+ name: featureName,
791
+ })
792
+ .set('Content-Type', 'application/json')
793
+ .expect(201);
794
+ await app.request
795
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${environment}/strategies`)
796
+ .send({ name: 'default', constraints: [], properties: {} })
797
+ .expect(200);
798
+ await app.request
799
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${environment}/on`)
800
+ .set('Content-Type', 'application/json')
801
+ .expect(200);
802
+ const events = await db.stores.eventStore.getAll({
803
+ type: events_1.FEATURE_ENVIRONMENT_ENABLED,
804
+ });
805
+ const enabledEvents = events.filter((e) => e.data.name === featureName);
806
+ expect(enabledEvents).toHaveLength(1);
807
+ });
808
+ test('Disabling environment creates a FEATURE_ENVIRONMENT_DISABLED event', async () => {
809
+ const environment = 'environment_disabled_env';
810
+ const featureName = 'com.test.enable.environment_disabled.sent';
811
+ // Create environment
812
+ await db.stores.environmentStore.create({
813
+ name: environment,
814
+ type: 'test',
815
+ });
816
+ // Connect environment to project
817
+ await app.request
818
+ .post('/api/admin/projects/default/environments')
819
+ .send({ environment })
820
+ .expect(200);
821
+ // Create feature
822
+ await app.request
823
+ .post('/api/admin/projects/default/features')
824
+ .send({
825
+ name: featureName,
826
+ })
827
+ .set('Content-Type', 'application/json')
828
+ .expect(201);
829
+ await app.request
830
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${environment}/strategies`)
831
+ .send({ name: 'default', constraints: [], properties: {} })
832
+ .expect(200);
833
+ await app.request
834
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${environment}/off`)
835
+ .set('Content-Type', 'application/json')
836
+ .expect(200);
837
+ const events = await db.stores.eventStore.getAll({
838
+ type: events_1.FEATURE_ENVIRONMENT_DISABLED,
839
+ });
840
+ const ourFeatureEvent = events.find((e) => e.data.name === featureName);
841
+ expect(ourFeatureEvent).toBeTruthy();
842
+ });
843
+ test('Can delete strategy from feature toggle', async () => {
844
+ const envName = 'del-strategy';
845
+ const featureName = 'feature.strategy.toggle.delete.strategy';
846
+ // Create environment
847
+ await db.stores.environmentStore.create({
848
+ name: envName,
849
+ type: 'test',
850
+ });
851
+ // Connect environment to project
852
+ await app.request
853
+ .post('/api/admin/projects/default/environments')
854
+ .send({
855
+ environment: envName,
856
+ })
857
+ .expect(200);
858
+ await app.request
859
+ .post('/api/admin/projects/default/features')
860
+ .send({ name: featureName })
861
+ .expect(201);
862
+ await app.request
863
+ .post(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`)
864
+ .send({
865
+ name: 'default',
866
+ parameters: {
867
+ userId: 'string',
868
+ },
869
+ })
870
+ .expect(200);
871
+ const { body } = await app.request.get(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`);
872
+ const strategies = body;
873
+ const strategyId = strategies[0].id;
874
+ await app.request
875
+ .delete(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies/${strategyId}`)
876
+ .expect(200);
877
+ });
878
+ test('List of strategies should respect sortOrder', async () => {
879
+ const envName = 'sortOrderdel-strategy';
880
+ const featureName = 'feature.sort.order.one';
881
+ // Create environment
882
+ await db.stores.environmentStore.create({
883
+ name: envName,
884
+ type: 'test',
885
+ });
886
+ // Connect environment to project
887
+ await app.request
888
+ .post('/api/admin/projects/default/environments')
889
+ .send({
890
+ environment: envName,
891
+ })
892
+ .expect(200);
893
+ await app.request
894
+ .post('/api/admin/projects/default/features')
895
+ .send({ name: featureName })
896
+ .expect(201);
897
+ await addStrategies(featureName, envName);
898
+ const { body } = await app.request.get(`/api/admin/projects/default/features/${featureName}/environments/${envName}/strategies`);
899
+ const strategies = body;
900
+ expect(strategies[0].sortOrder).toBe(sortOrderFirst);
901
+ expect(strategies[1].sortOrder).toBe(sortOrderSecond);
902
+ expect(strategies[2].sortOrder).toBe(sortOrderDefault);
903
+ });
904
+ test('Feature strategies list should respect strategy sortorders for each environment', async () => {
905
+ const envName = 'sort-order-within-environment-one';
906
+ const secondEnv = 'sort-order-within-environment-two';
907
+ const featureName = 'feature.sort.order.environment.list';
908
+ // Create environment
909
+ await db.stores.environmentStore.create({
910
+ name: envName,
911
+ type: 'test',
912
+ });
913
+ await db.stores.environmentStore.create({
914
+ name: secondEnv,
915
+ type: 'test',
916
+ });
917
+ // Connect environment to project
918
+ await app.request
919
+ .post('/api/admin/projects/default/environments')
920
+ .send({
921
+ environment: envName,
922
+ })
923
+ .expect(200);
924
+ await app.request
925
+ .post('/api/admin/projects/default/environments')
926
+ .send({
927
+ environment: secondEnv,
928
+ })
929
+ .expect(200);
930
+ await app.request
931
+ .post('/api/admin/projects/default/features')
932
+ .send({ name: featureName })
933
+ .expect(201);
934
+ await addStrategies(featureName, envName);
935
+ await addStrategies(featureName, secondEnv);
936
+ const response = await app.request.get(`/api/admin/projects/default/features/${featureName}`);
937
+ const { body } = response;
938
+ let { strategies } = body.environments.find((e) => e.name === envName);
939
+ expect(strategies[0].sortOrder).toBe(sortOrderFirst);
940
+ expect(strategies[1].sortOrder).toBe(sortOrderSecond);
941
+ expect(strategies[2].sortOrder).toBe(sortOrderDefault);
942
+ strategies = body.environments.find((e) => e.name === secondEnv).strategies;
943
+ expect(strategies[0].sortOrder).toBe(sortOrderFirst);
944
+ expect(strategies[1].sortOrder).toBe(sortOrderSecond);
945
+ expect(strategies[2].sortOrder).toBe(sortOrderDefault);
946
+ });
516
947
  //# sourceMappingURL=feature.strategy.e2e.test.js.map