@intlayer/backend 7.2.1-canary.1 → 7.2.2

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 (288) hide show
  1. package/dist/esm/utils/AI/aiSdk.mjs +7 -1
  2. package/dist/esm/utils/AI/aiSdk.mjs.map +1 -1
  3. package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
  4. package/dist/types/controllers/tag.controller.d.ts.map +1 -1
  5. package/dist/types/emails/InviteUserEmail.d.ts +4 -4
  6. package/dist/types/emails/InviteUserEmail.d.ts.map +1 -1
  7. package/dist/types/emails/MagicLinkEmail.d.ts +4 -4
  8. package/dist/types/emails/OAuthTokenCreatedEmail.d.ts +4 -4
  9. package/dist/types/emails/OAuthTokenCreatedEmail.d.ts.map +1 -1
  10. package/dist/types/emails/PasswordChangeConfirmation.d.ts +4 -4
  11. package/dist/types/emails/ResetUserPassword.d.ts +4 -4
  12. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +4 -4
  13. package/dist/types/emails/SubscriptionPaymentError.d.ts +4 -4
  14. package/dist/types/emails/SubscriptionPaymentError.d.ts.map +1 -1
  15. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +4 -4
  16. package/dist/types/emails/ValidateUserEmail.d.ts +4 -4
  17. package/dist/types/emails/Welcome.d.ts +4 -4
  18. package/dist/types/emails/Welcome.d.ts.map +1 -1
  19. package/dist/types/models/dictionary.model.d.ts +4 -4
  20. package/dist/types/models/dictionary.model.d.ts.map +1 -1
  21. package/dist/types/models/discussion.model.d.ts +2 -2
  22. package/dist/types/models/oAuth2.model.d.ts +3 -3
  23. package/dist/types/models/oAuth2.model.d.ts.map +1 -1
  24. package/dist/types/routes/ai.routes.d.ts.map +1 -1
  25. package/dist/types/routes/eventListener.routes.d.ts.map +1 -1
  26. package/dist/types/routes/project.routes.d.ts.map +1 -1
  27. package/dist/types/schemas/dictionary.schema.d.ts +6 -6
  28. package/dist/types/schemas/dictionary.schema.d.ts.map +1 -1
  29. package/dist/types/schemas/discussion.schema.d.ts +6 -6
  30. package/dist/types/schemas/oAuth2.schema.d.ts +5 -5
  31. package/dist/types/schemas/organization.schema.d.ts +6 -6
  32. package/dist/types/schemas/plans.schema.d.ts +6 -6
  33. package/dist/types/schemas/project.schema.d.ts +6 -6
  34. package/dist/types/schemas/project.schema.d.ts.map +1 -1
  35. package/dist/types/schemas/session.schema.d.ts +6 -6
  36. package/dist/types/schemas/tag.schema.d.ts +6 -6
  37. package/dist/types/schemas/user.schema.d.ts +6 -6
  38. package/dist/types/utils/filtersAndPagination/getDictionaryFiltersAndPagination.d.ts +2 -2
  39. package/dist/types/utils/filtersAndPagination/getDiscussionFiltersAndPagination.d.ts +2 -2
  40. package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts +2 -2
  41. package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts +2 -2
  42. package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts +2 -2
  43. package/package.json +17 -18
  44. package/dist/cjs/_virtual/_utils_asset.cjs +0 -98
  45. package/dist/cjs/_virtual/rolldown_runtime.cjs +0 -25
  46. package/dist/cjs/controllers/ai.controller.cjs +0 -381
  47. package/dist/cjs/controllers/ai.controller.cjs.map +0 -1
  48. package/dist/cjs/controllers/dictionary.controller.cjs +0 -463
  49. package/dist/cjs/controllers/dictionary.controller.cjs.map +0 -1
  50. package/dist/cjs/controllers/eventListener.controller.cjs +0 -53
  51. package/dist/cjs/controllers/eventListener.controller.cjs.map +0 -1
  52. package/dist/cjs/controllers/newsletter.controller.cjs +0 -164
  53. package/dist/cjs/controllers/newsletter.controller.cjs.map +0 -1
  54. package/dist/cjs/controllers/oAuth2.controller.cjs +0 -22
  55. package/dist/cjs/controllers/oAuth2.controller.cjs.map +0 -1
  56. package/dist/cjs/controllers/organization.controller.cjs +0 -492
  57. package/dist/cjs/controllers/organization.controller.cjs.map +0 -1
  58. package/dist/cjs/controllers/project.controller.cjs +0 -430
  59. package/dist/cjs/controllers/project.controller.cjs.map +0 -1
  60. package/dist/cjs/controllers/projectAccessKey.controller.cjs +0 -161
  61. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +0 -1
  62. package/dist/cjs/controllers/search.controller.cjs +0 -14
  63. package/dist/cjs/controllers/search.controller.cjs.map +0 -1
  64. package/dist/cjs/controllers/stripe.controller.cjs +0 -149
  65. package/dist/cjs/controllers/stripe.controller.cjs.map +0 -1
  66. package/dist/cjs/controllers/tag.controller.cjs +0 -226
  67. package/dist/cjs/controllers/tag.controller.cjs.map +0 -1
  68. package/dist/cjs/controllers/user.controller.cjs +0 -269
  69. package/dist/cjs/controllers/user.controller.cjs.map +0 -1
  70. package/dist/cjs/emails/InviteUserEmail.cjs +0 -325
  71. package/dist/cjs/emails/InviteUserEmail.cjs.map +0 -1
  72. package/dist/cjs/emails/MagicLinkEmail.cjs +0 -242
  73. package/dist/cjs/emails/MagicLinkEmail.cjs.map +0 -1
  74. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs +0 -301
  75. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs.map +0 -1
  76. package/dist/cjs/emails/PasswordChangeConfirmation.cjs +0 -177
  77. package/dist/cjs/emails/PasswordChangeConfirmation.cjs.map +0 -1
  78. package/dist/cjs/emails/ResetUserPassword.cjs +0 -240
  79. package/dist/cjs/emails/ResetUserPassword.cjs.map +0 -1
  80. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs +0 -202
  81. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs.map +0 -1
  82. package/dist/cjs/emails/SubscriptionPaymentError.cjs +0 -202
  83. package/dist/cjs/emails/SubscriptionPaymentError.cjs.map +0 -1
  84. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs +0 -208
  85. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs.map +0 -1
  86. package/dist/cjs/emails/ValidateUserEmail.cjs +0 -240
  87. package/dist/cjs/emails/ValidateUserEmail.cjs.map +0 -1
  88. package/dist/cjs/emails/Welcome.cjs +0 -216
  89. package/dist/cjs/emails/Welcome.cjs.map +0 -1
  90. package/dist/cjs/emails/index.cjs +0 -25
  91. package/dist/cjs/export.cjs +0 -24
  92. package/dist/cjs/index.cjs +0 -91
  93. package/dist/cjs/index.cjs.map +0 -1
  94. package/dist/cjs/logger/index.cjs +0 -13
  95. package/dist/cjs/logger/index.cjs.map +0 -1
  96. package/dist/cjs/middlewares/oAuth2.middleware.cjs +0 -42
  97. package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +0 -1
  98. package/dist/cjs/middlewares/request.middleware.cjs +0 -17
  99. package/dist/cjs/middlewares/request.middleware.cjs.map +0 -1
  100. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +0 -22
  101. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +0 -1
  102. package/dist/cjs/models/dictionary.model.cjs +0 -10
  103. package/dist/cjs/models/dictionary.model.cjs.map +0 -1
  104. package/dist/cjs/models/discussion.model.cjs +0 -10
  105. package/dist/cjs/models/discussion.model.cjs.map +0 -1
  106. package/dist/cjs/models/oAuth2.model.cjs +0 -10
  107. package/dist/cjs/models/oAuth2.model.cjs.map +0 -1
  108. package/dist/cjs/models/organization.model.cjs +0 -10
  109. package/dist/cjs/models/organization.model.cjs.map +0 -1
  110. package/dist/cjs/models/project.model.cjs +0 -10
  111. package/dist/cjs/models/project.model.cjs.map +0 -1
  112. package/dist/cjs/models/session.model.cjs +0 -10
  113. package/dist/cjs/models/session.model.cjs.map +0 -1
  114. package/dist/cjs/models/tag.model.cjs +0 -10
  115. package/dist/cjs/models/tag.model.cjs.map +0 -1
  116. package/dist/cjs/models/user.model.cjs +0 -10
  117. package/dist/cjs/models/user.model.cjs.map +0 -1
  118. package/dist/cjs/routes/ai.routes.cjs +0 -75
  119. package/dist/cjs/routes/ai.routes.cjs.map +0 -1
  120. package/dist/cjs/routes/dictionary.routes.cjs +0 -64
  121. package/dist/cjs/routes/dictionary.routes.cjs.map +0 -1
  122. package/dist/cjs/routes/eventListener.routes.cjs +0 -20
  123. package/dist/cjs/routes/eventListener.routes.cjs.map +0 -1
  124. package/dist/cjs/routes/newsletter.routes.cjs +0 -34
  125. package/dist/cjs/routes/newsletter.routes.cjs.map +0 -1
  126. package/dist/cjs/routes/organization.routes.cjs +0 -70
  127. package/dist/cjs/routes/organization.routes.cjs.map +0 -1
  128. package/dist/cjs/routes/project.routes.cjs +0 -83
  129. package/dist/cjs/routes/project.routes.cjs.map +0 -1
  130. package/dist/cjs/routes/search.routes.cjs +0 -20
  131. package/dist/cjs/routes/search.routes.cjs.map +0 -1
  132. package/dist/cjs/routes/stripe.routes.cjs +0 -34
  133. package/dist/cjs/routes/stripe.routes.cjs.map +0 -1
  134. package/dist/cjs/routes/tags.routes.cjs +0 -40
  135. package/dist/cjs/routes/tags.routes.cjs.map +0 -1
  136. package/dist/cjs/routes/user.routes.cjs +0 -58
  137. package/dist/cjs/routes/user.routes.cjs.map +0 -1
  138. package/dist/cjs/schemas/dictionary.schema.cjs +0 -73
  139. package/dist/cjs/schemas/dictionary.schema.cjs.map +0 -1
  140. package/dist/cjs/schemas/discussion.schema.cjs +0 -81
  141. package/dist/cjs/schemas/discussion.schema.cjs.map +0 -1
  142. package/dist/cjs/schemas/oAuth2.schema.cjs +0 -49
  143. package/dist/cjs/schemas/oAuth2.schema.cjs.map +0 -1
  144. package/dist/cjs/schemas/organization.schema.cjs +0 -62
  145. package/dist/cjs/schemas/organization.schema.cjs.map +0 -1
  146. package/dist/cjs/schemas/plans.schema.cjs +0 -75
  147. package/dist/cjs/schemas/plans.schema.cjs.map +0 -1
  148. package/dist/cjs/schemas/project.schema.cjs +0 -112
  149. package/dist/cjs/schemas/project.schema.cjs.map +0 -1
  150. package/dist/cjs/schemas/session.schema.cjs +0 -43
  151. package/dist/cjs/schemas/session.schema.cjs.map +0 -1
  152. package/dist/cjs/schemas/tag.schema.cjs +0 -62
  153. package/dist/cjs/schemas/tag.schema.cjs.map +0 -1
  154. package/dist/cjs/schemas/user.schema.cjs +0 -87
  155. package/dist/cjs/schemas/user.schema.cjs.map +0 -1
  156. package/dist/cjs/services/dictionary.service.cjs +0 -176
  157. package/dist/cjs/services/dictionary.service.cjs.map +0 -1
  158. package/dist/cjs/services/email.service.cjs +0 -155
  159. package/dist/cjs/services/email.service.cjs.map +0 -1
  160. package/dist/cjs/services/oAuth2.service.cjs +0 -211
  161. package/dist/cjs/services/oAuth2.service.cjs.map +0 -1
  162. package/dist/cjs/services/organization.service.cjs +0 -106
  163. package/dist/cjs/services/organization.service.cjs.map +0 -1
  164. package/dist/cjs/services/project.service.cjs +0 -89
  165. package/dist/cjs/services/project.service.cjs.map +0 -1
  166. package/dist/cjs/services/projectAccessKey.service.cjs +0 -111
  167. package/dist/cjs/services/projectAccessKey.service.cjs.map +0 -1
  168. package/dist/cjs/services/subscription.service.cjs +0 -184
  169. package/dist/cjs/services/subscription.service.cjs.map +0 -1
  170. package/dist/cjs/services/tag.service.cjs +0 -88
  171. package/dist/cjs/services/tag.service.cjs.map +0 -1
  172. package/dist/cjs/services/user.service.cjs +0 -120
  173. package/dist/cjs/services/user.service.cjs.map +0 -1
  174. package/dist/cjs/types/Routes.cjs +0 -0
  175. package/dist/cjs/types/dictionary.types.cjs +0 -0
  176. package/dist/cjs/types/discussion.types.cjs +0 -0
  177. package/dist/cjs/types/oAuth2.types.cjs +0 -0
  178. package/dist/cjs/types/organization.types.cjs +0 -0
  179. package/dist/cjs/types/plan.types.cjs +0 -0
  180. package/dist/cjs/types/project.types.cjs +0 -0
  181. package/dist/cjs/types/session.types.cjs +0 -0
  182. package/dist/cjs/types/tag.types.cjs +0 -0
  183. package/dist/cjs/types/user.types.cjs +0 -10
  184. package/dist/cjs/types/user.types.cjs.map +0 -1
  185. package/dist/cjs/utils/AI/aiSdk.cjs +0 -94
  186. package/dist/cjs/utils/AI/aiSdk.cjs.map +0 -1
  187. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +0 -201
  188. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +0 -1
  189. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs +0 -150
  190. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs.map +0 -1
  191. package/dist/cjs/utils/AI/auditDictionary/index.cjs +0 -60
  192. package/dist/cjs/utils/AI/auditDictionary/index.cjs.map +0 -1
  193. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs +0 -63
  194. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs.map +0 -1
  195. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs +0 -45
  196. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs.map +0 -1
  197. package/dist/cjs/utils/AI/auditTag/index.cjs +0 -40
  198. package/dist/cjs/utils/AI/auditTag/index.cjs.map +0 -1
  199. package/dist/cjs/utils/AI/autocomplete/index.cjs +0 -41
  200. package/dist/cjs/utils/AI/autocomplete/index.cjs.map +0 -1
  201. package/dist/cjs/utils/AI/customQuery/index.cjs +0 -27
  202. package/dist/cjs/utils/AI/customQuery/index.cjs.map +0 -1
  203. package/dist/cjs/utils/AI/translateJSON/index.cjs +0 -71
  204. package/dist/cjs/utils/AI/translateJSON/index.cjs.map +0 -1
  205. package/dist/cjs/utils/access.cjs +0 -0
  206. package/dist/cjs/utils/accessControl.cjs +0 -133
  207. package/dist/cjs/utils/accessControl.cjs.map +0 -1
  208. package/dist/cjs/utils/auth/getAuth.cjs +0 -218
  209. package/dist/cjs/utils/auth/getAuth.cjs.map +0 -1
  210. package/dist/cjs/utils/cors.cjs +0 -33
  211. package/dist/cjs/utils/cors.cjs.map +0 -1
  212. package/dist/cjs/utils/ensureArrayQueryFilter.cjs +0 -13
  213. package/dist/cjs/utils/ensureArrayQueryFilter.cjs.map +0 -1
  214. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs +0 -16
  215. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs.map +0 -1
  216. package/dist/cjs/utils/errors/ErrorHandler.cjs +0 -76
  217. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +0 -1
  218. package/dist/cjs/utils/errors/ErrorsClass.cjs +0 -54
  219. package/dist/cjs/utils/errors/ErrorsClass.cjs.map +0 -1
  220. package/dist/cjs/utils/errors/errorCodes.cjs +0 -1387
  221. package/dist/cjs/utils/errors/errorCodes.cjs.map +0 -1
  222. package/dist/cjs/utils/errors/index.cjs +0 -8
  223. package/dist/cjs/utils/extractJSON.cjs +0 -61
  224. package/dist/cjs/utils/extractJSON.cjs.map +0 -1
  225. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs +0 -94
  226. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs.map +0 -1
  227. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs +0 -65
  228. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs.map +0 -1
  229. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs +0 -36
  230. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs.map +0 -1
  231. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs +0 -49
  232. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs.map +0 -1
  233. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs +0 -53
  234. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs.map +0 -1
  235. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs +0 -57
  236. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs.map +0 -1
  237. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs +0 -74
  238. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs.map +0 -1
  239. package/dist/cjs/utils/httpStatusCodes.cjs +0 -401
  240. package/dist/cjs/utils/httpStatusCodes.cjs.map +0 -1
  241. package/dist/cjs/utils/mapper/dictionary.cjs +0 -29
  242. package/dist/cjs/utils/mapper/dictionary.cjs.map +0 -1
  243. package/dist/cjs/utils/mapper/organization.cjs +0 -19
  244. package/dist/cjs/utils/mapper/organization.cjs.map +0 -1
  245. package/dist/cjs/utils/mapper/project.cjs +0 -26
  246. package/dist/cjs/utils/mapper/project.cjs.map +0 -1
  247. package/dist/cjs/utils/mapper/session.cjs +0 -15
  248. package/dist/cjs/utils/mapper/session.cjs.map +0 -1
  249. package/dist/cjs/utils/mapper/tag.cjs +0 -25
  250. package/dist/cjs/utils/mapper/tag.cjs.map +0 -1
  251. package/dist/cjs/utils/mapper/user.cjs +0 -24
  252. package/dist/cjs/utils/mapper/user.cjs.map +0 -1
  253. package/dist/cjs/utils/mergeFunctionTypes.cjs +0 -0
  254. package/dist/cjs/utils/mongoDB/connectDB.cjs +0 -32
  255. package/dist/cjs/utils/mongoDB/connectDB.cjs.map +0 -1
  256. package/dist/cjs/utils/mongoDB/types.cjs +0 -0
  257. package/dist/cjs/utils/oAuth2.cjs +0 -25
  258. package/dist/cjs/utils/oAuth2.cjs.map +0 -1
  259. package/dist/cjs/utils/permissions.cjs +0 -103
  260. package/dist/cjs/utils/permissions.cjs.map +0 -1
  261. package/dist/cjs/utils/plan.cjs +0 -63
  262. package/dist/cjs/utils/plan.cjs.map +0 -1
  263. package/dist/cjs/utils/rateLimiter.cjs +0 -48
  264. package/dist/cjs/utils/rateLimiter.cjs.map +0 -1
  265. package/dist/cjs/utils/removeObjectKeys.cjs +0 -11
  266. package/dist/cjs/utils/removeObjectKeys.cjs.map +0 -1
  267. package/dist/cjs/utils/responseData.cjs +0 -33
  268. package/dist/cjs/utils/responseData.cjs.map +0 -1
  269. package/dist/cjs/utils/validation/validateArray.cjs +0 -31
  270. package/dist/cjs/utils/validation/validateArray.cjs.map +0 -1
  271. package/dist/cjs/utils/validation/validateDictionary.cjs +0 -35
  272. package/dist/cjs/utils/validation/validateDictionary.cjs.map +0 -1
  273. package/dist/cjs/utils/validation/validateEmail.cjs +0 -20
  274. package/dist/cjs/utils/validation/validateEmail.cjs.map +0 -1
  275. package/dist/cjs/utils/validation/validateOrganization.cjs +0 -43
  276. package/dist/cjs/utils/validation/validateOrganization.cjs.map +0 -1
  277. package/dist/cjs/utils/validation/validatePhone.cjs +0 -20
  278. package/dist/cjs/utils/validation/validatePhone.cjs.map +0 -1
  279. package/dist/cjs/utils/validation/validateProject.cjs +0 -55
  280. package/dist/cjs/utils/validation/validateProject.cjs.map +0 -1
  281. package/dist/cjs/utils/validation/validateString.cjs +0 -21
  282. package/dist/cjs/utils/validation/validateString.cjs.map +0 -1
  283. package/dist/cjs/utils/validation/validateTag.cjs +0 -47
  284. package/dist/cjs/utils/validation/validateTag.cjs.map +0 -1
  285. package/dist/cjs/utils/validation/validateUser.cjs +0 -47
  286. package/dist/cjs/utils/validation/validateUser.cjs.map +0 -1
  287. package/dist/cjs/webhooks/stripe.webhook.cjs +0 -116
  288. package/dist/cjs/webhooks/stripe.webhook.cjs.map +0 -1
@@ -1,40 +0,0 @@
1
- const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
2
- const require_logger_index = require('../../../logger/index.cjs');
3
- const require__utils_asset = require('../../../_virtual/_utils_asset.cjs');
4
- const require_utils_extractJSON = require('../../extractJSON.cjs');
5
- let ai = require("ai");
6
-
7
- //#region src/utils/AI/auditTag/index.ts
8
- const CHAT_GPT_PROMPT = require__utils_asset.readAsset("./PROMPT.md");
9
- const aiDefaultOptions = {};
10
- /**
11
- * Audits a tag by constructing a prompt for AI models.
12
- * The prompt includes details about the tag and related dictionaries.
13
- */
14
- const auditTag = async ({ dictionaries, tag, aiConfig, applicationContext }) => {
15
- const prompt = CHAT_GPT_PROMPT.replace("{{tag.description}}", tag.description ?? "").replace("{{tag.key}}", tag.key).replace("{{applicationContext}}", applicationContext ?? "");
16
- const { text: newContent, usage } = await (0, ai.generateText)({
17
- ...aiConfig,
18
- messages: [{
19
- role: "system",
20
- content: prompt
21
- }, {
22
- role: "user",
23
- content: [
24
- "**Tag to audit:**",
25
- "This is the tag that you should consider to audit:",
26
- JSON.stringify(tag)
27
- ].join("\n")
28
- }]
29
- });
30
- require_logger_index.logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);
31
- return {
32
- fileContent: require_utils_extractJSON.extractJson(newContent),
33
- tokenUsed: usage?.totalTokens ?? 0
34
- };
35
- };
36
-
37
- //#endregion
38
- exports.aiDefaultOptions = aiDefaultOptions;
39
- exports.auditTag = auditTag;
40
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["readAsset","aiDefaultOptions: AIOptions","extractJson"],"sources":["../../../../../src/utils/AI/auditTag/index.ts"],"sourcesContent":["import { readAsset } from 'utils:asset';\nimport { logger } from '@logger';\nimport { extractJson } from '@utils/extractJSON';\nimport { generateText } from 'ai';\nimport type { Dictionary } from '@/types/dictionary.types';\nimport type { TagAPI } from '@/types/tag.types';\nimport type { AIConfig, AIOptions } from '../aiSdk';\n\nexport type AuditOptions = {\n dictionaries: Dictionary[];\n tag: TagAPI;\n aiConfig: AIConfig;\n applicationContext?: string;\n};\n\nexport type TranslateJSONResultData = {\n fileContent: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to AI models\nconst CHAT_GPT_PROMPT = readAsset('./PROMPT.md');\n\nexport const aiDefaultOptions: AIOptions = {\n // Keep default options\n};\n\n/**\n * Audits a tag by constructing a prompt for AI models.\n * The prompt includes details about the tag and related dictionaries.\n */\nexport const auditTag = async ({\n dictionaries,\n tag,\n aiConfig,\n applicationContext,\n}: AuditOptions): Promise<TranslateJSONResultData | undefined> => {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{tag.description}}',\n tag.description ?? ''\n )\n .replace('{{tag.key}}', tag.key)\n .replace('{{applicationContext}}', applicationContext ?? '');\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n messages: [\n { role: 'system', content: prompt },\n {\n role: 'user',\n content: [\n '**Tag to audit:**',\n 'This is the tag that you should consider to audit:',\n JSON.stringify(tag),\n ].join('\\n'),\n },\n ],\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n fileContent: extractJson(newContent),\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":";;;;;;;AAqBA,MAAM,kBAAkBA,+BAAU,cAAc;AAEhD,MAAaC,mBAA8B,EAE1C;;;;;AAMD,MAAa,WAAW,OAAO,EAC7B,cACA,KACA,UACA,yBACgE;CAEhE,MAAM,SAAS,gBAAgB,QAC7B,uBACA,IAAI,eAAe,GACpB,CACE,QAAQ,eAAe,IAAI,IAAI,CAC/B,QAAQ,0BAA0B,sBAAsB,GAAG;CAG9D,MAAM,EAAE,MAAM,YAAY,UAAU,2BAAmB;EACrD,GAAG;EACH,UAAU,CACR;GAAE,MAAM;GAAU,SAAS;GAAQ,EACnC;GACE,MAAM;GACN,SAAS;IACP;IACA;IACA,KAAK,UAAU,IAAI;IACpB,CAAC,KAAK,KAAK;GACb,CACF;EACF,CAAC;AAEF,6BAAO,KAAK,GAAG,OAAO,eAAe,EAAE,6BAA6B;AAEpE,QAAO;EACL,aAAaC,sCAAY,WAAW;EACpC,WAAW,OAAO,eAAe;EAClC"}
@@ -1,41 +0,0 @@
1
- const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
2
- const require_logger_index = require('../../../logger/index.cjs');
3
- const require_utils_AI_aiSdk = require('../aiSdk.cjs');
4
- const require__utils_asset = require('../../../_virtual/_utils_asset.cjs');
5
- let ai = require("ai");
6
-
7
- //#region src/utils/AI/autocomplete/index.ts
8
- const CHAT_GPT_PROMPT = require__utils_asset.readAsset("./PROMPT.md");
9
- const aiDefaultOptions = {
10
- provider: require_utils_AI_aiSdk.AIProvider.OPENAI,
11
- model: "gpt-4o-mini",
12
- temperature: .7
13
- };
14
- /**
15
- * Autocompletes a content declaration file by constructing a prompt for AI models.
16
- * The prompt includes details about the project's locales, file paths of content declarations,
17
- * and requests for identifying issues or inconsistencies.
18
- */
19
- const autocomplete = async ({ text, aiConfig, applicationContext, contextBefore, currentLine, contextAfter }) => {
20
- const prompt = CHAT_GPT_PROMPT.replace("{{applicationContext}}", applicationContext ?? "").replace("{{contextBefore}}", contextBefore ?? "").replace("{{currentLine}}", currentLine ?? "").replace("{{contextAfter}}", contextAfter ?? "");
21
- const { text: newContent, usage } = await (0, ai.generateText)({
22
- ...aiConfig,
23
- messages: [{
24
- role: "system",
25
- content: prompt
26
- }, {
27
- role: "assistant",
28
- content: text
29
- }]
30
- });
31
- require_logger_index.logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);
32
- return {
33
- autocompletion: newContent,
34
- tokenUsed: usage?.totalTokens ?? 0
35
- };
36
- };
37
-
38
- //#endregion
39
- exports.aiDefaultOptions = aiDefaultOptions;
40
- exports.autocomplete = autocomplete;
41
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["readAsset","aiDefaultOptions: AIOptions","AIProvider"],"sources":["../../../../../src/utils/AI/autocomplete/index.ts"],"sourcesContent":["import { readAsset } from 'utils:asset';\nimport { logger } from '@logger';\nimport { generateText } from 'ai';\nimport { type AIConfig, type AIOptions, AIProvider } from '../aiSdk';\n\nexport type AutocompleteOptions = {\n text: string;\n aiConfig: AIConfig;\n applicationContext?: string;\n contextBefore?: string;\n currentLine?: string;\n contextAfter?: string;\n};\n\nexport type AutocompleteFileResultData = {\n autocompletion: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = readAsset('./PROMPT.md');\n\nexport const aiDefaultOptions: AIOptions = {\n provider: AIProvider.OPENAI,\n model: 'gpt-4o-mini',\n temperature: 0.7,\n};\n\n/**\n * Autocompletes a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const autocomplete = async ({\n text,\n aiConfig,\n applicationContext,\n contextBefore,\n currentLine,\n contextAfter,\n}: AutocompleteOptions): Promise<AutocompleteFileResultData | undefined> => {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{applicationContext}}',\n applicationContext ?? ''\n )\n .replace('{{contextBefore}}', contextBefore ?? '')\n .replace('{{currentLine}}', currentLine ?? '')\n .replace('{{contextAfter}}', contextAfter ?? '');\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n messages: [\n { role: 'system', content: prompt },\n { role: 'assistant', content: text },\n ],\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n autocompletion: newContent,\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":";;;;;;;AAoBA,MAAM,kBAAkBA,+BAAU,cAAc;AAEhD,MAAaC,mBAA8B;CACzC,UAAUC,kCAAW;CACrB,OAAO;CACP,aAAa;CACd;;;;;;AAOD,MAAa,eAAe,OAAO,EACjC,MACA,UACA,oBACA,eACA,aACA,mBAC0E;CAE1E,MAAM,SAAS,gBAAgB,QAC7B,0BACA,sBAAsB,GACvB,CACE,QAAQ,qBAAqB,iBAAiB,GAAG,CACjD,QAAQ,mBAAmB,eAAe,GAAG,CAC7C,QAAQ,oBAAoB,gBAAgB,GAAG;CAGlD,MAAM,EAAE,MAAM,YAAY,UAAU,2BAAmB;EACrD,GAAG;EACH,UAAU,CACR;GAAE,MAAM;GAAU,SAAS;GAAQ,EACnC;GAAE,MAAM;GAAa,SAAS;GAAM,CACrC;EACF,CAAC;AAEF,6BAAO,KAAK,GAAG,OAAO,eAAe,EAAE,6BAA6B;AAEpE,QAAO;EACL,gBAAgB;EAChB,WAAW,OAAO,eAAe;EAClC"}
@@ -1,27 +0,0 @@
1
- const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
2
- const require_logger_index = require('../../../logger/index.cjs');
3
- let ai = require("ai");
4
-
5
- //#region src/utils/AI/customQuery/index.ts
6
- const aiDefaultOptions = { model: "gpt-4o-mini" };
7
- /**
8
- * CustomQuerys a content declaration file by constructing a prompt for AI models.
9
- * The prompt includes details about the project's locales, file paths of content declarations,
10
- * and requests for identifying issues or inconsistencies.
11
- */
12
- const customQuery = async ({ messages, aiConfig }) => {
13
- const { text: newContent, usage } = await (0, ai.generateText)({
14
- ...aiConfig,
15
- messages
16
- });
17
- require_logger_index.logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);
18
- return {
19
- fileContent: newContent,
20
- tokenUsed: usage?.totalTokens ?? 0
21
- };
22
- };
23
-
24
- //#endregion
25
- exports.aiDefaultOptions = aiDefaultOptions;
26
- exports.customQuery = customQuery;
27
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["aiDefaultOptions: AIOptions"],"sources":["../../../../../src/utils/AI/customQuery/index.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { generateText } from 'ai';\nimport type { AIConfig, AIOptions, Messages } from '../aiSdk';\n\nexport type CustomQueryOptions = {\n messages: Messages;\n aiConfig: AIConfig;\n};\n\nexport type CustomQueryResultData = {\n fileContent: string;\n tokenUsed: number;\n};\n\nexport const aiDefaultOptions: AIOptions = {\n model: 'gpt-4o-mini',\n // Keep default options\n};\n\n/**\n * CustomQuerys a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const customQuery = async ({\n messages,\n aiConfig,\n}: CustomQueryOptions): Promise<CustomQueryResultData | undefined> => {\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n messages,\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n fileContent: newContent,\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":";;;;;AAcA,MAAaA,mBAA8B,EACzC,OAAO,eAER;;;;;;AAOD,MAAa,cAAc,OAAO,EAChC,UACA,eACoE;CAEpE,MAAM,EAAE,MAAM,YAAY,UAAU,2BAAmB;EACrD,GAAG;EACH;EACD,CAAC;AAEF,6BAAO,KAAK,GAAG,OAAO,eAAe,EAAE,6BAA6B;AAEpE,QAAO;EACL,aAAa;EACb,WAAW,OAAO,eAAe;EAClC"}
@@ -1,71 +0,0 @@
1
- const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
2
- const require_logger_index = require('../../../logger/index.cjs');
3
- const require_utils_AI_aiSdk = require('../aiSdk.cjs');
4
- const require__utils_asset = require('../../../_virtual/_utils_asset.cjs');
5
- const require_utils_extractJSON = require('../../extractJSON.cjs');
6
- let __intlayer_types = require("@intlayer/types");
7
- let __intlayer_core = require("@intlayer/core");
8
- let ai = require("ai");
9
-
10
- //#region src/utils/AI/translateJSON/index.ts
11
- const CHAT_GPT_PROMPT = require__utils_asset.readAsset("./PROMPT.md");
12
- const aiDefaultOptions = {
13
- provider: require_utils_AI_aiSdk.AIProvider.OPENAI,
14
- model: "gpt-5-mini"
15
- };
16
- /**
17
- * Format a locale with its name.
18
- *
19
- * @param locale - The locale to format.
20
- * @returns A string in the format "locale: name", e.g. "en: English".
21
- */
22
- const formatLocaleWithName = (locale) => `${locale}: ${(0, __intlayer_core.getLocaleName)(locale, __intlayer_types.Locales.ENGLISH)}`;
23
- /**
24
- * Formats tag instructions for the AI prompt.
25
- * Creates a string with all available tags and their descriptions.
26
- *
27
- * @param tags - The list of tags to format.
28
- * @returns A formatted string with tag instructions.
29
- */
30
- const formatTagInstructions = (tags) => {
31
- if (!tags || tags.length === 0) return "";
32
- return `Based on the dictionary content, identify specific tags from the list below that would be relevant:
33
-
34
- ${tags.map(({ key, description }) => `- ${key}: ${description}`).join("\n\n")}`;
35
- };
36
- const getModeInstructions = (mode) => {
37
- if (mode === "complete") return "Mode: \"Complete\" - Enrich the preset content with the missing keys and values in the output locale. Do not update existing keys. Everything should be returned in the output.";
38
- return "Mode: \"Review\" - Fill missing content and review existing keys from the preset content. If a key from the entry is missing in the output, it must be translated to the target language and added. If you detect misspelled content, or content that should be reformulated, correct it. If a translation is not coherent with the desired language, translate it.";
39
- };
40
- /**
41
- * TranslateJSONs a content declaration file by constructing a prompt for AI models.
42
- * The prompt includes details about the project's locales, file paths of content declarations,
43
- * and requests for identifying issues or inconsistencies.
44
- */
45
- const translateJSON = async ({ entryFileContent, presetOutputContent, dictionaryDescription, aiConfig, entryLocale, outputLocale, tags, mode, applicationContext }) => {
46
- const prompt = CHAT_GPT_PROMPT.replace("{{entryLocale}}", formatLocaleWithName(entryLocale)).replace("{{outputLocale}}", formatLocaleWithName(outputLocale)).replace("{{presetOutputContent}}", JSON.stringify(presetOutputContent)).replace("{{dictionaryDescription}}", dictionaryDescription ?? "").replace("{{applicationContext}}", applicationContext ?? "").replace("{{tagsInstructions}}", formatTagInstructions(tags)).replace("{{modeInstructions}}", getModeInstructions(mode));
47
- const { text: newContent, usage } = await (0, ai.generateText)({
48
- ...aiConfig,
49
- messages: [{
50
- role: "system",
51
- content: prompt
52
- }, {
53
- role: "user",
54
- content: [
55
- "**Entry Content to Translate:**",
56
- "- Given Language: {{entryLocale}}",
57
- JSON.stringify(entryFileContent)
58
- ].join("\n")
59
- }]
60
- });
61
- require_logger_index.logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);
62
- return {
63
- fileContent: require_utils_extractJSON.extractJson(newContent),
64
- tokenUsed: usage?.totalTokens ?? 0
65
- };
66
- };
67
-
68
- //#endregion
69
- exports.aiDefaultOptions = aiDefaultOptions;
70
- exports.translateJSON = translateJSON;
71
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["readAsset","aiDefaultOptions: AIOptions","AIProvider","Locales","extractJson"],"sources":["../../../../../src/utils/AI/translateJSON/index.ts"],"sourcesContent":["import { readAsset } from 'utils:asset';\nimport { getLocaleName } from '@intlayer/core';\nimport { type Locale, Locales } from '@intlayer/types';\nimport { logger } from '@logger';\nimport { extractJson } from '@utils/extractJSON';\nimport { generateText } from 'ai';\nimport type { Tag } from '@/types/tag.types';\nimport { type AIConfig, type AIOptions, AIProvider } from '../aiSdk';\n\nexport type TranslateJSONOptions = {\n entryFileContent: JSON;\n presetOutputContent: JSON;\n dictionaryDescription?: string;\n entryLocale: Locale;\n outputLocale: Locale;\n tags: Tag[];\n aiConfig: AIConfig;\n mode: 'complete' | 'review';\n applicationContext?: string;\n};\n\nexport type TranslateJSONResultData = {\n fileContent: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = readAsset('./PROMPT.md');\n\nexport const aiDefaultOptions: AIOptions = {\n provider: AIProvider.OPENAI,\n model: 'gpt-5-mini',\n};\n\n/**\n * Format a locale with its name.\n *\n * @param locale - The locale to format.\n * @returns A string in the format \"locale: name\", e.g. \"en: English\".\n */\nconst formatLocaleWithName = (locale: Locale): string =>\n `${locale}: ${getLocaleName(locale, Locales.ENGLISH)}`;\n\n/**\n * Formats tag instructions for the AI prompt.\n * Creates a string with all available tags and their descriptions.\n *\n * @param tags - The list of tags to format.\n * @returns A formatted string with tag instructions.\n */\nconst formatTagInstructions = (tags: Tag[]): string => {\n if (!tags || tags.length === 0) {\n return '';\n }\n\n // Prepare the tag instructions.\n return `Based on the dictionary content, identify specific tags from the list below that would be relevant:\n \n${tags.map(({ key, description }) => `- ${key}: ${description}`).join('\\n\\n')}`;\n};\n\nconst getModeInstructions = (mode: 'complete' | 'review'): string => {\n if (mode === 'complete') {\n return 'Mode: \"Complete\" - Enrich the preset content with the missing keys and values in the output locale. Do not update existing keys. Everything should be returned in the output.';\n }\n\n return 'Mode: \"Review\" - Fill missing content and review existing keys from the preset content. If a key from the entry is missing in the output, it must be translated to the target language and added. If you detect misspelled content, or content that should be reformulated, correct it. If a translation is not coherent with the desired language, translate it.';\n};\n\n/**\n * TranslateJSONs a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const translateJSON = async ({\n entryFileContent,\n presetOutputContent,\n dictionaryDescription,\n aiConfig,\n entryLocale,\n outputLocale,\n tags,\n mode,\n applicationContext,\n}: TranslateJSONOptions): Promise<TranslateJSONResultData | undefined> => {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{entryLocale}}',\n formatLocaleWithName(entryLocale)\n )\n .replace('{{outputLocale}}', formatLocaleWithName(outputLocale))\n .replace('{{presetOutputContent}}', JSON.stringify(presetOutputContent))\n .replace('{{dictionaryDescription}}', dictionaryDescription ?? '')\n .replace('{{applicationContext}}', applicationContext ?? '')\n .replace('{{tagsInstructions}}', formatTagInstructions(tags))\n .replace('{{modeInstructions}}', getModeInstructions(mode));\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n messages: [\n { role: 'system', content: prompt },\n {\n role: 'user',\n content: [\n '**Entry Content to Translate:**',\n '- Given Language: {{entryLocale}}',\n JSON.stringify(entryFileContent),\n ].join('\\n'),\n },\n ],\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n fileContent: extractJson(newContent),\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":";;;;;;;;;;AA2BA,MAAM,kBAAkBA,+BAAU,cAAc;AAEhD,MAAaC,mBAA8B;CACzC,UAAUC,kCAAW;CACrB,OAAO;CACR;;;;;;;AAQD,MAAM,wBAAwB,WAC5B,GAAG,OAAO,uCAAkB,QAAQC,yBAAQ,QAAQ;;;;;;;;AAStD,MAAM,yBAAyB,SAAwB;AACrD,KAAI,CAAC,QAAQ,KAAK,WAAW,EAC3B,QAAO;AAIT,QAAO;;EAEP,KAAK,KAAK,EAAE,KAAK,kBAAkB,KAAK,IAAI,IAAI,cAAc,CAAC,KAAK,OAAO;;AAG7E,MAAM,uBAAuB,SAAwC;AACnE,KAAI,SAAS,WACX,QAAO;AAGT,QAAO;;;;;;;AAQT,MAAa,gBAAgB,OAAO,EAClC,kBACA,qBACA,uBACA,UACA,aACA,cACA,MACA,MACA,yBACwE;CAExE,MAAM,SAAS,gBAAgB,QAC7B,mBACA,qBAAqB,YAAY,CAClC,CACE,QAAQ,oBAAoB,qBAAqB,aAAa,CAAC,CAC/D,QAAQ,2BAA2B,KAAK,UAAU,oBAAoB,CAAC,CACvE,QAAQ,6BAA6B,yBAAyB,GAAG,CACjE,QAAQ,0BAA0B,sBAAsB,GAAG,CAC3D,QAAQ,wBAAwB,sBAAsB,KAAK,CAAC,CAC5D,QAAQ,wBAAwB,oBAAoB,KAAK,CAAC;CAG7D,MAAM,EAAE,MAAM,YAAY,UAAU,2BAAmB;EACrD,GAAG;EACH,UAAU,CACR;GAAE,MAAM;GAAU,SAAS;GAAQ,EACnC;GACE,MAAM;GACN,SAAS;IACP;IACA;IACA,KAAK,UAAU,iBAAiB;IACjC,CAAC,KAAK,KAAK;GACb,CACF;EACF,CAAC;AAEF,6BAAO,KAAK,GAAG,OAAO,eAAe,EAAE,6BAA6B;AAEpE,QAAO;EACL,aAAaC,sCAAY,WAAW;EACpC,WAAW,OAAO,eAAe;EAClC"}
File without changes
@@ -1,133 +0,0 @@
1
- const require_logger_index = require('../logger/index.cjs');
2
- const require_utils_httpStatusCodes = require('./httpStatusCodes.cjs');
3
-
4
- //#region src/utils/accessControl.ts
5
- let AccessRule = /* @__PURE__ */ function(AccessRule$1) {
6
- AccessRule$1["none"] = "none";
7
- AccessRule$1["authenticated"] = "authenticated";
8
- AccessRule$1["admin"] = "admin";
9
- AccessRule$1["noneAuthenticated"] = "not-authenticated";
10
- AccessRule$1["hasOrganization"] = "has-organization";
11
- AccessRule$1["hasProject"] = "has-project";
12
- AccessRule$1["hasBearer"] = "has-bearer";
13
- AccessRule$1["oauth2"] = "oauth2";
14
- return AccessRule$1;
15
- }({});
16
- const accessControl = (res, accessRule) => {
17
- const accessRuleArray = Array.isArray(accessRule) ? accessRule : [accessRule];
18
- const { user, organization, project, authType } = res.locals;
19
- if (accessRuleArray.includes(AccessRule.none)) return {
20
- success: true,
21
- message: null,
22
- data: {
23
- user,
24
- organization,
25
- project,
26
- authType
27
- }
28
- };
29
- let success = true;
30
- const messages = [];
31
- if (accessRuleArray.includes(AccessRule.authenticated)) {
32
- if (!user) {
33
- success = false;
34
- messages.push("User is not authenticated");
35
- }
36
- }
37
- if (accessRuleArray.includes(AccessRule.noneAuthenticated)) {
38
- if (user) {
39
- success = false;
40
- messages.push("User is authenticated");
41
- }
42
- }
43
- if (accessRuleArray.includes(AccessRule.hasOrganization)) {
44
- if (!organization) {
45
- success = false;
46
- messages.push("Organization is not set");
47
- }
48
- }
49
- if (accessRuleArray.includes(AccessRule.hasProject)) {
50
- if (!project) {
51
- success = false;
52
- messages.push("Project is not set");
53
- }
54
- }
55
- if (accessRuleArray.includes(AccessRule.oauth2)) {
56
- if (authType !== "oauth2") {
57
- success = false;
58
- messages.push("OAuth2 authentication is required");
59
- }
60
- }
61
- const knownRules = Object.values(AccessRule);
62
- const unknownRules = accessRuleArray.filter((rule) => !knownRules.includes(rule));
63
- if (unknownRules.length > 0) {
64
- success = false;
65
- messages.push(`Unknown access rules: ${unknownRules.join(", ")}`);
66
- }
67
- return {
68
- success,
69
- message: messages.join(", "),
70
- data: {
71
- user,
72
- organization,
73
- project,
74
- authType
75
- }
76
- };
77
- };
78
- /**
79
- * Middleware to control API access based on access rules.
80
- *
81
- * This middleware allows for multiple access rules to be passed, either as individual `AccessRule` or
82
- * an array of `AccessRule` groups. Access is granted if at least one of the following conditions is met:
83
- *
84
- * - The user satisfies all `AccessRule` within any group of rules passed as an array.
85
- * - The user satisfies any single `AccessRule` passed individually.
86
- *
87
- * Example usage:
88
- *
89
- * ```typescript
90
- * // Allow access if the user has both `hasProject` and `hasOrganization`, or if they have `admin` rights
91
- * app.use('/protected-route', apiAccessControlMiddleWare([AccessRule.hasProject, AccessRule.hasOrganization], AccessRule.admin));
92
- * ```
93
- *
94
- * In this example:
95
- * - The user will be granted access if they have both `hasProject` and `hasOrganization`.
96
- * - Alternatively, the user will also be granted access if they have `admin` privileges.
97
- *
98
- * @param {...(AccessRule | AccessRule[])[]} accessRules - One or more access rules or groups of access rules.
99
- * - Single `AccessRule`: The user must satisfy this rule for access to be granted.
100
- * - Array of `AccessRule`: The user must satisfy all rules in the array for access to be granted.
101
- * @returns {Function} Express middleware function that checks if the user has the required access.
102
- *
103
- * If the user does not meet any of the provided access rules, a 403 Forbidden status is returned.
104
- *
105
- * @example
106
- * // Example 1: Require admin privileges
107
- * app.use('/admin', apiAccessControlMiddleWare(AccessRule.admin));
108
- *
109
- * @example
110
- * // Example 2: Require both project and organization access, or admin privileges
111
- * app.use('/dashboard', apiAccessControlMiddleWare([AccessRule.hasProject, AccessRule.hasOrganization], AccessRule.admin));
112
- */
113
- const accessControlMiddleWare = (...accessRules) => (_req, res, next) => {
114
- let hasAccess = false;
115
- for (const ruleGroup of accessRules) {
116
- if (Array.isArray(ruleGroup)) hasAccess = ruleGroup.map((rule) => accessControl(res, rule).success).every((result) => result);
117
- else if (accessControl(res, ruleGroup).success) hasAccess = true;
118
- if (hasAccess) break;
119
- }
120
- if (!hasAccess) {
121
- require_logger_index.logger.error("Access denied");
122
- const errorStatusCode = require_utils_httpStatusCodes.HttpStatusCodes.FORBIDDEN_403;
123
- res.sendStatus(errorStatusCode);
124
- return;
125
- }
126
- next();
127
- };
128
-
129
- //#endregion
130
- exports.AccessRule = AccessRule;
131
- exports.accessControl = accessControl;
132
- exports.accessControlMiddleWare = accessControlMiddleWare;
133
- //# sourceMappingURL=accessControl.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accessControl.cjs","names":["accessRuleArray: AccessRule[]","messages: string[]","HttpStatusCodes"],"sources":["../../../src/utils/accessControl.ts"],"sourcesContent":["import { logger } from '@logger';\n\nimport type { NextFunction, Request, Response } from 'express';\nimport { HttpStatusCodes } from './httpStatusCodes';\n\nexport enum AccessRule {\n none = 'none',\n authenticated = 'authenticated',\n admin = 'admin',\n noneAuthenticated = 'not-authenticated',\n hasOrganization = 'has-organization',\n hasProject = 'has-project',\n hasBearer = 'has-bearer',\n oauth2 = 'oauth2',\n}\n\nexport const accessControl = <R extends AccessRule | AccessRule[]>(\n res: Response,\n accessRule: R\n) => {\n const accessRuleArray: AccessRule[] = Array.isArray(accessRule)\n ? accessRule\n : [accessRule];\n\n const localsAuthInformation = res.locals;\n const { user, organization, project, authType } = localsAuthInformation;\n\n // If 'none' access rule is present, immediately return success\n if (accessRuleArray.includes(AccessRule.none)) {\n return {\n success: true,\n message: null,\n data: { user, organization, project, authType },\n };\n }\n\n let success = true;\n const messages: string[] = [];\n\n // Check for 'authenticated' access rule\n if (accessRuleArray.includes(AccessRule.authenticated)) {\n if (!user) {\n success = false;\n messages.push('User is not authenticated');\n }\n }\n\n // Check for 'admin' access rule\n // if (accessRuleArray.includes(AccessRule.admin)) {\n // if (!user?.role.includes('admin')) {\n // success = false;\n // messages.push('User is not an admin');\n // }\n // }\n\n // Check for 'not-authenticated' access rule\n if (accessRuleArray.includes(AccessRule.noneAuthenticated)) {\n if (user) {\n success = false;\n messages.push('User is authenticated');\n }\n }\n\n // Check for 'has-organization' access rule\n if (accessRuleArray.includes(AccessRule.hasOrganization)) {\n if (!organization) {\n success = false;\n messages.push('Organization is not set');\n }\n }\n\n // Check for 'has-project' access rule\n if (accessRuleArray.includes(AccessRule.hasProject)) {\n if (!project) {\n success = false;\n messages.push('Project is not set');\n }\n }\n\n // Check for 'oauth2' access rule\n if (accessRuleArray.includes(AccessRule.oauth2)) {\n if (authType !== 'oauth2') {\n success = false;\n messages.push('OAuth2 authentication is required');\n }\n }\n\n // Handle unknown access rules\n const knownRules = Object.values(AccessRule);\n const unknownRules = accessRuleArray.filter(\n (rule) => !knownRules.includes(rule)\n );\n if (unknownRules.length > 0) {\n success = false;\n messages.push(`Unknown access rules: ${unknownRules.join(', ')}`);\n }\n\n return {\n success,\n message: messages.join(', '),\n data: { user, organization, project, authType },\n };\n};\n\n/**\n * Middleware to control API access based on access rules.\n *\n * This middleware allows for multiple access rules to be passed, either as individual `AccessRule` or\n * an array of `AccessRule` groups. Access is granted if at least one of the following conditions is met:\n *\n * - The user satisfies all `AccessRule` within any group of rules passed as an array.\n * - The user satisfies any single `AccessRule` passed individually.\n *\n * Example usage:\n *\n * ```typescript\n * // Allow access if the user has both `hasProject` and `hasOrganization`, or if they have `admin` rights\n * app.use('/protected-route', apiAccessControlMiddleWare([AccessRule.hasProject, AccessRule.hasOrganization], AccessRule.admin));\n * ```\n *\n * In this example:\n * - The user will be granted access if they have both `hasProject` and `hasOrganization`.\n * - Alternatively, the user will also be granted access if they have `admin` privileges.\n *\n * @param {...(AccessRule | AccessRule[])[]} accessRules - One or more access rules or groups of access rules.\n * - Single `AccessRule`: The user must satisfy this rule for access to be granted.\n * - Array of `AccessRule`: The user must satisfy all rules in the array for access to be granted.\n * @returns {Function} Express middleware function that checks if the user has the required access.\n *\n * If the user does not meet any of the provided access rules, a 403 Forbidden status is returned.\n *\n * @example\n * // Example 1: Require admin privileges\n * app.use('/admin', apiAccessControlMiddleWare(AccessRule.admin));\n *\n * @example\n * // Example 2: Require both project and organization access, or admin privileges\n * app.use('/dashboard', apiAccessControlMiddleWare([AccessRule.hasProject, AccessRule.hasOrganization], AccessRule.admin));\n */\nexport const accessControlMiddleWare =\n (...accessRules: (AccessRule | AccessRule[])[]) =>\n (_req: Request<unknown>, res: Response, next: NextFunction): void => {\n let hasAccess = false;\n\n // Iterate over each access rule group (either single AccessRule or an array of AccessRules)\n for (const ruleGroup of accessRules) {\n if (Array.isArray(ruleGroup)) {\n // If ruleGroup is an array, check if all rules in the group are satisfied\n const accessResults = ruleGroup.map(\n (rule) => accessControl(res, rule).success\n );\n hasAccess = accessResults.every((result) => result); // All rules must be satisfied in this case\n } else {\n // Single rule: just check this one\n const accessResult = accessControl(res, ruleGroup);\n if (accessResult.success) {\n hasAccess = true;\n }\n }\n\n // If access is granted at any point, stop further checks\n if (hasAccess) {\n break;\n }\n }\n\n // If no access rule group was satisfied, deny access\n if (!hasAccess) {\n logger.error('Access denied');\n\n const errorStatusCode = HttpStatusCodes.FORBIDDEN_403;\n res.sendStatus(errorStatusCode);\n return;\n }\n\n next();\n };\n"],"mappings":";;;;AAKA,IAAY,oDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,MAAa,iBACX,KACA,eACG;CACH,MAAMA,kBAAgC,MAAM,QAAQ,WAAW,GAC3D,aACA,CAAC,WAAW;CAGhB,MAAM,EAAE,MAAM,cAAc,SAAS,aADP,IAAI;AAIlC,KAAI,gBAAgB,SAAS,WAAW,KAAK,CAC3C,QAAO;EACL,SAAS;EACT,SAAS;EACT,MAAM;GAAE;GAAM;GAAc;GAAS;GAAU;EAChD;CAGH,IAAI,UAAU;CACd,MAAMC,WAAqB,EAAE;AAG7B,KAAI,gBAAgB,SAAS,WAAW,cAAc,EACpD;MAAI,CAAC,MAAM;AACT,aAAU;AACV,YAAS,KAAK,4BAA4B;;;AAa9C,KAAI,gBAAgB,SAAS,WAAW,kBAAkB,EACxD;MAAI,MAAM;AACR,aAAU;AACV,YAAS,KAAK,wBAAwB;;;AAK1C,KAAI,gBAAgB,SAAS,WAAW,gBAAgB,EACtD;MAAI,CAAC,cAAc;AACjB,aAAU;AACV,YAAS,KAAK,0BAA0B;;;AAK5C,KAAI,gBAAgB,SAAS,WAAW,WAAW,EACjD;MAAI,CAAC,SAAS;AACZ,aAAU;AACV,YAAS,KAAK,qBAAqB;;;AAKvC,KAAI,gBAAgB,SAAS,WAAW,OAAO,EAC7C;MAAI,aAAa,UAAU;AACzB,aAAU;AACV,YAAS,KAAK,oCAAoC;;;CAKtD,MAAM,aAAa,OAAO,OAAO,WAAW;CAC5C,MAAM,eAAe,gBAAgB,QAClC,SAAS,CAAC,WAAW,SAAS,KAAK,CACrC;AACD,KAAI,aAAa,SAAS,GAAG;AAC3B,YAAU;AACV,WAAS,KAAK,yBAAyB,aAAa,KAAK,KAAK,GAAG;;AAGnE,QAAO;EACL;EACA,SAAS,SAAS,KAAK,KAAK;EAC5B,MAAM;GAAE;GAAM;GAAc;GAAS;GAAU;EAChD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCH,MAAa,2BACV,GAAG,iBACH,MAAwB,KAAe,SAA6B;CACnE,IAAI,YAAY;AAGhB,MAAK,MAAM,aAAa,aAAa;AACnC,MAAI,MAAM,QAAQ,UAAU,CAK1B,aAHsB,UAAU,KAC7B,SAAS,cAAc,KAAK,KAAK,CAAC,QACpC,CACyB,OAAO,WAAW,OAAO;WAG9B,cAAc,KAAK,UAAU,CACjC,QACf,aAAY;AAKhB,MAAI,UACF;;AAKJ,KAAI,CAAC,WAAW;AACd,8BAAO,MAAM,gBAAgB;EAE7B,MAAM,kBAAkBC,8CAAgB;AACxC,MAAI,WAAW,gBAAgB;AAC/B;;AAGF,OAAM"}
@@ -1,218 +0,0 @@
1
- const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
- const require_logger_index = require('../../logger/index.cjs');
3
- const require_services_organization_service = require('../../services/organization.service.cjs');
4
- const require_services_project_service = require('../../services/project.service.cjs');
5
- const require_utils_permissions = require('../permissions.cjs');
6
- const require_services_user_service = require('../../services/user.service.cjs');
7
- const require_utils_mapper_user = require('../mapper/user.cjs');
8
- const require_services_email_service = require('../../services/email.service.cjs');
9
- const require_utils_mapper_organization = require('../mapper/organization.cjs');
10
- const require_utils_mapper_project = require('../mapper/project.cjs');
11
- const require_controllers_user_controller = require('../../controllers/user.controller.cjs');
12
- const require_utils_mapper_session = require('../mapper/session.cjs');
13
- let better_auth = require("better-auth");
14
- let better_auth_adapters_mongodb = require("better-auth/adapters/mongodb");
15
- let better_auth_api = require("better-auth/api");
16
- let better_auth_plugins = require("better-auth/plugins");
17
- let better_auth_plugins_magic_link = require("better-auth/plugins/magic-link");
18
- let better_auth_plugins_passkey = require("better-auth/plugins/passkey");
19
-
20
- //#region src/utils/auth/getAuth.ts
21
- const formatSession = (session) => {
22
- const roles = require_utils_permissions.getSessionRoles(session);
23
- let permissions = require_utils_permissions.computeEffectivePermission(roles);
24
- if (session.permissions) permissions = require_utils_permissions.intersectPermissions(permissions, session.permissions);
25
- return {
26
- session: session.session,
27
- user: session.user,
28
- organization: session.organization,
29
- project: session.project,
30
- authType: "session",
31
- permissions,
32
- roles
33
- };
34
- };
35
- const getAuth = (dbClient) => {
36
- if (!dbClient) throw new Error("MongoDB connection not established");
37
- return (0, better_auth.betterAuth)({
38
- appName: "Intlayer",
39
- database: (0, better_auth_adapters_mongodb.mongodbAdapter)(dbClient.db()),
40
- user: { modelName: "users" },
41
- databaseHooks: { user: { create: { after: async (user) => {
42
- if (!user?.emailVerified) return;
43
- await require_services_email_service.sendEmail({
44
- type: "welcome",
45
- to: user.email,
46
- username: user.name ?? user.email.split("@")[0],
47
- loginLink: `${process.env.CLIENT_URL}/auth/login`,
48
- locale: user.lang
49
- });
50
- require_logger_index.logger.info("Welcome e‑mail delivered", { email: user.email });
51
- } } } },
52
- hooks: { after: (0, better_auth_api.createAuthMiddleware)(async (ctx) => {
53
- const { path, context } = ctx;
54
- const newUser = context.newSession?.user;
55
- const existingUser = context.session?.user;
56
- const user = newUser ?? existingUser;
57
- if (!user) return;
58
- if (["/verify-email"].includes(path)) {
59
- require_controllers_user_controller.sendVerificationUpdate(user);
60
- require_logger_index.logger.info("SSE verification update sent", {
61
- email: user.email,
62
- userId: user.id
63
- });
64
- await require_services_email_service.sendEmail({
65
- type: "welcome",
66
- to: user.email,
67
- username: user.name ?? user.email.split("@")[0],
68
- loginLink: `${process.env.CLIENT_URL}/auth/login`,
69
- locale: user.lang
70
- });
71
- require_logger_index.logger.info("Welcome e‑mail delivered", { email: user.email });
72
- }
73
- }) },
74
- advanced: {
75
- cookiePrefix: "intlayer",
76
- cookies: { session_token: {} }
77
- },
78
- secret: process.env.AUTH_SECRET,
79
- session: {
80
- modelName: "sessions",
81
- id: "id",
82
- additionalFields: {
83
- activeOrganizationId: {
84
- type: "string",
85
- nullable: true,
86
- input: false
87
- },
88
- activeProjectId: {
89
- type: "string",
90
- nullable: true,
91
- input: false
92
- }
93
- }
94
- },
95
- plugins: [
96
- (0, better_auth_plugins.customSession)(async ({ session }) => {
97
- const typedSession = session;
98
- let userAPI = null;
99
- let organizationAPI = null;
100
- let projectAPI = null;
101
- if (typedSession.userId) {
102
- const userData = await require_services_user_service.getUserById(typedSession.userId);
103
- if (userData) userAPI = require_utils_mapper_user.mapUserToAPI(userData);
104
- }
105
- if (typedSession.activeOrganizationId) {
106
- const orgData = await require_services_organization_service.getOrganizationById(typedSession.activeOrganizationId);
107
- if (orgData) organizationAPI = require_utils_mapper_organization.mapOrganizationToAPI(orgData);
108
- }
109
- if (typedSession.activeProjectId) {
110
- const projectData = await require_services_project_service.getProjectById(typedSession.activeProjectId);
111
- if (projectData) projectAPI = require_utils_mapper_project.mapProjectToAPI(projectData);
112
- }
113
- return require_utils_mapper_session.mapSessionToAPI(formatSession({
114
- session: typedSession,
115
- user: userAPI,
116
- organization: organizationAPI ?? null,
117
- project: projectAPI ?? null,
118
- authType: "session"
119
- }));
120
- }),
121
- (0, better_auth_plugins.lastLoginMethod)({
122
- storeInDatabase: true,
123
- schema: { user: { lastLoginMethod: "lastLoginMethod" } },
124
- customResolveMethod: (context) => {
125
- if (context.path === "/magic-link/verify") return "magic-link";
126
- return null;
127
- }
128
- }),
129
- (0, better_auth_plugins_passkey.passkey)(),
130
- (0, better_auth_plugins.twoFactor)(),
131
- (0, better_auth_plugins_magic_link.magicLink)({ sendMagicLink: async ({ email, url }) => {
132
- require_logger_index.logger.info("sending magic link", {
133
- email,
134
- url
135
- });
136
- await require_services_email_service.sendEmail({
137
- type: "magicLink",
138
- to: email,
139
- username: email.split("@")[0],
140
- magicLink: url
141
- });
142
- } })
143
- ],
144
- emailAndPassword: {
145
- enabled: true,
146
- disableSignUp: false,
147
- requireEmailVerification: true,
148
- minPasswordLength: 8,
149
- maxPasswordLength: 128,
150
- autoSignIn: true,
151
- sendResetPassword: async ({ user, token }) => {
152
- require_logger_index.logger.info("sending reset password email", { email: user.email });
153
- await require_services_email_service.sendEmail({
154
- type: "resetPassword",
155
- to: user.email,
156
- username: user.name ?? user.email.split("@")[0],
157
- resetLink: `${process.env.CLIENT_URL}/auth/password/reset?token=${token}`
158
- });
159
- },
160
- resetPasswordTokenExpiresIn: 3600
161
- },
162
- accountLinking: {
163
- enabled: true,
164
- trustedProviders: [
165
- "google",
166
- "github",
167
- "linkedin"
168
- ]
169
- },
170
- emailVerification: {
171
- autoSignInAfterVerification: true,
172
- sendOnSignIn: true,
173
- sendVerificationEmail: async ({ user, url }) => {
174
- require_logger_index.logger.info("sending verification email", { email: user.email });
175
- await require_services_email_service.sendEmail({
176
- type: "validate",
177
- to: user.email,
178
- username: user.name ?? user.email.split("@")[0],
179
- validationLink: url
180
- });
181
- }
182
- },
183
- crossSubDomainCookies: {
184
- enabled: true,
185
- additionalCookies: ["session_token"],
186
- domain: process.env.CLIENT_URL
187
- },
188
- cookiePrefix: "intlayer",
189
- cookies: { session_token: {
190
- name: "session_token",
191
- attributes: {
192
- httpOnly: true,
193
- secure: true
194
- }
195
- } },
196
- trustedOrigins: [process.env.CLIENT_URL],
197
- socialProviders: {
198
- google: {
199
- clientId: process.env.GOOGLE_CLIENT_ID,
200
- clientSecret: process.env.GOOGLE_CLIENT_SECRET
201
- },
202
- github: {
203
- clientId: process.env.GITHUB_CLIENT_ID,
204
- clientSecret: process.env.GITHUB_CLIENT_SECRET
205
- },
206
- linkedin: {
207
- clientId: process.env.LINKEDIN_CLIENT_ID,
208
- clientSecret: process.env.LINKEDIN_CLIENT_SECRET
209
- }
210
- },
211
- logger: { log: (level, message, ...args) => require_logger_index.logger[level](message, ...args) }
212
- });
213
- };
214
-
215
- //#endregion
216
- exports.formatSession = formatSession;
217
- exports.getAuth = getAuth;
218
- //# sourceMappingURL=getAuth.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getAuth.cjs","names":["getSessionRoles","computeEffectivePermission","intersectPermissions","sendEmail","userAPI: UserAPI | null","organizationAPI: OrganizationAPI | null","projectAPI: ProjectAPI | null","getUserById","mapUserToAPI","getOrganizationById","mapOrganizationToAPI","getProjectById","mapProjectToAPI","mapSessionToAPI","logger"],"sources":["../../../../src/utils/auth/getAuth.ts"],"sourcesContent":["// import { sso } from '@better-auth/sso';\nimport { sendVerificationUpdate } from '@controllers/user.controller';\nimport { logger } from '@logger';\nimport { sendEmail } from '@services/email.service';\nimport { getOrganizationById } from '@services/organization.service';\nimport { getProjectById } from '@services/project.service';\nimport { getUserById } from '@services/user.service';\nimport { mapOrganizationToAPI } from '@utils/mapper/organization';\nimport { mapProjectToAPI } from '@utils/mapper/project';\nimport { mapSessionToAPI } from '@utils/mapper/session';\nimport { mapUserToAPI } from '@utils/mapper/user';\nimport {\n computeEffectivePermission,\n getSessionRoles,\n intersectPermissions,\n} from '@utils/permissions';\nimport { betterAuth, type OmitId } from 'better-auth';\nimport { mongodbAdapter } from 'better-auth/adapters/mongodb';\nimport { createAuthMiddleware } from 'better-auth/api';\nimport { customSession, lastLoginMethod, twoFactor } from 'better-auth/plugins';\nimport { magicLink } from 'better-auth/plugins/magic-link';\nimport { passkey } from 'better-auth/plugins/passkey';\nimport type { MongoClient } from 'mongodb';\nimport type { OrganizationAPI } from '@/types/organization.types';\nimport type { ProjectAPI } from '@/types/project.types';\nimport type {\n Session,\n SessionContext,\n SessionDataApi,\n} from '@/types/session.types';\nimport type { User, UserAPI } from '@/types/user.types';\n\nexport type Auth = ReturnType<typeof betterAuth>;\n\nexport const formatSession = (session: SessionContext): OmitId<Session> => {\n const roles = getSessionRoles(session);\n let permissions = computeEffectivePermission(roles);\n\n // Intersect in the case a Access Token try to override the permissions\n if (session.permissions) {\n permissions = intersectPermissions(permissions, session.permissions);\n }\n\n const resultSession = {\n session: session.session,\n user: session.user,\n organization: session.organization,\n project: session.project,\n authType: 'session',\n permissions,\n roles,\n } as OmitId<Session>;\n\n return resultSession;\n};\n\nexport const getAuth = (dbClient: MongoClient): Auth => {\n if (!dbClient) {\n throw new Error('MongoDB connection not established');\n }\n\n const auth = betterAuth({\n appName: 'Intlayer',\n\n database: mongodbAdapter(dbClient.db()),\n\n /**\n * User model\n */\n user: {\n modelName: 'users',\n },\n\n databaseHooks: {\n user: {\n create: {\n // Runs once, immediately after the INSERT\n after: async (user) => {\n if (!user?.emailVerified) return;\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n loginLink: `${process.env.CLIENT_URL}/auth/login`,\n locale: (user as any).lang,\n });\n logger.info('Welcome e‑mail delivered', {\n email: user.email,\n });\n },\n },\n },\n },\n\n hooks: {\n after: createAuthMiddleware(async (ctx) => {\n const { path, context } = ctx;\n\n const newUser = context.newSession?.user;\n const existingUser = context.session?.user;\n const user = newUser ?? existingUser;\n\n if (!user) return;\n\n if (['/verify-email'].includes(path)) {\n sendVerificationUpdate(user as unknown as User);\n logger.info('SSE verification update sent', {\n email: user.email,\n userId: user.id,\n });\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n loginLink: `${process.env.CLIENT_URL}/auth/login`,\n locale: (user as any).lang,\n });\n logger.info('Welcome e‑mail delivered', {\n email: user.email,\n });\n }\n }),\n },\n\n advanced: {\n // 1️⃣ Change or drop the global prefix\n // cookiePrefix: \"intlayer\", // => intlayer.session_token\n cookiePrefix: 'intlayer', // => session_token (no prefix)\n\n // 2️⃣ Override just the session‑token cookie\n cookies: {\n session_token: {\n // name: 'intlayer_session_token', // final name depends on the prefix above\n // attributes: { sameSite: \"lax\", maxAge: 60 * 60 * 24 } // optional\n },\n },\n\n // 3️⃣ (optional) turn off the automatic __Secure‑ prefix in non‑prod\n // useSecureCookies: false,\n },\n\n secret: process.env.AUTH_SECRET as string,\n session: {\n modelName: 'sessions',\n id: 'id',\n\n additionalFields: {\n activeOrganizationId: { type: 'string', nullable: true, input: false },\n activeProjectId: { type: 'string', nullable: true, input: false },\n },\n },\n\n plugins: [\n customSession(async ({ session }) => {\n const typedSession = session as unknown as SessionDataApi;\n\n let userAPI: UserAPI | null = null;\n let organizationAPI: OrganizationAPI | null = null;\n let projectAPI: ProjectAPI | null = null;\n\n if (typedSession.userId) {\n const userData = await getUserById(typedSession.userId);\n\n if (userData) {\n userAPI = mapUserToAPI(userData);\n }\n }\n\n if (typedSession.activeOrganizationId) {\n const orgData = await getOrganizationById(\n typedSession.activeOrganizationId\n );\n\n if (orgData) {\n organizationAPI = mapOrganizationToAPI(orgData);\n }\n }\n if (typedSession.activeProjectId) {\n const projectData = await getProjectById(\n typedSession.activeProjectId\n );\n\n if (projectData) {\n projectAPI = mapProjectToAPI(projectData);\n }\n }\n\n const sessionWithNoPermission: SessionContext = {\n session: typedSession,\n user: userAPI!,\n organization: organizationAPI ?? null,\n project: projectAPI ?? null,\n authType: 'session',\n };\n\n const formattedSession = formatSession(sessionWithNoPermission);\n\n return mapSessionToAPI(formattedSession);\n }),\n lastLoginMethod({\n storeInDatabase: true, // adds user.lastLoginMethod in DB and session\n schema: {\n user: {\n lastLoginMethod: 'lastLoginMethod', // Custom field name\n },\n },\n customResolveMethod: (context) => {\n // When user clicks the magic link\n if (context.path === '/magic-link/verify') {\n return 'magic-link';\n }\n\n // Fallback to default behavior for everything else\n return null;\n },\n }),\n passkey(),\n twoFactor(),\n magicLink({\n sendMagicLink: async ({ email, url }) => {\n logger.info('sending magic link', { email, url });\n await sendEmail({\n type: 'magicLink',\n to: email,\n username: email.split('@')[0],\n magicLink: url,\n });\n },\n }),\n // sso(),\n ],\n\n emailAndPassword: {\n enabled: true,\n disableSignUp: false,\n requireEmailVerification: true,\n minPasswordLength: 8,\n maxPasswordLength: 128,\n autoSignIn: true,\n sendResetPassword: async ({ user, token }) => {\n logger.info('sending reset password email', { email: user.email });\n await sendEmail({\n type: 'resetPassword',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n resetLink: `${process.env.CLIENT_URL}/auth/password/reset?token=${token}`,\n });\n },\n resetPasswordTokenExpiresIn: 3600,\n },\n accountLinking: {\n enabled: true, // allow linking in general\n trustedProviders: ['google', 'github', 'linkedin'], // optional: auto‑link when Google verifies the e‑mail\n },\n emailVerification: {\n autoSignInAfterVerification: true,\n sendOnSignIn: true,\n sendVerificationEmail: async ({ user, url }) => {\n logger.info('sending verification email', { email: user.email });\n await sendEmail({\n type: 'validate',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n validationLink: url,\n });\n },\n },\n\n crossSubDomainCookies: {\n enabled: true,\n additionalCookies: ['session_token'],\n domain: process.env.CLIENT_URL as string,\n },\n cookiePrefix: 'intlayer',\n cookies: {\n session_token: {\n name: 'session_token',\n attributes: {\n httpOnly: true,\n secure: true,\n },\n },\n },\n\n trustedOrigins: [process.env.CLIENT_URL as string],\n\n socialProviders: {\n google: {\n clientId: process.env.GOOGLE_CLIENT_ID as string,\n clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,\n },\n github: {\n clientId: process.env.GITHUB_CLIENT_ID as string,\n clientSecret: process.env.GITHUB_CLIENT_SECRET as string,\n },\n linkedin: {\n clientId: process.env.LINKEDIN_CLIENT_ID as string,\n clientSecret: process.env.LINKEDIN_CLIENT_SECRET as string,\n },\n // socialProviders: {\n // apple: {\n // clientId: process.env.APPLE_CLIENT_ID as string,\n // clientSecret: process.env.APPLE_CLIENT_SECRET as string,\n // // Optional\n // appBundleIdentifier: process.env\n // .APPLE_APP_BUNDLE_IDENTIFIER as string,\n // },\n // },\n // // Add appleid.apple.com to trustedOrigins for Sign In with Apple flows\n // trustedOrigins: ['https://appleid.apple.com'],\n },\n\n logger: {\n log: (level, message, ...args) => logger[level](message, ...args),\n },\n });\n\n return auth;\n};\n"],"mappings":"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"}