@budibase/backend-core 2.9.19 → 2.9.21-alpha.0

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 (250) hide show
  1. package/dist/index.js +266 -324
  2. package/dist/index.js.map +4 -4
  3. package/dist/index.js.meta.json +1 -1
  4. package/dist/package.json +19 -4
  5. package/dist/plugins.js +1 -1
  6. package/dist/plugins.js.map +1 -1
  7. package/dist/plugins.js.meta.json +1 -1
  8. package/dist/src/security/permissions.d.ts +1 -1
  9. package/dist/tests.js +222 -260
  10. package/dist/tests.js.map +4 -4
  11. package/dist/tests.js.meta.json +1 -1
  12. package/package.json +19 -4
  13. package/dist/tsconfig.build.tsbuildinfo +0 -1
  14. package/src/accounts/accounts.ts +0 -82
  15. package/src/accounts/api.ts +0 -59
  16. package/src/accounts/index.ts +0 -1
  17. package/src/auth/auth.ts +0 -208
  18. package/src/auth/index.ts +0 -1
  19. package/src/auth/tests/auth.spec.ts +0 -14
  20. package/src/blacklist/blacklist.ts +0 -54
  21. package/src/blacklist/index.ts +0 -1
  22. package/src/blacklist/tests/blacklist.spec.ts +0 -46
  23. package/src/cache/appMetadata.ts +0 -88
  24. package/src/cache/base/index.ts +0 -92
  25. package/src/cache/generic.ts +0 -30
  26. package/src/cache/index.ts +0 -5
  27. package/src/cache/tests/writethrough.spec.ts +0 -138
  28. package/src/cache/user.ts +0 -69
  29. package/src/cache/writethrough.ts +0 -133
  30. package/src/configs/configs.ts +0 -257
  31. package/src/configs/index.ts +0 -1
  32. package/src/configs/tests/configs.spec.ts +0 -184
  33. package/src/constants/db.ts +0 -63
  34. package/src/constants/index.ts +0 -2
  35. package/src/constants/misc.ts +0 -50
  36. package/src/context/Context.ts +0 -14
  37. package/src/context/identity.ts +0 -58
  38. package/src/context/index.ts +0 -3
  39. package/src/context/mainContext.ts +0 -310
  40. package/src/context/tests/index.spec.ts +0 -147
  41. package/src/context/types.ts +0 -11
  42. package/src/db/Replication.ts +0 -84
  43. package/src/db/constants.ts +0 -10
  44. package/src/db/couch/DatabaseImpl.ts +0 -238
  45. package/src/db/couch/connections.ts +0 -77
  46. package/src/db/couch/index.ts +0 -5
  47. package/src/db/couch/pouchDB.ts +0 -97
  48. package/src/db/couch/pouchDump.ts +0 -0
  49. package/src/db/couch/utils.ts +0 -50
  50. package/src/db/db.ts +0 -39
  51. package/src/db/errors.ts +0 -14
  52. package/src/db/index.ts +0 -12
  53. package/src/db/lucene.ts +0 -732
  54. package/src/db/searchIndexes/index.ts +0 -1
  55. package/src/db/searchIndexes/searchIndexes.ts +0 -62
  56. package/src/db/tests/index.spec.js +0 -25
  57. package/src/db/tests/lucene.spec.ts +0 -298
  58. package/src/db/tests/pouch.spec.js +0 -62
  59. package/src/db/tests/utils.spec.ts +0 -63
  60. package/src/db/utils.ts +0 -207
  61. package/src/db/views.ts +0 -241
  62. package/src/docIds/conversions.ts +0 -59
  63. package/src/docIds/ids.ts +0 -113
  64. package/src/docIds/index.ts +0 -2
  65. package/src/docIds/newid.ts +0 -5
  66. package/src/docIds/params.ts +0 -174
  67. package/src/docUpdates/index.ts +0 -29
  68. package/src/environment.ts +0 -201
  69. package/src/errors/errors.ts +0 -119
  70. package/src/errors/index.ts +0 -1
  71. package/src/events/analytics.ts +0 -6
  72. package/src/events/asyncEvents/index.ts +0 -2
  73. package/src/events/asyncEvents/publisher.ts +0 -12
  74. package/src/events/asyncEvents/queue.ts +0 -22
  75. package/src/events/backfill.ts +0 -183
  76. package/src/events/documentId.ts +0 -56
  77. package/src/events/events.ts +0 -40
  78. package/src/events/identification.ts +0 -310
  79. package/src/events/index.ts +0 -14
  80. package/src/events/processors/AnalyticsProcessor.ts +0 -64
  81. package/src/events/processors/AuditLogsProcessor.ts +0 -93
  82. package/src/events/processors/LoggingProcessor.ts +0 -37
  83. package/src/events/processors/Processors.ts +0 -52
  84. package/src/events/processors/async/DocumentUpdateProcessor.ts +0 -43
  85. package/src/events/processors/index.ts +0 -19
  86. package/src/events/processors/posthog/PosthogProcessor.ts +0 -118
  87. package/src/events/processors/posthog/index.ts +0 -2
  88. package/src/events/processors/posthog/rateLimiting.ts +0 -106
  89. package/src/events/processors/posthog/tests/PosthogProcessor.spec.ts +0 -168
  90. package/src/events/processors/types.ts +0 -1
  91. package/src/events/publishers/account.ts +0 -35
  92. package/src/events/publishers/app.ts +0 -155
  93. package/src/events/publishers/auditLog.ts +0 -26
  94. package/src/events/publishers/auth.ts +0 -73
  95. package/src/events/publishers/automation.ts +0 -110
  96. package/src/events/publishers/backfill.ts +0 -74
  97. package/src/events/publishers/backup.ts +0 -42
  98. package/src/events/publishers/datasource.ts +0 -48
  99. package/src/events/publishers/email.ts +0 -17
  100. package/src/events/publishers/environmentVariable.ts +0 -38
  101. package/src/events/publishers/group.ts +0 -99
  102. package/src/events/publishers/index.ts +0 -24
  103. package/src/events/publishers/installation.ts +0 -38
  104. package/src/events/publishers/layout.ts +0 -26
  105. package/src/events/publishers/license.ts +0 -84
  106. package/src/events/publishers/org.ts +0 -37
  107. package/src/events/publishers/plugin.ts +0 -47
  108. package/src/events/publishers/query.ts +0 -88
  109. package/src/events/publishers/role.ts +0 -62
  110. package/src/events/publishers/rows.ts +0 -29
  111. package/src/events/publishers/screen.ts +0 -36
  112. package/src/events/publishers/serve.ts +0 -43
  113. package/src/events/publishers/table.ts +0 -70
  114. package/src/events/publishers/user.ts +0 -202
  115. package/src/events/publishers/view.ts +0 -107
  116. package/src/featureFlags/index.ts +0 -77
  117. package/src/featureFlags/tests/featureFlags.spec.ts +0 -85
  118. package/src/helpers.ts +0 -9
  119. package/src/index.ts +0 -53
  120. package/src/installation.ts +0 -107
  121. package/src/logging/alerts.ts +0 -26
  122. package/src/logging/correlation/correlation.ts +0 -13
  123. package/src/logging/correlation/index.ts +0 -1
  124. package/src/logging/correlation/middleware.ts +0 -17
  125. package/src/logging/index.ts +0 -4
  126. package/src/logging/pino/logger.ts +0 -232
  127. package/src/logging/pino/middleware.ts +0 -45
  128. package/src/logging/system.ts +0 -81
  129. package/src/logging/tests/system.spec.ts +0 -61
  130. package/src/middleware/adminOnly.ts +0 -9
  131. package/src/middleware/auditLog.ts +0 -6
  132. package/src/middleware/authenticated.ts +0 -193
  133. package/src/middleware/builderOnly.ts +0 -20
  134. package/src/middleware/builderOrAdmin.ts +0 -20
  135. package/src/middleware/csrf.ts +0 -81
  136. package/src/middleware/errorHandling.ts +0 -29
  137. package/src/middleware/index.ts +0 -21
  138. package/src/middleware/internalApi.ts +0 -23
  139. package/src/middleware/joi-validator.ts +0 -45
  140. package/src/middleware/matchers.ts +0 -47
  141. package/src/middleware/passport/datasource/google.ts +0 -95
  142. package/src/middleware/passport/local.ts +0 -54
  143. package/src/middleware/passport/sso/google.ts +0 -77
  144. package/src/middleware/passport/sso/oidc.ts +0 -154
  145. package/src/middleware/passport/sso/sso.ts +0 -165
  146. package/src/middleware/passport/sso/tests/google.spec.ts +0 -67
  147. package/src/middleware/passport/sso/tests/oidc.spec.ts +0 -152
  148. package/src/middleware/passport/sso/tests/sso.spec.ts +0 -197
  149. package/src/middleware/passport/utils.ts +0 -38
  150. package/src/middleware/querystringToBody.ts +0 -28
  151. package/src/middleware/tenancy.ts +0 -36
  152. package/src/middleware/tests/builder.spec.ts +0 -180
  153. package/src/middleware/tests/matchers.spec.ts +0 -134
  154. package/src/migrations/definitions.ts +0 -40
  155. package/src/migrations/index.ts +0 -2
  156. package/src/migrations/migrations.ts +0 -191
  157. package/src/migrations/tests/__snapshots__/migrations.spec.ts.snap +0 -11
  158. package/src/migrations/tests/migrations.spec.ts +0 -64
  159. package/src/objectStore/buckets/app.ts +0 -40
  160. package/src/objectStore/buckets/global.ts +0 -29
  161. package/src/objectStore/buckets/index.ts +0 -3
  162. package/src/objectStore/buckets/plugins.ts +0 -71
  163. package/src/objectStore/buckets/tests/app.spec.ts +0 -171
  164. package/src/objectStore/buckets/tests/global.spec.ts +0 -74
  165. package/src/objectStore/buckets/tests/plugins.spec.ts +0 -111
  166. package/src/objectStore/cloudfront.ts +0 -41
  167. package/src/objectStore/index.ts +0 -3
  168. package/src/objectStore/objectStore.ts +0 -440
  169. package/src/objectStore/utils.ts +0 -27
  170. package/src/platform/index.ts +0 -3
  171. package/src/platform/platformDb.ts +0 -6
  172. package/src/platform/tenants.ts +0 -101
  173. package/src/platform/tests/tenants.spec.ts +0 -26
  174. package/src/platform/users.ts +0 -90
  175. package/src/plugin/index.ts +0 -1
  176. package/src/plugin/tests/validation.spec.ts +0 -83
  177. package/src/plugin/utils.ts +0 -156
  178. package/src/queue/constants.ts +0 -6
  179. package/src/queue/inMemoryQueue.ts +0 -141
  180. package/src/queue/index.ts +0 -2
  181. package/src/queue/listeners.ts +0 -195
  182. package/src/queue/queue.ts +0 -54
  183. package/src/redis/index.ts +0 -6
  184. package/src/redis/init.ts +0 -86
  185. package/src/redis/redis.ts +0 -308
  186. package/src/redis/redlockImpl.ts +0 -139
  187. package/src/redis/utils.ts +0 -117
  188. package/src/security/encryption.ts +0 -179
  189. package/src/security/permissions.ts +0 -159
  190. package/src/security/roles.ts +0 -420
  191. package/src/security/sessions.ts +0 -120
  192. package/src/security/tests/encryption.spec.ts +0 -31
  193. package/src/security/tests/permissions.spec.ts +0 -145
  194. package/src/security/tests/sessions.spec.ts +0 -12
  195. package/src/tenancy/db.ts +0 -6
  196. package/src/tenancy/index.ts +0 -2
  197. package/src/tenancy/tenancy.ts +0 -140
  198. package/src/tenancy/tests/tenancy.spec.ts +0 -184
  199. package/src/timers/index.ts +0 -1
  200. package/src/timers/timers.ts +0 -22
  201. package/src/users/db.ts +0 -460
  202. package/src/users/events.ts +0 -176
  203. package/src/users/index.ts +0 -4
  204. package/src/users/lookup.ts +0 -102
  205. package/src/users/users.ts +0 -276
  206. package/src/users/utils.ts +0 -55
  207. package/src/utils/hashing.ts +0 -14
  208. package/src/utils/index.ts +0 -3
  209. package/src/utils/stringUtils.ts +0 -8
  210. package/src/utils/tests/utils.spec.ts +0 -191
  211. package/src/utils/utils.ts +0 -239
  212. package/tests/core/logging.ts +0 -34
  213. package/tests/core/utilities/index.ts +0 -6
  214. package/tests/core/utilities/jestUtils.ts +0 -30
  215. package/tests/core/utilities/mocks/alerts.ts +0 -3
  216. package/tests/core/utilities/mocks/date.ts +0 -2
  217. package/tests/core/utilities/mocks/events.ts +0 -131
  218. package/tests/core/utilities/mocks/fetch.ts +0 -17
  219. package/tests/core/utilities/mocks/index.ts +0 -10
  220. package/tests/core/utilities/mocks/licenses.ts +0 -107
  221. package/tests/core/utilities/mocks/posthog.ts +0 -7
  222. package/tests/core/utilities/structures/Chance.ts +0 -20
  223. package/tests/core/utilities/structures/accounts.ts +0 -115
  224. package/tests/core/utilities/structures/apps.ts +0 -21
  225. package/tests/core/utilities/structures/common.ts +0 -7
  226. package/tests/core/utilities/structures/db.ts +0 -12
  227. package/tests/core/utilities/structures/documents/index.ts +0 -1
  228. package/tests/core/utilities/structures/documents/platform/index.ts +0 -1
  229. package/tests/core/utilities/structures/documents/platform/installation.ts +0 -12
  230. package/tests/core/utilities/structures/generator.ts +0 -2
  231. package/tests/core/utilities/structures/index.ts +0 -15
  232. package/tests/core/utilities/structures/koa.ts +0 -16
  233. package/tests/core/utilities/structures/licenses.ts +0 -167
  234. package/tests/core/utilities/structures/plugins.ts +0 -19
  235. package/tests/core/utilities/structures/quotas.ts +0 -67
  236. package/tests/core/utilities/structures/scim.ts +0 -80
  237. package/tests/core/utilities/structures/shared.ts +0 -19
  238. package/tests/core/utilities/structures/sso.ts +0 -119
  239. package/tests/core/utilities/structures/tenants.ts +0 -5
  240. package/tests/core/utilities/structures/userGroups.ts +0 -10
  241. package/tests/core/utilities/structures/users.ts +0 -73
  242. package/tests/core/utilities/testContainerUtils.ts +0 -98
  243. package/tests/core/utilities/utils/index.ts +0 -1
  244. package/tests/core/utilities/utils/time.ts +0 -3
  245. package/tests/extra/DBTestConfiguration.ts +0 -36
  246. package/tests/extra/index.ts +0 -2
  247. package/tests/extra/testEnv.ts +0 -95
  248. package/tests/index.ts +0 -1
  249. package/tests/jestEnv.ts +0 -6
  250. package/tests/jestSetup.ts +0 -28
@@ -1,202 +0,0 @@
1
- import { publishEvent } from "../events"
2
- import {
3
- Event,
4
- User,
5
- UserCreatedEvent,
6
- UserDataCollaborationEvent,
7
- UserDeletedEvent,
8
- UserInviteAcceptedEvent,
9
- UserInvitedEvent,
10
- UserPasswordForceResetEvent,
11
- UserPasswordResetEvent,
12
- UserPasswordResetRequestedEvent,
13
- UserPasswordUpdatedEvent,
14
- UserPermissionAssignedEvent,
15
- UserPermissionRemovedEvent,
16
- UserUpdatedEvent,
17
- UserOnboardingEvent,
18
- } from "@budibase/types"
19
- import { isScim } from "../../context"
20
-
21
- async function created(user: User, timestamp?: number) {
22
- const properties: UserCreatedEvent = {
23
- userId: user._id as string,
24
- viaScim: isScim(),
25
- audited: {
26
- email: user.email,
27
- },
28
- }
29
- await publishEvent(Event.USER_CREATED, properties, timestamp)
30
- }
31
-
32
- async function updated(user: User) {
33
- const properties: UserUpdatedEvent = {
34
- userId: user._id as string,
35
- viaScim: isScim(),
36
- audited: {
37
- email: user.email,
38
- },
39
- }
40
- await publishEvent(Event.USER_UPDATED, properties)
41
- }
42
-
43
- async function deleted(user: User) {
44
- const properties: UserDeletedEvent = {
45
- userId: user._id as string,
46
- viaScim: isScim(),
47
- audited: {
48
- email: user.email,
49
- },
50
- }
51
- await publishEvent(Event.USER_DELETED, properties)
52
- }
53
-
54
- export async function onboardingComplete(user: User) {
55
- const properties: UserOnboardingEvent = {
56
- userId: user._id as string,
57
- audited: {
58
- email: user.email,
59
- },
60
- }
61
- await publishEvent(Event.USER_ONBOARDING_COMPLETE, properties)
62
- }
63
-
64
- // PERMISSIONS
65
-
66
- async function permissionAdminAssigned(user: User, timestamp?: number) {
67
- const properties: UserPermissionAssignedEvent = {
68
- userId: user._id as string,
69
- audited: {
70
- email: user.email,
71
- },
72
- }
73
- await publishEvent(
74
- Event.USER_PERMISSION_ADMIN_ASSIGNED,
75
- properties,
76
- timestamp
77
- )
78
- }
79
-
80
- async function permissionAdminRemoved(user: User) {
81
- const properties: UserPermissionRemovedEvent = {
82
- userId: user._id as string,
83
- audited: {
84
- email: user.email,
85
- },
86
- }
87
- await publishEvent(Event.USER_PERMISSION_ADMIN_REMOVED, properties)
88
- }
89
-
90
- async function permissionBuilderAssigned(user: User, timestamp?: number) {
91
- const properties: UserPermissionAssignedEvent = {
92
- userId: user._id as string,
93
- audited: {
94
- email: user.email,
95
- },
96
- }
97
- await publishEvent(
98
- Event.USER_PERMISSION_BUILDER_ASSIGNED,
99
- properties,
100
- timestamp
101
- )
102
- }
103
-
104
- async function permissionBuilderRemoved(user: User) {
105
- const properties: UserPermissionRemovedEvent = {
106
- userId: user._id as string,
107
- audited: {
108
- email: user.email,
109
- },
110
- }
111
- await publishEvent(Event.USER_PERMISSION_BUILDER_REMOVED, properties)
112
- }
113
-
114
- // INVITE
115
-
116
- async function invited(email: string) {
117
- const properties: UserInvitedEvent = {
118
- audited: {
119
- email,
120
- },
121
- }
122
- await publishEvent(Event.USER_INVITED, properties)
123
- }
124
-
125
- async function inviteAccepted(user: User) {
126
- const properties: UserInviteAcceptedEvent = {
127
- userId: user._id as string,
128
- audited: {
129
- email: user.email,
130
- },
131
- }
132
- await publishEvent(Event.USER_INVITED_ACCEPTED, properties)
133
- }
134
-
135
- // PASSWORD
136
-
137
- async function passwordForceReset(user: User) {
138
- const properties: UserPasswordForceResetEvent = {
139
- userId: user._id as string,
140
- audited: {
141
- email: user.email,
142
- },
143
- }
144
- await publishEvent(Event.USER_PASSWORD_FORCE_RESET, properties)
145
- }
146
-
147
- async function passwordUpdated(user: User) {
148
- const properties: UserPasswordUpdatedEvent = {
149
- userId: user._id as string,
150
- audited: {
151
- email: user.email,
152
- },
153
- }
154
- await publishEvent(Event.USER_PASSWORD_UPDATED, properties)
155
- }
156
-
157
- async function passwordResetRequested(user: User) {
158
- const properties: UserPasswordResetRequestedEvent = {
159
- userId: user._id as string,
160
- audited: {
161
- email: user.email,
162
- },
163
- }
164
- await publishEvent(Event.USER_PASSWORD_RESET_REQUESTED, properties)
165
- }
166
-
167
- async function passwordReset(user: User) {
168
- const properties: UserPasswordResetEvent = {
169
- userId: user._id as string,
170
- audited: {
171
- email: user.email,
172
- },
173
- }
174
- await publishEvent(Event.USER_PASSWORD_RESET, properties)
175
- }
176
-
177
- // COLLABORATION
178
-
179
- async function dataCollaboration(users: number) {
180
- const properties: UserDataCollaborationEvent = {
181
- users,
182
- }
183
- await publishEvent(Event.USER_DATA_COLLABORATION, properties)
184
- }
185
-
186
- export default {
187
- created,
188
- updated,
189
- deleted,
190
- permissionAdminAssigned,
191
- permissionAdminRemoved,
192
- permissionBuilderAssigned,
193
- permissionBuilderRemoved,
194
- onboardingComplete,
195
- invited,
196
- inviteAccepted,
197
- passwordForceReset,
198
- passwordUpdated,
199
- passwordResetRequested,
200
- passwordReset,
201
- dataCollaboration,
202
- }
@@ -1,107 +0,0 @@
1
- import { publishEvent } from "../events"
2
- import {
3
- Event,
4
- ViewCalculationCreatedEvent,
5
- ViewCalculationDeletedEvent,
6
- ViewCalculationUpdatedEvent,
7
- ViewCreatedEvent,
8
- ViewDeletedEvent,
9
- ViewExportedEvent,
10
- ViewFilterCreatedEvent,
11
- ViewFilterDeletedEvent,
12
- ViewFilterUpdatedEvent,
13
- ViewUpdatedEvent,
14
- View,
15
- ViewCalculation,
16
- Table,
17
- TableExportFormat,
18
- } from "@budibase/types"
19
-
20
- /* eslint-disable */
21
-
22
- async function created(view: View, timestamp?: string | number) {
23
- const properties: ViewCreatedEvent = {
24
- tableId: view.tableId,
25
- }
26
- await publishEvent(Event.VIEW_CREATED, properties, timestamp)
27
- }
28
-
29
- async function updated(view: View) {
30
- const properties: ViewUpdatedEvent = {
31
- tableId: view.tableId,
32
- }
33
- await publishEvent(Event.VIEW_UPDATED, properties)
34
- }
35
-
36
- async function deleted(view: View) {
37
- const properties: ViewDeletedEvent = {
38
- tableId: view.tableId,
39
- }
40
- await publishEvent(Event.VIEW_DELETED, properties)
41
- }
42
-
43
- async function exported(table: Table, format: TableExportFormat) {
44
- const properties: ViewExportedEvent = {
45
- tableId: table._id as string,
46
- format,
47
- }
48
- await publishEvent(Event.VIEW_EXPORTED, properties)
49
- }
50
-
51
- async function filterCreated(view: View, timestamp?: string | number) {
52
- const properties: ViewFilterCreatedEvent = {
53
- tableId: view.tableId,
54
- }
55
- await publishEvent(Event.VIEW_FILTER_CREATED, properties, timestamp)
56
- }
57
-
58
- async function filterUpdated(view: View) {
59
- const properties: ViewFilterUpdatedEvent = {
60
- tableId: view.tableId,
61
- }
62
- await publishEvent(Event.VIEW_FILTER_UPDATED, properties)
63
- }
64
-
65
- async function filterDeleted(view: View) {
66
- const properties: ViewFilterDeletedEvent = {
67
- tableId: view.tableId,
68
- }
69
- await publishEvent(Event.VIEW_FILTER_DELETED, properties)
70
- }
71
-
72
- async function calculationCreated(view: View, timestamp?: string | number) {
73
- const properties: ViewCalculationCreatedEvent = {
74
- tableId: view.tableId,
75
- calculation: view.calculation as ViewCalculation,
76
- }
77
- await publishEvent(Event.VIEW_CALCULATION_CREATED, properties, timestamp)
78
- }
79
-
80
- async function calculationUpdated(view: View) {
81
- const properties: ViewCalculationUpdatedEvent = {
82
- tableId: view.tableId,
83
- calculation: view.calculation as ViewCalculation,
84
- }
85
- await publishEvent(Event.VIEW_CALCULATION_UPDATED, properties)
86
- }
87
-
88
- async function calculationDeleted(existingView: View) {
89
- const properties: ViewCalculationDeletedEvent = {
90
- tableId: existingView.tableId,
91
- calculation: existingView.calculation as ViewCalculation,
92
- }
93
- await publishEvent(Event.VIEW_CALCULATION_DELETED, properties)
94
- }
95
-
96
- export default {
97
- created,
98
- updated,
99
- deleted,
100
- exported,
101
- filterCreated,
102
- filterUpdated,
103
- filterDeleted,
104
- calculationCreated,
105
- calculationUpdated,
106
- calculationDeleted,
107
- }
@@ -1,77 +0,0 @@
1
- import env from "../environment"
2
- import * as context from "../context"
3
-
4
- /**
5
- * Read the TENANT_FEATURE_FLAGS env var and return an array of features flags for each tenant.
6
- * The env var is formatted as:
7
- * tenant1:feature1:feature2,tenant2:feature1
8
- */
9
- export function buildFeatureFlags() {
10
- if (!env.TENANT_FEATURE_FLAGS) {
11
- return
12
- }
13
-
14
- const tenantFeatureFlags: Record<string, string[]> = {}
15
-
16
- env.TENANT_FEATURE_FLAGS.split(",").forEach(tenantToFeatures => {
17
- const [tenantId, ...features] = tenantToFeatures.split(":")
18
-
19
- features.forEach(feature => {
20
- if (!tenantFeatureFlags[tenantId]) {
21
- tenantFeatureFlags[tenantId] = []
22
- }
23
- tenantFeatureFlags[tenantId].push(feature)
24
- })
25
- })
26
-
27
- return tenantFeatureFlags
28
- }
29
-
30
- export function isEnabled(featureFlag: string) {
31
- const tenantId = context.getTenantId()
32
- const flags = getTenantFeatureFlags(tenantId)
33
- return flags.includes(featureFlag)
34
- }
35
-
36
- export function getTenantFeatureFlags(tenantId: string) {
37
- let flags: string[] = []
38
- const envFlags = buildFeatureFlags()
39
- if (envFlags) {
40
- const globalFlags = envFlags["*"]
41
- const tenantFlags = envFlags[tenantId] || []
42
-
43
- // Explicitly exclude tenants from global features if required.
44
- // Prefix the tenant flag with '!'
45
- const tenantOverrides = tenantFlags.reduce(
46
- (acc: string[], flag: string) => {
47
- if (flag.startsWith("!")) {
48
- let stripped = flag.substring(1)
49
- acc.push(stripped)
50
- }
51
- return acc
52
- },
53
- []
54
- )
55
-
56
- if (globalFlags) {
57
- flags.push(...globalFlags)
58
- }
59
- if (tenantFlags.length) {
60
- flags.push(...tenantFlags)
61
- }
62
-
63
- // Purge any tenant specific overrides
64
- flags = flags.filter(flag => {
65
- return tenantOverrides.indexOf(flag) == -1 && !flag.startsWith("!")
66
- })
67
- }
68
-
69
- return flags
70
- }
71
-
72
- export enum TenantFeatureFlag {
73
- LICENSING = "LICENSING",
74
- GOOGLE_SHEETS = "GOOGLE_SHEETS",
75
- USER_GROUPS = "USER_GROUPS",
76
- ONBOARDING_TOUR = "ONBOARDING_TOUR",
77
- }
@@ -1,85 +0,0 @@
1
- import {
2
- TenantFeatureFlag,
3
- buildFeatureFlags,
4
- getTenantFeatureFlags,
5
- } from "../"
6
- import env from "../../environment"
7
-
8
- const { ONBOARDING_TOUR, LICENSING, USER_GROUPS } = TenantFeatureFlag
9
-
10
- describe("featureFlags", () => {
11
- beforeEach(() => {
12
- env._set("TENANT_FEATURE_FLAGS", "")
13
- })
14
-
15
- it("Should return no flags when the TENANT_FEATURE_FLAG is empty", async () => {
16
- let features = buildFeatureFlags()
17
- expect(features).toBeUndefined()
18
- })
19
-
20
- it("Should generate a map of global and named tenant feature flags from the env value", async () => {
21
- env._set(
22
- "TENANT_FEATURE_FLAGS",
23
- `*:${ONBOARDING_TOUR},tenant1:!${ONBOARDING_TOUR},tenant2:${USER_GROUPS},tenant1:${LICENSING}`
24
- )
25
-
26
- const parsedFlags: Record<string, string[]> = {
27
- "*": [ONBOARDING_TOUR],
28
- tenant1: [`!${ONBOARDING_TOUR}`, LICENSING],
29
- tenant2: [USER_GROUPS],
30
- }
31
-
32
- let features = buildFeatureFlags()
33
-
34
- expect(features).toBeDefined()
35
- expect(features).toEqual(parsedFlags)
36
- })
37
-
38
- it("Should add feature flag flag only to explicitly configured tenant", async () => {
39
- env._set(
40
- "TENANT_FEATURE_FLAGS",
41
- `*:${LICENSING},*:${USER_GROUPS},tenant1:${ONBOARDING_TOUR}`
42
- )
43
-
44
- let tenant1Flags = getTenantFeatureFlags("tenant1")
45
- let tenant2Flags = getTenantFeatureFlags("tenant2")
46
-
47
- expect(tenant1Flags).toBeDefined()
48
- expect(tenant1Flags).toEqual([LICENSING, USER_GROUPS, ONBOARDING_TOUR])
49
-
50
- expect(tenant2Flags).toBeDefined()
51
- expect(tenant2Flags).toEqual([LICENSING, USER_GROUPS])
52
- })
53
- })
54
-
55
- it("Should exclude tenant1 from global feature flag", async () => {
56
- env._set(
57
- "TENANT_FEATURE_FLAGS",
58
- `*:${LICENSING},*:${ONBOARDING_TOUR},tenant1:!${ONBOARDING_TOUR}`
59
- )
60
-
61
- let tenant1Flags = getTenantFeatureFlags("tenant1")
62
- let tenant2Flags = getTenantFeatureFlags("tenant2")
63
-
64
- expect(tenant1Flags).toBeDefined()
65
- expect(tenant1Flags).toEqual([LICENSING])
66
-
67
- expect(tenant2Flags).toBeDefined()
68
- expect(tenant2Flags).toEqual([LICENSING, ONBOARDING_TOUR])
69
- })
70
-
71
- it("Should explicitly add flags to configured tenants only", async () => {
72
- env._set(
73
- "TENANT_FEATURE_FLAGS",
74
- `tenant1:${ONBOARDING_TOUR},tenant1:${LICENSING},tenant2:${LICENSING}`
75
- )
76
-
77
- let tenant1Flags = getTenantFeatureFlags("tenant1")
78
- let tenant2Flags = getTenantFeatureFlags("tenant2")
79
-
80
- expect(tenant1Flags).toBeDefined()
81
- expect(tenant1Flags).toEqual([ONBOARDING_TOUR, LICENSING])
82
-
83
- expect(tenant2Flags).toBeDefined()
84
- expect(tenant2Flags).toEqual([LICENSING])
85
- })
package/src/helpers.ts DELETED
@@ -1,9 +0,0 @@
1
- /**
2
- * Makes sure that a URL has the correct number of slashes, while maintaining the
3
- * http(s):// double slashes.
4
- * @param {string} url The URL to test and remove any extra double slashes.
5
- * @return {string} The updated url.
6
- */
7
- export function checkSlashesInUrl(url: string) {
8
- return url.replace(/(https?:\/\/)|(\/)+/g, "$1$2")
9
- }
package/src/index.ts DELETED
@@ -1,53 +0,0 @@
1
- export * as configs from "./configs"
2
- export * as events from "./events"
3
- export * as migrations from "./migrations"
4
- export * as users from "./users"
5
- export * as roles from "./security/roles"
6
- export * as permissions from "./security/permissions"
7
- export * as accounts from "./accounts"
8
- export * as installation from "./installation"
9
- export * as featureFlags from "./featureFlags"
10
- export * as sessions from "./security/sessions"
11
- export * as platform from "./platform"
12
- export * as auth from "./auth"
13
- export * as constants from "./constants"
14
- export * as logging from "./logging"
15
- export * as middleware from "./middleware"
16
- export * as plugins from "./plugin"
17
- export * as encryption from "./security/encryption"
18
- export * as queue from "./queue"
19
- export * as db from "./db"
20
- export * as context from "./context"
21
- export * as cache from "./cache"
22
- export * as objectStore from "./objectStore"
23
- export * as redis from "./redis"
24
- export { Client as RedisClient } from "./redis"
25
- export * as locks from "./redis/redlockImpl"
26
- export * as utils from "./utils"
27
- export * as errors from "./errors"
28
- export * as timers from "./timers"
29
- export { default as env } from "./environment"
30
- export * as blacklist from "./blacklist"
31
- export * as docUpdates from "./docUpdates"
32
- export { SearchParams } from "./db"
33
- // Add context to tenancy for backwards compatibility
34
- // only do this for external usages to prevent internal
35
- // circular dependencies
36
- import * as context from "./context"
37
- import * as _tenancy from "./tenancy"
38
- export const tenancy = {
39
- ..._tenancy,
40
- ...context,
41
- }
42
-
43
- // expose error classes directly
44
- export * from "./errors"
45
-
46
- // expose constants directly
47
- export * from "./constants"
48
-
49
- // expose package init function
50
- import * as db from "./db"
51
- export const init = (opts: any = {}) => {
52
- db.init(opts.db)
53
- }
@@ -1,107 +0,0 @@
1
- import { newid } from "./utils"
2
- import * as events from "./events"
3
- import { StaticDatabases } from "./db"
4
- import { doWithDB } from "./db"
5
- import { Installation, IdentityType, Database } from "@budibase/types"
6
- import * as context from "./context"
7
- import semver from "semver"
8
- import { bustCache, withCache, TTL, CacheKey } from "./cache/generic"
9
- import environment from "./environment"
10
-
11
- export const getInstall = async (): Promise<Installation> => {
12
- return withCache(CacheKey.INSTALLATION, TTL.ONE_DAY, getInstallFromDB, {
13
- useTenancy: false,
14
- })
15
- }
16
- async function createInstallDoc(platformDb: Database) {
17
- const install: Installation = {
18
- _id: StaticDatabases.PLATFORM_INFO.docs.install,
19
- installId: newid(),
20
- version: environment.VERSION,
21
- }
22
- try {
23
- const resp = await platformDb.put(install)
24
- install._rev = resp.rev
25
- return install
26
- } catch (err: any) {
27
- if (err.status === 409) {
28
- return getInstallFromDB()
29
- } else {
30
- throw err
31
- }
32
- }
33
- }
34
-
35
- export const getInstallFromDB = async (): Promise<Installation> => {
36
- return doWithDB(
37
- StaticDatabases.PLATFORM_INFO.name,
38
- async (platformDb: any) => {
39
- let install: Installation
40
- try {
41
- install = await platformDb.get(
42
- StaticDatabases.PLATFORM_INFO.docs.install
43
- )
44
- } catch (e: any) {
45
- if (e.status === 404) {
46
- install = await createInstallDoc(platformDb)
47
- } else {
48
- throw e
49
- }
50
- }
51
- return install
52
- }
53
- )
54
- }
55
-
56
- const updateVersion = async (version: string): Promise<boolean> => {
57
- try {
58
- await doWithDB(
59
- StaticDatabases.PLATFORM_INFO.name,
60
- async (platformDb: any) => {
61
- const install = await getInstall()
62
- install.version = version
63
- await platformDb.put(install)
64
- await bustCache(CacheKey.INSTALLATION)
65
- }
66
- )
67
- } catch (e: any) {
68
- if (e.status === 409) {
69
- // do nothing - version has already been updated
70
- // likely in clustered environment
71
- return false
72
- }
73
- throw e
74
- }
75
- return true
76
- }
77
-
78
- export const checkInstallVersion = async (): Promise<void> => {
79
- const install = await getInstall()
80
-
81
- const currentVersion = install.version
82
- const newVersion = environment.VERSION
83
-
84
- if (currentVersion !== newVersion) {
85
- const isUpgrade = semver.gt(newVersion, currentVersion)
86
- const isDowngrade = semver.lt(newVersion, currentVersion)
87
-
88
- const success = await updateVersion(newVersion)
89
-
90
- if (success) {
91
- await context.doInIdentityContext(
92
- {
93
- _id: install.installId,
94
- type: IdentityType.INSTALLATION,
95
- },
96
- async () => {
97
- if (isUpgrade) {
98
- await events.installation.upgraded(currentVersion, newVersion)
99
- } else if (isDowngrade) {
100
- await events.installation.downgraded(currentVersion, newVersion)
101
- }
102
- }
103
- )
104
- await events.identification.identifyInstallationGroup(install.installId)
105
- }
106
- }
107
- }
@@ -1,26 +0,0 @@
1
- const NonErrors = ["AccountError"]
2
-
3
- function isSuppressed(e?: any) {
4
- return e && e["suppressAlert"]
5
- }
6
-
7
- export function logAlert(message: string, e?: any) {
8
- if (e && NonErrors.includes(e.name) && isSuppressed(e)) {
9
- return
10
- }
11
- console.error(`bb-alert: ${message}`, e)
12
- }
13
-
14
- export function logAlertWithInfo(
15
- message: string,
16
- db: string,
17
- id: string,
18
- error: any
19
- ) {
20
- message = `${message} - db: ${db} - doc: ${id} - error: `
21
- logAlert(message, error)
22
- }
23
-
24
- export function logWarn(message: string, e?: any) {
25
- console.warn(`bb-warn: ${message}`, e)
26
- }
@@ -1,13 +0,0 @@
1
- import { Header } from "../../constants"
2
- const correlator = require("correlation-id")
3
-
4
- export const setHeader = (headers: any) => {
5
- const correlationId = correlator.getId()
6
- if (correlationId) {
7
- headers[Header.CORRELATION_ID] = correlationId
8
- }
9
- }
10
-
11
- export function getId() {
12
- return correlator.getId()
13
- }
@@ -1 +0,0 @@
1
- export * from "./correlation"
@@ -1,17 +0,0 @@
1
- import { Header } from "../../constants"
2
- import { v4 as uuid } from "uuid"
3
- const correlator = require("correlation-id")
4
-
5
- const correlation = (ctx: any, next: any) => {
6
- // use the provided correlation id header if present
7
- let correlationId = ctx.headers[Header.CORRELATION_ID]
8
- if (!correlationId) {
9
- correlationId = uuid()
10
- }
11
-
12
- return correlator.withId(correlationId, () => {
13
- return next()
14
- })
15
- }
16
-
17
- export default correlation