@intlayer/backend 8.12.2 → 8.12.4-canary.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.
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/bundle_optimization.json +9954 -6953
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/configuration.json +1 -1
- package/dist/esm/controllers/ai.controller.mjs.map +1 -1
- package/dist/esm/controllers/audit.controller.mjs.map +1 -1
- package/dist/esm/controllers/bitbucket.controller.mjs.map +1 -1
- package/dist/esm/controllers/cliSessionToken.controller.mjs.map +1 -1
- package/dist/esm/controllers/demo.controller.mjs +32 -25
- package/dist/esm/controllers/demo.controller.mjs.map +1 -1
- package/dist/esm/controllers/dictionary.controller.mjs +1 -0
- package/dist/esm/controllers/dictionary.controller.mjs.map +1 -1
- package/dist/esm/controllers/environment.controller.mjs.map +1 -1
- package/dist/esm/controllers/eventListener.controller.mjs.map +1 -1
- package/dist/esm/controllers/github.controller.mjs.map +1 -1
- package/dist/esm/controllers/gitlab.controller.mjs.map +1 -1
- package/dist/esm/controllers/newsletter.controller.mjs.map +1 -1
- package/dist/esm/controllers/oAuth2.controller.mjs.map +1 -1
- package/dist/esm/controllers/organization.controller.mjs.map +1 -1
- package/dist/esm/controllers/project.controller.mjs.map +1 -1
- package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -1
- package/dist/esm/controllers/projectMemberAccess.controller.mjs.map +1 -1
- package/dist/esm/controllers/recursiveAudit.controller.mjs.map +1 -1
- package/dist/esm/controllers/reviewer.controller.mjs.map +1 -1
- package/dist/esm/controllers/searchDoc.controller.mjs.map +1 -1
- package/dist/esm/controllers/showcaseProject.controller.mjs.map +1 -1
- package/dist/esm/controllers/stripe.controller.mjs.map +1 -1
- package/dist/esm/controllers/tag.controller.mjs.map +1 -1
- package/dist/esm/controllers/translation.controller.mjs.map +1 -1
- package/dist/esm/controllers/user.controller.mjs.map +1 -1
- package/dist/esm/emails/AffiliateActivatedEmail.mjs.map +1 -1
- package/dist/esm/emails/AffiliateConversionEmail.mjs.map +1 -1
- package/dist/esm/emails/AffiliateInvitationEmail.mjs.map +1 -1
- package/dist/esm/emails/AffiliateWelcomeEmail.mjs.map +1 -1
- package/dist/esm/emails/InviteUserEmail.mjs.map +1 -1
- package/dist/esm/emails/MagicLinkEmail.mjs.map +1 -1
- package/dist/esm/emails/MissionRequestedClientEmail.mjs.map +1 -1
- package/dist/esm/emails/MissionRequestedReviewerEmail.mjs.map +1 -1
- package/dist/esm/emails/OAuthTokenCreatedEmail.mjs.map +1 -1
- package/dist/esm/emails/PasswordChangeConfirmation.mjs.map +1 -1
- package/dist/esm/emails/ResetUserPassword.mjs.map +1 -1
- package/dist/esm/emails/ReviewerApplicationEmail.mjs.map +1 -1
- package/dist/esm/emails/ReviewerApprovedEmail.mjs.map +1 -1
- package/dist/esm/emails/ReviewerContactEmail.mjs.map +1 -1
- package/dist/esm/emails/SubscriptionPaymentCancellation.mjs.map +1 -1
- package/dist/esm/emails/SubscriptionPaymentError.mjs.map +1 -1
- package/dist/esm/emails/SubscriptionPaymentSuccess.mjs.map +1 -1
- package/dist/esm/emails/ValidateUserEmail.mjs.map +1 -1
- package/dist/esm/emails/Welcome.mjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/logger/index.mjs.map +1 -1
- package/dist/esm/middlewares/oAuth2.middleware.mjs.map +1 -1
- package/dist/esm/middlewares/sessionAuth.middleware.mjs.map +1 -1
- package/dist/esm/routes/ai.routes.mjs.map +1 -1
- package/dist/esm/routes/audit.routes.mjs.map +1 -1
- package/dist/esm/routes/bitbucket.routes.mjs.map +1 -1
- package/dist/esm/routes/demo.routes.mjs.map +1 -1
- package/dist/esm/routes/dictionary.routes.mjs.map +1 -1
- package/dist/esm/routes/environment.routes.mjs.map +1 -1
- package/dist/esm/routes/eventListener.routes.mjs.map +1 -1
- package/dist/esm/routes/github.routes.mjs.map +1 -1
- package/dist/esm/routes/gitlab.routes.mjs.map +1 -1
- package/dist/esm/routes/newsletter.routes.mjs.map +1 -1
- package/dist/esm/routes/organization.routes.mjs.map +1 -1
- package/dist/esm/routes/paramsSchemas.mjs.map +1 -1
- package/dist/esm/routes/project.routes.mjs.map +1 -1
- package/dist/esm/routes/reviewer.routes.mjs.map +1 -1
- package/dist/esm/routes/search.routes.mjs.map +1 -1
- package/dist/esm/routes/showcaseProject.routes.mjs.map +1 -1
- package/dist/esm/routes/stripe.routes.mjs.map +1 -1
- package/dist/esm/routes/tags.routes.mjs.map +1 -1
- package/dist/esm/routes/translate.routes.mjs.map +1 -1
- package/dist/esm/routes/user.routes.mjs.map +1 -1
- package/dist/esm/schemas/account.schema.mjs.map +1 -1
- package/dist/esm/schemas/affiliate.schema.mjs.map +1 -1
- package/dist/esm/schemas/affiliateInvitation.schema.mjs.map +1 -1
- package/dist/esm/schemas/audit.schema.mjs.map +1 -1
- package/dist/esm/schemas/auditJob.schema.mjs.map +1 -1
- package/dist/esm/schemas/auditPage.schema.mjs.map +1 -1
- package/dist/esm/schemas/cliSessionToken.schema.mjs.map +1 -1
- package/dist/esm/schemas/dictionary.schema.mjs.map +1 -1
- package/dist/esm/schemas/discussion.schema.mjs.map +1 -1
- package/dist/esm/schemas/oAuth2.schema.mjs.map +1 -1
- package/dist/esm/schemas/organization.schema.mjs.map +1 -1
- package/dist/esm/schemas/plans.schema.mjs.map +1 -1
- package/dist/esm/schemas/project.schema.mjs.map +1 -1
- package/dist/esm/schemas/promoCode.schema.mjs.map +1 -1
- package/dist/esm/schemas/reviewer.schema.mjs.map +1 -1
- package/dist/esm/schemas/session.schema.mjs.map +1 -1
- package/dist/esm/schemas/showcaseProject.schema.mjs.map +1 -1
- package/dist/esm/schemas/tag.schema.mjs.map +1 -1
- package/dist/esm/schemas/user.schema.mjs.map +1 -1
- package/dist/esm/services/affiliate.service.mjs.map +1 -1
- package/dist/esm/services/audit/analysis/analyzeBundleContent.mjs.map +1 -1
- package/dist/esm/services/audit/analysis/analyzeLinguisticStructure.mjs.map +1 -1
- package/dist/esm/services/audit/analysis/analyzeMetadata.mjs.map +1 -1
- package/dist/esm/services/audit/analysis/analyzeRobots.mjs.map +1 -1
- package/dist/esm/services/audit/analysis/analyzeSitemap.mjs.map +1 -1
- package/dist/esm/services/audit/analysis/analyzeUrlStructure.mjs.map +1 -1
- package/dist/esm/services/audit/analysis/calculateScore.mjs.map +1 -1
- package/dist/esm/services/audit/checkers/bundleChecker.mjs.map +1 -1
- package/dist/esm/services/audit/checkers/linguisticChecker.mjs.map +1 -1
- package/dist/esm/services/audit/checkers/metadataChecker.mjs.map +1 -1
- package/dist/esm/services/audit/checkers/pageChecker.mjs.map +1 -1
- package/dist/esm/services/audit/checkers/robotsChecker.mjs.map +1 -1
- package/dist/esm/services/audit/checkers/sitemapChecker.mjs.map +1 -1
- package/dist/esm/services/audit/checkers/urlChecker.mjs.map +1 -1
- package/dist/esm/services/audit/recursiveAudit.service.mjs.map +1 -1
- package/dist/esm/services/audit/seoAudit.service.mjs.map +1 -1
- package/dist/esm/services/bitbucket.service.mjs.map +1 -1
- package/dist/esm/services/ci.service.mjs.map +1 -1
- package/dist/esm/services/cliSessionToken.service.mjs.map +1 -1
- package/dist/esm/services/dictionary.service.mjs.map +1 -1
- package/dist/esm/services/email.service.mjs.map +1 -1
- package/dist/esm/services/environment.service.mjs.map +1 -1
- package/dist/esm/services/github.service.mjs.map +1 -1
- package/dist/esm/services/gitlab.service.mjs.map +1 -1
- package/dist/esm/services/oAuth2.service.mjs.map +1 -1
- package/dist/esm/services/organization.service.mjs.map +1 -1
- package/dist/esm/services/project/projectScreenshot.service.mjs.map +1 -1
- package/dist/esm/services/project.service.mjs.map +1 -1
- package/dist/esm/services/projectAccessKey.service.mjs.map +1 -1
- package/dist/esm/services/promoCode.service.mjs.map +1 -1
- package/dist/esm/services/reviewer/pictureUpload.service.mjs.map +1 -1
- package/dist/esm/services/reviewer.service.mjs.map +1 -1
- package/dist/esm/services/reviewerMessage.service.mjs.map +1 -1
- package/dist/esm/services/reviewerMission.service.mjs.map +1 -1
- package/dist/esm/services/session.service.mjs.map +1 -1
- package/dist/esm/services/showcase/showcaseProject.service.mjs.map +1 -1
- package/dist/esm/services/showcase/showcaseScan.service.mjs.map +1 -1
- package/dist/esm/services/showcase/showcaseUploadScreenshot.service.mjs.map +1 -1
- package/dist/esm/services/showcase/showcaseVerifyBundle.service.mjs.map +1 -1
- package/dist/esm/services/showcase/showcaseVerifyGithub.service.mjs.map +1 -1
- package/dist/esm/services/subscription.service.mjs.map +1 -1
- package/dist/esm/services/tag.service.mjs.map +1 -1
- package/dist/esm/services/translationQueue.service.mjs.map +1 -1
- package/dist/esm/services/translationWorker.service.mjs.map +1 -1
- package/dist/esm/services/user/avatarUpload.service.mjs.map +1 -1
- package/dist/esm/services/user.service.mjs.map +1 -1
- package/dist/esm/services/webhook.service.mjs.map +1 -1
- package/dist/esm/types/user.types.mjs.map +1 -1
- package/dist/esm/utils/AI/askDocQuestion/askDocQuestion.mjs.map +1 -1
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/bundle_optimization.json +9954 -6953
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/configuration.json +1 -1
- package/dist/esm/utils/AI/askDocQuestion/indexMarkdownFiles.mjs.map +1 -1
- package/dist/esm/utils/AI/auditDictionary/index.mjs.map +1 -1
- package/dist/esm/utils/AI/auditDictionaryField/index.mjs.map +1 -1
- package/dist/esm/utils/AI/auditDictionaryMetadata/index.mjs.map +1 -1
- package/dist/esm/utils/AI/auditTag/index.mjs.map +1 -1
- package/dist/esm/utils/AI/autocomplete/index.mjs.map +1 -1
- package/dist/esm/utils/AI/chat/index.mjs.map +1 -1
- package/dist/esm/utils/AI/chat/mcpInProcessTools.mjs.map +1 -1
- package/dist/esm/utils/AI/chat/sessionTools.mjs.map +1 -1
- package/dist/esm/utils/AI/customQuery/index.mjs.map +1 -1
- package/dist/esm/utils/AI/getProjectAIOptions.mjs.map +1 -1
- package/dist/esm/utils/AI/translateDictionaryDB.mjs.map +1 -1
- package/dist/esm/utils/AI/translateJSON/index.mjs.map +1 -1
- package/dist/esm/utils/accessControl.mjs.map +1 -1
- package/dist/esm/utils/auth/getAuth.mjs.map +1 -1
- package/dist/esm/utils/cors.mjs +2 -13
- package/dist/esm/utils/cors.mjs.map +1 -1
- package/dist/esm/utils/demoDictionaries.mjs.map +1 -1
- package/dist/esm/utils/ensureArrayQueryFilter.mjs.map +1 -1
- package/dist/esm/utils/ensureMongoDocumentToObject.mjs.map +1 -1
- package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -1
- package/dist/esm/utils/errors/ErrorsClass.mjs.map +1 -1
- package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
- package/dist/esm/utils/errors/index.mjs +1 -0
- package/dist/esm/utils/filtersAndPagination/getDictionaryFiltersAndPagination.mjs.map +1 -1
- package/dist/esm/utils/filtersAndPagination/getDiscussionFiltersAndPagination.mjs.map +1 -1
- package/dist/esm/utils/filtersAndPagination/getFiltersAndPaginationFromBody.mjs.map +1 -1
- package/dist/esm/utils/filtersAndPagination/getOrganizationFiltersAndPagination.mjs.map +1 -1
- package/dist/esm/utils/filtersAndPagination/getProjectFiltersAndPagination.mjs.map +1 -1
- package/dist/esm/utils/filtersAndPagination/getTagFiltersAndPagination.mjs.map +1 -1
- package/dist/esm/utils/filtersAndPagination/getUserFiltersAndPagination.mjs.map +1 -1
- package/dist/esm/utils/getFaviconUrl.mjs.map +1 -1
- package/dist/esm/utils/github/connectGithub.mjs.map +1 -1
- package/dist/esm/utils/httpStatusCodes.mjs.map +1 -1
- package/dist/esm/utils/image/resizeImage.mjs.map +1 -1
- package/dist/esm/utils/mapper/dictionary.mjs.map +1 -1
- package/dist/esm/utils/mapper/organization.mjs.map +1 -1
- package/dist/esm/utils/mapper/project.mjs.map +1 -1
- package/dist/esm/utils/mapper/session.mjs.map +1 -1
- package/dist/esm/utils/mapper/showcaseProject.mjs.map +1 -1
- package/dist/esm/utils/mapper/tag.mjs.map +1 -1
- package/dist/esm/utils/mapper/user.mjs.map +1 -1
- package/dist/esm/utils/mongoDB/connectDB.mjs.map +1 -1
- package/dist/esm/utils/oAuth2.mjs.map +1 -1
- package/dist/esm/utils/permissions.mjs.map +1 -1
- package/dist/esm/utils/plan.mjs.map +1 -1
- package/dist/esm/utils/puppeteer/launchBrowser.mjs.map +1 -1
- package/dist/esm/utils/rateLimiter.mjs.map +1 -1
- package/dist/esm/utils/redis/connectRedis.mjs.map +1 -1
- package/dist/esm/utils/removeObjectKeys.mjs.map +1 -1
- package/dist/esm/utils/responseData.mjs.map +1 -1
- package/dist/esm/utils/s3/s3Client.mjs.map +1 -1
- package/dist/esm/utils/validation/validateDictionary.mjs.map +1 -1
- package/dist/esm/utils/validation/validateOrganization.mjs.map +1 -1
- package/dist/esm/utils/validation/validateProject.mjs.map +1 -1
- package/dist/esm/utils/validation/validateTag.mjs.map +1 -1
- package/dist/esm/utils/validation/validateUser.mjs.map +1 -1
- package/dist/esm/webhooks/stripe.webhook.mjs.map +1 -1
- package/dist/types/controllers/ai.controller.d.ts.map +1 -1
- package/dist/types/controllers/bitbucket.controller.d.ts.map +1 -1
- package/dist/types/controllers/cliSessionToken.controller.d.ts.map +1 -1
- package/dist/types/controllers/demo.controller.d.ts.map +1 -1
- package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
- package/dist/types/controllers/environment.controller.d.ts.map +1 -1
- package/dist/types/controllers/eventListener.controller.d.ts.map +1 -1
- package/dist/types/controllers/github.controller.d.ts.map +1 -1
- package/dist/types/controllers/gitlab.controller.d.ts.map +1 -1
- package/dist/types/controllers/newsletter.controller.d.ts.map +1 -1
- package/dist/types/controllers/oAuth2.controller.d.ts.map +1 -1
- package/dist/types/controllers/organization.controller.d.ts.map +1 -1
- package/dist/types/controllers/project.controller.d.ts.map +1 -1
- package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
- package/dist/types/controllers/projectMemberAccess.controller.d.ts.map +1 -1
- package/dist/types/controllers/recursiveAudit.controller.d.ts.map +1 -1
- package/dist/types/controllers/reviewer.controller.d.ts.map +1 -1
- package/dist/types/controllers/searchDoc.controller.d.ts.map +1 -1
- package/dist/types/controllers/showcaseProject.controller.d.ts.map +1 -1
- package/dist/types/controllers/stripe.controller.d.ts.map +1 -1
- package/dist/types/controllers/tag.controller.d.ts.map +1 -1
- package/dist/types/controllers/translation.controller.d.ts.map +1 -1
- package/dist/types/controllers/user.controller.d.ts.map +1 -1
- package/dist/types/emails/AffiliateActivatedEmail.d.ts +20 -18
- package/dist/types/emails/AffiliateActivatedEmail.d.ts.map +1 -1
- package/dist/types/emails/AffiliateConversionEmail.d.ts +21 -19
- package/dist/types/emails/AffiliateConversionEmail.d.ts.map +1 -1
- package/dist/types/emails/AffiliateInvitationEmail.d.ts +20 -18
- package/dist/types/emails/AffiliateInvitationEmail.d.ts.map +1 -1
- package/dist/types/emails/AffiliateWelcomeEmail.d.ts +20 -18
- package/dist/types/emails/AffiliateWelcomeEmail.d.ts.map +1 -1
- package/dist/types/emails/InviteUserEmail.d.ts +20 -18
- package/dist/types/emails/InviteUserEmail.d.ts.map +1 -1
- package/dist/types/emails/MagicLinkEmail.d.ts +20 -18
- package/dist/types/emails/MagicLinkEmail.d.ts.map +1 -1
- package/dist/types/emails/MissionRequestedClientEmail.d.ts +20 -18
- package/dist/types/emails/MissionRequestedClientEmail.d.ts.map +1 -1
- package/dist/types/emails/MissionRequestedReviewerEmail.d.ts +20 -18
- package/dist/types/emails/MissionRequestedReviewerEmail.d.ts.map +1 -1
- package/dist/types/emails/OAuthTokenCreatedEmail.d.ts +20 -18
- package/dist/types/emails/OAuthTokenCreatedEmail.d.ts.map +1 -1
- package/dist/types/emails/PasswordChangeConfirmation.d.ts +20 -18
- package/dist/types/emails/PasswordChangeConfirmation.d.ts.map +1 -1
- package/dist/types/emails/ResetUserPassword.d.ts +20 -18
- package/dist/types/emails/ResetUserPassword.d.ts.map +1 -1
- package/dist/types/emails/ReviewerApplicationEmail.d.ts +20 -18
- package/dist/types/emails/ReviewerApplicationEmail.d.ts.map +1 -1
- package/dist/types/emails/ReviewerApprovedEmail.d.ts +20 -18
- package/dist/types/emails/ReviewerApprovedEmail.d.ts.map +1 -1
- package/dist/types/emails/ReviewerContactEmail.d.ts +3 -1
- package/dist/types/emails/ReviewerContactEmail.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +20 -18
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentError.d.ts +20 -18
- package/dist/types/emails/SubscriptionPaymentError.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +20 -18
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -1
- package/dist/types/emails/ValidateUserEmail.d.ts +20 -18
- package/dist/types/emails/ValidateUserEmail.d.ts.map +1 -1
- package/dist/types/emails/Welcome.d.ts +20 -18
- package/dist/types/emails/Welcome.d.ts.map +1 -1
- package/dist/types/export.d.ts +1 -1
- package/dist/types/logger/index.d.ts +3 -1
- package/dist/types/logger/index.d.ts.map +1 -1
- package/dist/types/middlewares/oAuth2.middleware.d.ts.map +1 -1
- package/dist/types/middlewares/sessionAuth.middleware.d.ts.map +1 -1
- package/dist/types/routes/demo.routes.d.ts.map +1 -1
- package/dist/types/schemas/account.schema.d.ts +35 -34
- package/dist/types/schemas/account.schema.d.ts.map +1 -1
- package/dist/types/schemas/affiliate.schema.d.ts +109 -108
- package/dist/types/schemas/affiliate.schema.d.ts.map +1 -1
- package/dist/types/schemas/affiliateInvitation.schema.d.ts +49 -48
- package/dist/types/schemas/affiliateInvitation.schema.d.ts.map +1 -1
- package/dist/types/schemas/audit.schema.d.ts.map +1 -1
- package/dist/types/schemas/auditJob.schema.d.ts +6 -6
- package/dist/types/schemas/auditPage.schema.d.ts +6 -6
- package/dist/types/schemas/cliSessionToken.schema.d.ts +14 -13
- package/dist/types/schemas/cliSessionToken.schema.d.ts.map +1 -1
- package/dist/types/schemas/dictionary.schema.d.ts +60 -59
- package/dist/types/schemas/dictionary.schema.d.ts.map +1 -1
- package/dist/types/schemas/discussion.schema.d.ts +51 -50
- package/dist/types/schemas/discussion.schema.d.ts.map +1 -1
- package/dist/types/schemas/oAuth2.schema.d.ts +18 -17
- package/dist/types/schemas/oAuth2.schema.d.ts.map +1 -1
- package/dist/types/schemas/organization.schema.d.ts +45 -44
- package/dist/types/schemas/organization.schema.d.ts.map +1 -1
- package/dist/types/schemas/plans.schema.d.ts +45 -44
- package/dist/types/schemas/plans.schema.d.ts.map +1 -1
- package/dist/types/schemas/project.schema.d.ts +73 -72
- package/dist/types/schemas/project.schema.d.ts.map +1 -1
- package/dist/types/schemas/promoCode.schema.d.ts +61 -60
- package/dist/types/schemas/promoCode.schema.d.ts.map +1 -1
- package/dist/types/schemas/reviewer.schema.d.ts +221 -220
- package/dist/types/schemas/reviewer.schema.d.ts.map +1 -1
- package/dist/types/schemas/session.schema.d.ts +54 -52
- package/dist/types/schemas/session.schema.d.ts.map +1 -1
- package/dist/types/schemas/showcaseProject.schema.d.ts +61 -60
- package/dist/types/schemas/showcaseProject.schema.d.ts.map +1 -1
- package/dist/types/schemas/tag.schema.d.ts +45 -44
- package/dist/types/schemas/tag.schema.d.ts.map +1 -1
- package/dist/types/schemas/user.schema.d.ts +71 -70
- package/dist/types/schemas/user.schema.d.ts.map +1 -1
- package/dist/types/services/affiliate.service.d.ts.map +1 -1
- package/dist/types/services/audit/analysis/analyzeBundleContent.d.ts.map +1 -1
- package/dist/types/services/audit/analysis/analyzeLinguisticStructure.d.ts.map +1 -1
- package/dist/types/services/audit/analysis/analyzeRobots.d.ts.map +1 -1
- package/dist/types/services/audit/analysis/analyzeSitemap.d.ts.map +1 -1
- package/dist/types/services/audit/analysis/calculateScore.d.ts.map +1 -1
- package/dist/types/services/audit/checkers/bundleChecker.d.ts.map +1 -1
- package/dist/types/services/audit/recursiveAudit.service.d.ts +5 -4
- package/dist/types/services/audit/recursiveAudit.service.d.ts.map +1 -1
- package/dist/types/services/audit/types.d.ts.map +1 -1
- package/dist/types/services/bitbucket.service.d.ts.map +1 -1
- package/dist/types/services/cliSessionToken.service.d.ts.map +1 -1
- package/dist/types/services/dictionary.service.d.ts.map +1 -1
- package/dist/types/services/email.service.d.ts.map +1 -1
- package/dist/types/services/github.service.d.ts.map +1 -1
- package/dist/types/services/gitlab.service.d.ts.map +1 -1
- package/dist/types/services/oAuth2.service.d.ts.map +1 -1
- package/dist/types/services/organization.service.d.ts.map +1 -1
- package/dist/types/services/project/projectScreenshot.service.d.ts.map +1 -1
- package/dist/types/services/project.service.d.ts.map +1 -1
- package/dist/types/services/promoCode.service.d.ts.map +1 -1
- package/dist/types/services/reviewer/pictureUpload.service.d.ts.map +1 -1
- package/dist/types/services/reviewer.service.d.ts.map +1 -1
- package/dist/types/services/reviewerMessage.service.d.ts.map +1 -1
- package/dist/types/services/reviewerMission.service.d.ts.map +1 -1
- package/dist/types/services/session.service.d.ts.map +1 -1
- package/dist/types/services/showcase/showcaseProject.service.d.ts.map +1 -1
- package/dist/types/services/showcase/showcaseScan.service.d.ts.map +1 -1
- package/dist/types/services/showcase/showcaseUploadScreenshot.service.d.ts.map +1 -1
- package/dist/types/services/showcase/showcaseVerifyBundle.service.d.ts.map +1 -1
- package/dist/types/services/showcase/showcaseVerifyGithub.service.d.ts.map +1 -1
- package/dist/types/services/subscription.service.d.ts.map +1 -1
- package/dist/types/services/tag.service.d.ts.map +1 -1
- package/dist/types/services/translationQueue.service.d.ts +2 -1
- package/dist/types/services/translationQueue.service.d.ts.map +1 -1
- package/dist/types/services/translationWorker.service.d.ts.map +1 -1
- package/dist/types/services/user/avatarUpload.service.d.ts.map +1 -1
- package/dist/types/services/user.service.d.ts.map +1 -1
- package/dist/types/services/webhook.service.d.ts.map +1 -1
- package/dist/types/types/Routes.d.ts.map +1 -1
- package/dist/types/types/account.types.d.ts.map +1 -1
- package/dist/types/types/affiliate.types.d.ts.map +1 -1
- package/dist/types/types/affiliateInvitation.types.d.ts.map +1 -1
- package/dist/types/types/dictionary.types.d.ts.map +1 -1
- package/dist/types/types/discussion.types.d.ts.map +1 -1
- package/dist/types/types/oAuth2.types.d.ts.map +1 -1
- package/dist/types/types/organization.types.d.ts.map +1 -1
- package/dist/types/types/plan.types.d.ts.map +1 -1
- package/dist/types/types/project.types.d.ts.map +1 -1
- package/dist/types/types/promoCode.types.d.ts.map +1 -1
- package/dist/types/types/reviewer.types.d.ts.map +1 -1
- package/dist/types/types/session.types.d.ts.map +1 -1
- package/dist/types/types/showcaseProject.types.d.ts.map +1 -1
- package/dist/types/types/tag.types.d.ts.map +1 -1
- package/dist/types/types/user.types.d.ts.map +1 -1
- package/dist/types/utils/AI/askDocQuestion/askDocQuestion.d.ts.map +1 -1
- package/dist/types/utils/AI/askDocQuestion/indexMarkdownFiles.d.ts.map +1 -1
- package/dist/types/utils/AI/auditDictionary/index.d.ts.map +1 -1
- package/dist/types/utils/AI/auditDictionaryField/index.d.ts.map +1 -1
- package/dist/types/utils/AI/auditDictionaryMetadata/index.d.ts.map +1 -1
- package/dist/types/utils/AI/auditTag/index.d.ts.map +1 -1
- package/dist/types/utils/AI/autocomplete/index.d.ts.map +1 -1
- package/dist/types/utils/AI/chat/index.d.ts.map +1 -1
- package/dist/types/utils/AI/chat/mcpInProcessTools.d.ts.map +1 -1
- package/dist/types/utils/AI/chat/sessionTools.d.ts +25 -24
- package/dist/types/utils/AI/chat/sessionTools.d.ts.map +1 -1
- package/dist/types/utils/AI/customQuery/index.d.ts.map +1 -1
- package/dist/types/utils/AI/translateDictionaryDB.d.ts.map +1 -1
- package/dist/types/utils/AI/translateJSON/index.d.ts.map +1 -1
- package/dist/types/utils/auth/getAuth.d.ts.map +1 -1
- package/dist/types/utils/cors.d.ts +1 -7
- package/dist/types/utils/cors.d.ts.map +1 -1
- package/dist/types/utils/demoDictionaries.d.ts.map +1 -1
- package/dist/types/utils/ensureArrayQueryFilter.d.ts.map +1 -1
- package/dist/types/utils/errors/ErrorHandler.d.ts +8 -6
- package/dist/types/utils/errors/ErrorHandler.d.ts.map +1 -1
- package/dist/types/utils/errors/ErrorsClass.d.ts.map +1 -1
- package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
- package/dist/types/utils/filtersAndPagination/getDictionaryFiltersAndPagination.d.ts.map +1 -1
- package/dist/types/utils/filtersAndPagination/getDiscussionFiltersAndPagination.d.ts.map +1 -1
- package/dist/types/utils/filtersAndPagination/getFiltersAndPaginationFromBody.d.ts.map +1 -1
- package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts.map +1 -1
- package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts.map +1 -1
- package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts +7 -6
- package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts.map +1 -1
- package/dist/types/utils/filtersAndPagination/getUserFiltersAndPagination.d.ts.map +1 -1
- package/dist/types/utils/getFaviconUrl.d.ts.map +1 -1
- package/dist/types/utils/github/connectGithub.d.ts.map +1 -1
- package/dist/types/utils/httpStatusCodes.d.ts.map +1 -1
- package/dist/types/utils/image/resizeImage.d.ts.map +1 -1
- package/dist/types/utils/mapper/dictionary.d.ts.map +1 -1
- package/dist/types/utils/mapper/project.d.ts.map +1 -1
- package/dist/types/utils/mapper/session.d.ts.map +1 -1
- package/dist/types/utils/mapper/showcaseProject.d.ts.map +1 -1
- package/dist/types/utils/mapper/tag.d.ts.map +1 -1
- package/dist/types/utils/mergeFunctionTypes.d.ts.map +1 -1
- package/dist/types/utils/mongoDB/connectDB.d.ts.map +1 -1
- package/dist/types/utils/mongoDB/types.d.ts.map +1 -1
- package/dist/types/utils/oAuth2.d.ts.map +1 -1
- package/dist/types/utils/permissions.d.ts +2 -1
- package/dist/types/utils/permissions.d.ts.map +1 -1
- package/dist/types/utils/plan.d.ts.map +1 -1
- package/dist/types/utils/rateLimiter.d.ts.map +1 -1
- package/dist/types/utils/redis/connectRedis.d.ts.map +1 -1
- package/dist/types/utils/responseData.d.ts.map +1 -1
- package/dist/types/utils/s3/s3Client.d.ts.map +1 -1
- package/dist/types/utils/validation/validateDictionary.d.ts.map +1 -1
- package/dist/types/utils/validation/validateOrganization.d.ts.map +1 -1
- package/dist/types/utils/validation/validateProject.d.ts.map +1 -1
- package/dist/types/utils/validation/validateTag.d.ts.map +1 -1
- package/dist/types/utils/validation/validateUser.d.ts.map +1 -1
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAuth.mjs","names":[],"sources":["../../../../src/utils/auth/getAuth.ts"],"sourcesContent":["import { passkey } from '@better-auth/passkey';\nimport { sso } from '@better-auth/sso';\nimport { sendVerificationUpdate } from '@controllers/user.controller';\nimport { logger } from '@logger';\nimport { sendEmail } from '@services/email.service';\nimport { resolveSessionEnvironment } from '@services/environment.service';\nimport { getOrganizationById } from '@services/organization.service';\nimport { getProjectById } from '@services/project.service';\nimport {\n clearZombieSessionContext,\n restoreSessionContext,\n} from '@services/session.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 } 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 type { MongoClient } from 'mongodb';\nimport { Types } from 'mongoose';\nimport type { Organization, OrganizationAPI } from '@/types/organization.types';\nimport type { Project, ProjectAPI } from '@/types/project.types';\nimport type {\n Session,\n SessionContext,\n SessionDataApi,\n} from '@/types/session.types';\nimport type { UserAPI } from '@/types/user.types';\n\nexport type Auth = ReturnType<typeof betterAuth>;\n\n// Check if we are in production based on the domain or NODE_ENV\nconst isProd = process.env.DOMAIN !== 'localhost';\n\nlet _authSingleton: Auth | null = null;\n\nexport const initializeAuth = (dbClient: MongoClient): Auth => {\n _authSingleton = getAuth(dbClient);\n return _authSingleton;\n};\n\nexport const getAuthSingleton = (): Auth => {\n if (!_authSingleton) {\n throw new Error('Auth not initialized. Call initializeAuth first.');\n }\n return _authSingleton;\n};\n\nexport const formatSession = (session: SessionContext): 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: Session = {\n session: session.session as Session['session'],\n user: session.user as Session['user'],\n organization: (session.organization as Organization | null) ?? null,\n project: (session.project as Project | null) ?? null,\n environment: session.environment ?? null,\n authType: 'session',\n permissions,\n roles,\n allowedEnvironmentIds: session.allowedEnvironmentIds ?? null,\n allowedLocales: session.allowedLocales ?? null,\n ...(session.session?.id && {\n id: new Types.ObjectId(session.session.id),\n }),\n };\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 baseURL: process.env.BACKEND_URL,\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.APP_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 (path.includes('/verify-email')) {\n // Fetch fresh user from DB so emailVerified is definitely up-to-date\n // (the hook context user may be a stale snapshot from before the DB write).\n const freshUser = await getUserById(user.id);\n\n if (freshUser) {\n sendVerificationUpdate(freshUser);\n }\n\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.APP_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 crossSubDomainCookies: {\n enabled: isProd,\n domain: isProd ? process.env.DOMAIN : undefined,\n additionalCookies: ['session_token'],\n },\n cookiePrefix: 'intlayer',\n cookies: {\n session_token: {\n name: 'session_token',\n attributes: {\n httpOnly: true,\n secure: isProd,\n sameSite: 'lax',\n },\n },\n },\n },\n\n secret: process.env.BETTER_AUTH_SECRET as string,\n session: {\n modelName: 'sessions',\n id: 'id',\n\n // Session lives for 30 days; each access made more than 1 day after the\n // last refresh slides the expiry forward, so an active user effectively\n // stays signed in indefinitely.\n expiresIn: 60 * 60 * 24 * 30,\n updateAge: 60 * 60 * 24,\n\n // Cache the session in a signed cookie for 5 minutes to avoid hitting\n // Mongo on every request while still picking up updateAge refreshes.\n cookieCache: {\n enabled: false,\n maxAge: 5 * 60,\n },\n\n additionalFields: {\n activeOrganizationId: { type: 'string', nullable: true, input: false },\n activeProjectId: { type: 'string', nullable: true, input: false },\n activeEnvironmentId: { 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 const normalizeId = (rawId: unknown): string | null => {\n if (typeof rawId === 'string') return rawId;\n if (\n rawId &&\n typeof rawId === 'object' &&\n 'buffer' in rawId &&\n (rawId as any).buffer instanceof Uint8Array\n ) {\n return Buffer.from((rawId as any).buffer).toString('hex');\n }\n return null;\n };\n\n const storedOrganizationId = typedSession.activeOrganizationId\n ? normalizeId(typedSession.activeOrganizationId)\n : null;\n const storedProjectId = typedSession.activeProjectId\n ? normalizeId(typedSession.activeProjectId)\n : null;\n // null = production (default env); ObjectId string = non-default env\n const storedEnvironmentId = typedSession.activeEnvironmentId\n ? normalizeId(typedSession.activeEnvironmentId)\n : null;\n\n const userData = typedSession.userId\n ? await getUserById(typedSession.userId)\n : null;\n\n // Restore org/project context from user document when the session lacks it\n const { organizationId, projectId } = await restoreSessionContext({\n sessionId: typedSession.id,\n currentOrganizationId: storedOrganizationId,\n currentProjectId: storedProjectId,\n lastActiveOrganizationId: userData?.lastActiveOrganizationId,\n lastActiveProjectId: userData?.lastActiveProjectId,\n });\n\n typedSession.activeOrganizationId = organizationId ?? undefined;\n typedSession.activeProjectId = projectId ?? undefined;\n\n const [organizationData, projectData] = await Promise.all([\n organizationId ? getOrganizationById(organizationId) : null,\n projectId ? getProjectById(projectId) : null,\n ]);\n\n const userAPI: UserAPI | null = userData\n ? mapUserToAPI(userData)\n : null;\n let organizationAPI: OrganizationAPI | null = organizationData\n ? mapOrganizationToAPI(organizationData)\n : null;\n let projectAPI: ProjectAPI | null = projectData\n ? mapProjectToAPI(projectData)\n : null;\n\n // Resolve the active environment; null resolvedEnvironmentId = production\n const {\n environmentAPI: resolvedEnvironmentAPI,\n resolvedEnvironmentId,\n } = await resolveSessionEnvironment({\n projectData,\n sessionId: typedSession.id,\n sessionEnvironmentId: storedEnvironmentId,\n });\n let environmentAPI = resolvedEnvironmentAPI;\n\n if (resolvedEnvironmentId !== storedEnvironmentId) {\n typedSession.activeEnvironmentId = resolvedEnvironmentId as any;\n }\n\n // Clear stale session references whose documents no longer exist\n const zombieCleanup = await clearZombieSessionContext({\n sessionId: typedSession.id,\n userId: userData?.id ?? null,\n storedOrganizationId: organizationId,\n organizationExists: Boolean(organizationData),\n storedProjectId: projectId,\n projectExists: Boolean(projectData),\n });\n\n if (zombieCleanup) {\n if (zombieCleanup.organizationCleared) {\n typedSession.activeOrganizationId = undefined;\n organizationAPI = null;\n }\n if (zombieCleanup.projectCleared) {\n typedSession.activeProjectId = undefined;\n typedSession.activeEnvironmentId = undefined;\n projectAPI = null;\n environmentAPI = null;\n }\n }\n\n // Resolve granular access constraints for this user in this project\n const memberAccessEntry =\n projectData?.memberAccess?.find(\n (access) => String(access.userId) === String(userData?.id)\n ) ?? null;\n\n const allowedEnvironmentIds =\n memberAccessEntry?.allowedEnvironmentIds != null\n ? (\n memberAccessEntry.allowedEnvironmentIds as ({\n toString(): string;\n } | null)[]\n ).map((id) => (id === null ? null : String(id)))\n : null;\n const allowedLocales = memberAccessEntry?.allowedLocales ?? null;\n\n return mapSessionToAPI(\n formatSession({\n session: typedSession,\n user: userAPI!,\n organization: organizationAPI,\n project: projectAPI,\n environment: environmentAPI,\n authType: 'session',\n allowedEnvironmentIds,\n allowedLocales,\n })\n );\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 rpID: process.env.DOMAIN,\n rpName: 'Intlayer',\n }),\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 organizationProvisioning: {},\n }),\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.APP_URL}/auth/password/reset?token=${token}`,\n });\n },\n resetPasswordTokenExpiresIn: 3600,\n },\n\n emailVerification: {\n autoSignInAfterVerification: true,\n sendOnSignIn: true,\n sendVerificationEmail: async ({ user, url }) => {\n logger.info('sending verification email', { email: user.email });\n // Override callbackURL so the link redirects to the app after verification,\n // not to the backend root which just shows the raw API response.\n const verificationUrl = new URL(url);\n verificationUrl.searchParams.set(\n 'callbackURL',\n process.env.APP_URL ?? '/'\n );\n await sendEmail({\n type: 'validate',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n validationLink: verificationUrl.toString(),\n });\n },\n },\n\n trustedOrigins: [\n process.env.WEBSITE_URL,\n process.env.APP_URL,\n process.env.SHOWCASE_URL,\n ].filter(Boolean) as string[],\n\n accountLinking: {\n enabled: true, // allow linking in general\n trustedProviders: [\n 'google',\n 'github',\n 'linkedin',\n 'gitlab',\n 'atlassian',\n 'microsoft',\n 'email-password',\n 'magic-link',\n 'passkey',\n ],\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 atlassian: {\n clientId: process.env.ATLASSIAN_CLIENT_ID as string,\n clientSecret: process.env.ATLASSIAN_CLIENT_SECRET as string,\n },\n gitlab: {\n clientId: process.env.GITLAB_CLIENT_ID as string,\n clientSecret: process.env.GITLAB_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 microsoft: {\n clientId: process.env.MICROSOFT_CLIENT_ID as string,\n clientSecret: process.env.MICROSOFT_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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"}
|
|
1
|
+
{"version":3,"file":"getAuth.mjs","names":[],"sources":["../../../../src/utils/auth/getAuth.ts"],"sourcesContent":["import { passkey } from '@better-auth/passkey';\nimport { sso } from '@better-auth/sso';\nimport { sendVerificationUpdate } from '@controllers/user.controller';\nimport { logger } from '@logger';\nimport { sendEmail } from '@services/email.service';\nimport { resolveSessionEnvironment } from '@services/environment.service';\nimport { getOrganizationById } from '@services/organization.service';\nimport { getProjectById } from '@services/project.service';\nimport {\n clearZombieSessionContext,\n restoreSessionContext,\n} from '@services/session.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 } 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 type { MongoClient } from 'mongodb';\nimport { Types } from 'mongoose';\nimport type { Organization, OrganizationAPI } from '@/types/organization.types';\nimport type { Project, ProjectAPI } from '@/types/project.types';\nimport type {\n Session,\n SessionContext,\n SessionDataApi,\n} from '@/types/session.types';\nimport type { UserAPI } from '@/types/user.types';\n\nexport type Auth = ReturnType<typeof betterAuth>;\n\n// Check if we are in production based on the domain or NODE_ENV\nconst isProd = process.env.DOMAIN !== 'localhost';\n\nlet _authSingleton: Auth | null = null;\n\nexport const initializeAuth = (dbClient: MongoClient): Auth => {\n _authSingleton = getAuth(dbClient);\n return _authSingleton;\n};\n\nexport const getAuthSingleton = (): Auth => {\n if (!_authSingleton) {\n throw new Error('Auth not initialized. Call initializeAuth first.');\n }\n return _authSingleton;\n};\n\nexport const formatSession = (session: SessionContext): 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: Session = {\n session: session.session as Session['session'],\n user: session.user as Session['user'],\n organization: (session.organization as Organization | null) ?? null,\n project: (session.project as Project | null) ?? null,\n environment: session.environment ?? null,\n authType: 'session',\n permissions,\n roles,\n allowedEnvironmentIds: session.allowedEnvironmentIds ?? null,\n allowedLocales: session.allowedLocales ?? null,\n ...(session.session?.id && {\n id: new Types.ObjectId(session.session.id),\n }),\n };\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 baseURL: process.env.BACKEND_URL,\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.APP_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 (path.includes('/verify-email')) {\n // Fetch fresh user from DB so emailVerified is definitely up-to-date\n // (the hook context user may be a stale snapshot from before the DB write).\n const freshUser = await getUserById(user.id);\n\n if (freshUser) {\n sendVerificationUpdate(freshUser);\n }\n\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.APP_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 crossSubDomainCookies: {\n enabled: isProd,\n domain: isProd ? process.env.DOMAIN : undefined,\n additionalCookies: ['session_token'],\n },\n cookiePrefix: 'intlayer',\n cookies: {\n session_token: {\n name: 'session_token',\n attributes: {\n httpOnly: true,\n secure: isProd,\n sameSite: 'lax',\n },\n },\n },\n },\n\n secret: process.env.BETTER_AUTH_SECRET as string,\n session: {\n modelName: 'sessions',\n id: 'id',\n\n // Session lives for 30 days; each access made more than 1 day after the\n // last refresh slides the expiry forward, so an active user effectively\n // stays signed in indefinitely.\n expiresIn: 60 * 60 * 24 * 30,\n updateAge: 60 * 60 * 24,\n\n // Cache the session in a signed cookie for 5 minutes to avoid hitting\n // Mongo on every request while still picking up updateAge refreshes.\n cookieCache: {\n enabled: false,\n maxAge: 5 * 60,\n },\n\n additionalFields: {\n activeOrganizationId: { type: 'string', nullable: true, input: false },\n activeProjectId: { type: 'string', nullable: true, input: false },\n activeEnvironmentId: { 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 const normalizeId = (rawId: unknown): string | null => {\n if (typeof rawId === 'string') return rawId;\n if (\n rawId &&\n typeof rawId === 'object' &&\n 'buffer' in rawId &&\n (rawId as any).buffer instanceof Uint8Array\n ) {\n return Buffer.from((rawId as any).buffer).toString('hex');\n }\n return null;\n };\n\n const storedOrganizationId = typedSession.activeOrganizationId\n ? normalizeId(typedSession.activeOrganizationId)\n : null;\n const storedProjectId = typedSession.activeProjectId\n ? normalizeId(typedSession.activeProjectId)\n : null;\n // null = production (default env); ObjectId string = non-default env\n const storedEnvironmentId = typedSession.activeEnvironmentId\n ? normalizeId(typedSession.activeEnvironmentId)\n : null;\n\n const userData = typedSession.userId\n ? await getUserById(typedSession.userId)\n : null;\n\n // Restore org/project context from user document when the session lacks it\n const { organizationId, projectId } = await restoreSessionContext({\n sessionId: typedSession.id,\n currentOrganizationId: storedOrganizationId,\n currentProjectId: storedProjectId,\n lastActiveOrganizationId: userData?.lastActiveOrganizationId,\n lastActiveProjectId: userData?.lastActiveProjectId,\n });\n\n typedSession.activeOrganizationId = organizationId ?? undefined;\n typedSession.activeProjectId = projectId ?? undefined;\n\n const [organizationData, projectData] = await Promise.all([\n organizationId ? getOrganizationById(organizationId) : null,\n projectId ? getProjectById(projectId) : null,\n ]);\n\n const userAPI: UserAPI | null = userData\n ? mapUserToAPI(userData)\n : null;\n let organizationAPI: OrganizationAPI | null = organizationData\n ? mapOrganizationToAPI(organizationData)\n : null;\n let projectAPI: ProjectAPI | null = projectData\n ? mapProjectToAPI(projectData)\n : null;\n\n // Resolve the active environment; null resolvedEnvironmentId = production\n const {\n environmentAPI: resolvedEnvironmentAPI,\n resolvedEnvironmentId,\n } = await resolveSessionEnvironment({\n projectData,\n sessionId: typedSession.id,\n sessionEnvironmentId: storedEnvironmentId,\n });\n let environmentAPI = resolvedEnvironmentAPI;\n\n if (resolvedEnvironmentId !== storedEnvironmentId) {\n typedSession.activeEnvironmentId = resolvedEnvironmentId as any;\n }\n\n // Clear stale session references whose documents no longer exist\n const zombieCleanup = await clearZombieSessionContext({\n sessionId: typedSession.id,\n userId: userData?.id ?? null,\n storedOrganizationId: organizationId,\n organizationExists: Boolean(organizationData),\n storedProjectId: projectId,\n projectExists: Boolean(projectData),\n });\n\n if (zombieCleanup) {\n if (zombieCleanup.organizationCleared) {\n typedSession.activeOrganizationId = undefined;\n organizationAPI = null;\n }\n if (zombieCleanup.projectCleared) {\n typedSession.activeProjectId = undefined;\n typedSession.activeEnvironmentId = undefined;\n projectAPI = null;\n environmentAPI = null;\n }\n }\n\n // Resolve granular access constraints for this user in this project\n const memberAccessEntry =\n projectData?.memberAccess?.find(\n (access) => String(access.userId) === String(userData?.id)\n ) ?? null;\n\n const allowedEnvironmentIds =\n memberAccessEntry?.allowedEnvironmentIds != null\n ? (\n memberAccessEntry.allowedEnvironmentIds as ({\n toString(): string;\n } | null)[]\n ).map((id) => (id === null ? null : String(id)))\n : null;\n const allowedLocales = memberAccessEntry?.allowedLocales ?? null;\n\n return mapSessionToAPI(\n formatSession({\n session: typedSession,\n user: userAPI!,\n organization: organizationAPI,\n project: projectAPI,\n environment: environmentAPI,\n authType: 'session',\n allowedEnvironmentIds,\n allowedLocales,\n })\n );\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 rpID: process.env.DOMAIN,\n rpName: 'Intlayer',\n }),\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 organizationProvisioning: {},\n }),\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.APP_URL}/auth/password/reset?token=${token}`,\n });\n },\n resetPasswordTokenExpiresIn: 3600,\n },\n\n emailVerification: {\n autoSignInAfterVerification: true,\n sendOnSignIn: true,\n sendVerificationEmail: async ({ user, url }) => {\n logger.info('sending verification email', { email: user.email });\n // Override callbackURL so the link redirects to the app after verification,\n // not to the backend root which just shows the raw API response.\n const verificationUrl = new URL(url);\n verificationUrl.searchParams.set(\n 'callbackURL',\n process.env.APP_URL ?? '/'\n );\n await sendEmail({\n type: 'validate',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n validationLink: verificationUrl.toString(),\n });\n },\n },\n\n trustedOrigins: [\n process.env.WEBSITE_URL,\n process.env.APP_URL,\n process.env.SHOWCASE_URL,\n ].filter(Boolean) as string[],\n\n accountLinking: {\n enabled: true, // allow linking in general\n trustedProviders: [\n 'google',\n 'github',\n 'linkedin',\n 'gitlab',\n 'atlassian',\n 'microsoft',\n 'email-password',\n 'magic-link',\n 'passkey',\n ],\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 atlassian: {\n clientId: process.env.ATLASSIAN_CLIENT_ID as string,\n clientSecret: process.env.ATLASSIAN_CLIENT_SECRET as string,\n },\n gitlab: {\n clientId: process.env.GITLAB_CLIENT_ID as string,\n clientSecret: process.env.GITLAB_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 microsoft: {\n clientId: process.env.MICROSOFT_CLIENT_ID as string,\n clientSecret: process.env.MICROSOFT_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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"}
|
package/dist/esm/utils/cors.mjs
CHANGED
|
@@ -2,16 +2,6 @@ import { logger } from "../logger/index.mjs";
|
|
|
2
2
|
|
|
3
3
|
//#region src/utils/cors.ts
|
|
4
4
|
/**
|
|
5
|
-
* Origins that are allowed to send/receive session cookies.
|
|
6
|
-
* All other origins (e.g. intlayer-editor embedded in a third-party site)
|
|
7
|
-
* must authenticate via Authorization: Bearer <token> instead.
|
|
8
|
-
*/
|
|
9
|
-
const credentialWhitelist = () => [
|
|
10
|
-
process.env.WEBSITE_URL,
|
|
11
|
-
process.env.APP_URL,
|
|
12
|
-
process.env.SHOWCASE_URL
|
|
13
|
-
].filter(Boolean);
|
|
14
|
-
/**
|
|
15
5
|
* CORS configuration with a per-request delegator.
|
|
16
6
|
*
|
|
17
7
|
* Using the `delegator` property (not a bare function) avoids Fastify's
|
|
@@ -23,8 +13,7 @@ const credentialWhitelist = () => [
|
|
|
23
13
|
*/
|
|
24
14
|
const corsOptions = { delegator: (req, cb) => {
|
|
25
15
|
const origin = req.headers.origin;
|
|
26
|
-
const
|
|
27
|
-
const isWhitelisted = Boolean(origin && whitelist.includes(origin));
|
|
16
|
+
const isWhitelisted = Boolean(origin && /^https?:\/\/(?:.*\.)?intlayer\.(?:org|cn)$/.test(origin));
|
|
28
17
|
if (origin && !isWhitelisted) logger.info("non-whitelisted origin, allowing without credentials", origin);
|
|
29
18
|
cb(null, {
|
|
30
19
|
origin: true,
|
|
@@ -50,5 +39,5 @@ const corsOptions = { delegator: (req, cb) => {
|
|
|
50
39
|
} };
|
|
51
40
|
|
|
52
41
|
//#endregion
|
|
53
|
-
export { corsOptions
|
|
42
|
+
export { corsOptions };
|
|
54
43
|
//# sourceMappingURL=cors.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cors.mjs","names":[],"sources":["../../../src/utils/cors.ts"],"sourcesContent":["import type { FastifyCorsOptions } from '@fastify/cors';\nimport { logger } from '@logger';\nimport type { FastifyRequest } from 'fastify';\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"cors.mjs","names":[],"sources":["../../../src/utils/cors.ts"],"sourcesContent":["import type { FastifyCorsOptions } from '@fastify/cors';\nimport { logger } from '@logger';\nimport type { FastifyRequest } from 'fastify';\n\n/**\n * CORS configuration with a per-request delegator.\n *\n * Using the `delegator` property (not a bare function) avoids Fastify's\n * avvio plugin loader calling our function as a factory at startup with the\n * Fastify instance instead of a request object.\n *\n * Whitelisted first-party origins → credentials: true (cookie auth works).\n * All other origins → credentials: false (Bearer token required).\n */\nexport const corsOptions: FastifyCorsOptions = {\n delegator: (\n req: FastifyRequest,\n cb: (err: Error | null, options: FastifyCorsOptions) => void\n ): void => {\n const origin = req.headers.origin as string | undefined;\n const isWhitelisted = Boolean(\n origin && /^https?:\\/\\/(?:.*\\.)?intlayer\\.(?:org|cn)$/.test(origin)\n );\n\n if (origin && !isWhitelisted) {\n logger.info(\n 'non-whitelisted origin, allowing without credentials',\n origin\n );\n }\n\n cb(null, {\n // Reflect the origin so third-party embeds (intlayer-editor) work.\n // For originless requests (curl, server-to-server) true means allow.\n origin: true,\n credentials: isWhitelisted,\n allowedHeaders: [\n 'authorization',\n 'Content-Type',\n 'cache-control',\n 'private-state-token-redemption',\n 'private-state-token-issuance',\n 'browsing-topics',\n ],\n exposedHeaders: [],\n methods: ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'],\n });\n },\n};\n"],"mappings":";;;;;;;;;;;;;AAcA,MAAa,cAAkC,EAC7C,YACE,KACA,OACS;CACT,MAAM,SAAS,IAAI,QAAQ;CAC3B,MAAM,gBAAgB,QACpB,UAAU,6CAA6C,KAAK,OAAO,CACpE;AAED,KAAI,UAAU,CAAC,cACb,QAAO,KACL,wDACA,OACD;AAGH,IAAG,MAAM;EAGP,QAAQ;EACR,aAAa;EACb,gBAAgB;GACd;GACA;GACA;GACA;GACA;GACA;GACD;EACD,gBAAgB,EAAE;EAClB,SAAS;GAAC;GAAO;GAAQ;GAAO;GAAS;GAAQ;GAAS;EAC3D,CAAC;GAEL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demoDictionaries.mjs","names":[],"sources":["../../../src/utils/demoDictionaries.ts"],"sourcesContent":["import { gender, html, insert, md, t } from 'intlayer';\nimport type { DictionaryData } from '@/types/dictionary.types';\n\nexport const getDemoDictionaries = (\n projectIds: string[],\n creatorId: any\n): DictionaryData[] => [\n {\n key: 'demo-page',\n title: 'Demo Page',\n projectIds,\n creatorId,\n content: new Map([\n [\n 'v1',\n {\n content: {\n // 1. Simple Translation\n pageTitle: t({\n en: 'Welcome to your new project',\n fr: 'Bienvenue dans votre nouveau projet',\n es: 'Bienvenido a tu nuevo proyecto',\n }),\n\n // 2. Markdown Content (Great for blog posts, articles, or rich text blocks)\n introSection: md(\n t({\n en: '## Getting Started \\n This is a **randomly generated** dictionary to demonstrate the capabilities of Intlayer.',\n fr: \"## Commencer \\n Ceci est un dictionnaire **généré aléatoirement** pour démontrer les capacités d'Intlayer.\",\n es: \"## Empezando \\n Este es un diccionario **generado aléatoirement** pour démontrer les capacités d'Intlayer.\",\n })\n ),\n\n // 3. Variable Insertion (Interpolation)\n welcomeMessage: insert(\n t({\n en: 'Hello, {{ userName }}! You have {{ notificationCount }} new messages.',\n fr: 'Bonjour, {{ userName }} ! Vous avez {{ notificationCount }} nouveaux messages.',\n es: '¡Hola, {{ userName }}! Tienes {{ notificationCount }} nuevos messages.',\n })\n ),\n\n // 4. Gender Logic (Context-aware translation)\n userActivity: gender({\n male: t({\n en: 'He updated his profile.',\n fr: 'Il a mis à jour son profil.',\n es: 'Él actualizó su perfil.',\n }),\n female: t({\n en: 'She updated her profile.',\n fr: 'Elle a mis à jour son profil.',\n es: 'Ella actualizó su perfil.',\n }),\n fallback: t({\n en: 'They updated their profile.',\n fr: 'Ils ont mis à jour leur profil.',\n es: 'Ellos actualizaron su profil.',\n }),\n }),\n\n // 5. HTML Injection (For legacy content or specific component embedding)\n ctaButton: html(\n t({\n en: '<button class=\"primary-btn\">Start <strong>Now</strong></button><IconArrowRight />',\n fr: '<button class=\"primary-btn\">Commencer <strong>Maintenant</strong></button><IconArrowRight />',\n es: '<button class=\"primary-btn\">Empezar <strong>Ahora</strong></button><IconArrowRight />',\n })\n ),\n\n // 6. Nested Objects (For grouping related labels)\n nav: {\n home: t({ en: 'Home', fr: 'Accueil', es: 'Inicio' }),\n about: t({ en: 'About', fr: 'À propos', es: 'Acerca de' }),\n contact: t({ en: 'Contact', fr: 'Contact', es: 'Contacto' }),\n },\n } as any,\n },\n ],\n ]),\n },\n {\n key: 'demo-common',\n title: 'Demo Common Labels',\n projectIds,\n creatorId,\n content: new Map([\n [\n 'v1',\n {\n content: {\n save: t({ en: 'Save', fr: 'Enregistrer', es: 'Guardar' }),\n cancel: t({ en: 'Cancel', fr: 'Annuler', es: 'Cancelar' }),\n delete: t({ en: 'Delete', fr: 'Supprimer', es: 'Eliminar' }),\n edit: t({ en: 'Edit', fr: 'Modifier', es: 'Editar' }),\n } as any,\n },\n ],\n ]),\n },\n];\n"],"mappings":";;;AAGA,MAAa,uBACX,YACA,cACqB,CACrB;CACE,KAAK;CACL,OAAO;CACP;CACA;CACA,SAAS,IAAI,IAAI,CACf,CACE,MACA,EACE,SAAS;EAEP,WAAW,EAAE;GACX,IAAI;GACJ,IAAI;GACJ,IAAI;
|
|
1
|
+
{"version":3,"file":"demoDictionaries.mjs","names":[],"sources":["../../../src/utils/demoDictionaries.ts"],"sourcesContent":["import { gender, html, insert, md, t } from 'intlayer';\nimport type { DictionaryData } from '@/types/dictionary.types';\n\nexport const getDemoDictionaries = (\n projectIds: string[],\n creatorId: any\n): DictionaryData[] => [\n {\n key: 'demo-page',\n title: 'Demo Page',\n projectIds,\n creatorId,\n content: new Map([\n [\n 'v1',\n {\n content: {\n // 1. Simple Translation\n pageTitle: t({\n en: 'Welcome to your new project',\n fr: 'Bienvenue dans votre nouveau projet',\n es: 'Bienvenido a tu nuevo proyecto',\n }),\n\n // 2. Markdown Content (Great for blog posts, articles, or rich text blocks)\n introSection: md(\n t({\n en: '## Getting Started \\n This is a **randomly generated** dictionary to demonstrate the capabilities of Intlayer.',\n fr: \"## Commencer \\n Ceci est un dictionnaire **généré aléatoirement** pour démontrer les capacités d'Intlayer.\",\n es: \"## Empezando \\n Este es un diccionario **generado aléatoirement** pour démontrer les capacités d'Intlayer.\",\n })\n ),\n\n // 3. Variable Insertion (Interpolation)\n welcomeMessage: insert(\n t({\n en: 'Hello, {{ userName }}! You have {{ notificationCount }} new messages.',\n fr: 'Bonjour, {{ userName }} ! Vous avez {{ notificationCount }} nouveaux messages.',\n es: '¡Hola, {{ userName }}! Tienes {{ notificationCount }} nuevos messages.',\n })\n ),\n\n // 4. Gender Logic (Context-aware translation)\n userActivity: gender({\n male: t({\n en: 'He updated his profile.',\n fr: 'Il a mis à jour son profil.',\n es: 'Él actualizó su perfil.',\n }),\n female: t({\n en: 'She updated her profile.',\n fr: 'Elle a mis à jour son profil.',\n es: 'Ella actualizó su perfil.',\n }),\n fallback: t({\n en: 'They updated their profile.',\n fr: 'Ils ont mis à jour leur profil.',\n es: 'Ellos actualizaron su profil.',\n }),\n }),\n\n // 5. HTML Injection (For legacy content or specific component embedding)\n ctaButton: html(\n t({\n en: '<button class=\"primary-btn\">Start <strong>Now</strong></button><IconArrowRight />',\n fr: '<button class=\"primary-btn\">Commencer <strong>Maintenant</strong></button><IconArrowRight />',\n es: '<button class=\"primary-btn\">Empezar <strong>Ahora</strong></button><IconArrowRight />',\n })\n ),\n\n // 6. Nested Objects (For grouping related labels)\n nav: {\n home: t({ en: 'Home', fr: 'Accueil', es: 'Inicio' }),\n about: t({ en: 'About', fr: 'À propos', es: 'Acerca de' }),\n contact: t({ en: 'Contact', fr: 'Contact', es: 'Contacto' }),\n },\n } as any,\n },\n ],\n ]),\n },\n {\n key: 'demo-common',\n title: 'Demo Common Labels',\n projectIds,\n creatorId,\n content: new Map([\n [\n 'v1',\n {\n content: {\n save: t({ en: 'Save', fr: 'Enregistrer', es: 'Guardar' }),\n cancel: t({ en: 'Cancel', fr: 'Annuler', es: 'Cancelar' }),\n delete: t({ en: 'Delete', fr: 'Supprimer', es: 'Eliminar' }),\n edit: t({ en: 'Edit', fr: 'Modifier', es: 'Editar' }),\n } as any,\n },\n ],\n ]),\n },\n];\n"],"mappings":";;;AAGA,MAAa,uBACX,YACA,cACqB,CACrB;CACE,KAAK;CACL,OAAO;CACP;CACA;CACA,SAAS,IAAI,IAAI,CACf,CACE,MACA,EACE,SAAS;EAEP,WAAW,EAAE;GACX,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC;EAGF,cAAc,GACZ,EAAE;GACA,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC,CACH;EAGD,gBAAgB,OACd,EAAE;GACA,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC,CACH;EAGD,cAAc,OAAO;GACnB,MAAM,EAAE;IACN,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,QAAQ,EAAE;IACR,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACF,UAAU,EAAE;IACV,IAAI;IACJ,IAAI;IACJ,IAAI;IACL,CAAC;GACH,CAAC;EAGF,WAAW,KACT,EAAE;GACA,IAAI;GACJ,IAAI;GACJ,IAAI;GACL,CAAC,CACH;EAGD,KAAK;GACH,MAAM,EAAE;IAAE,IAAI;IAAQ,IAAI;IAAW,IAAI;IAAU,CAAC;GACpD,OAAO,EAAE;IAAE,IAAI;IAAS,IAAI;IAAY,IAAI;IAAa,CAAC;GAC1D,SAAS,EAAE;IAAE,IAAI;IAAW,IAAI;IAAW,IAAI;IAAY,CAAC;GAC7D;EACF,EACF,CACF,CACF,CAAC;CACH,EACD;CACE,KAAK;CACL,OAAO;CACP;CACA;CACA,SAAS,IAAI,IAAI,CACf,CACE,MACA,EACE,SAAS;EACP,MAAM,EAAE;GAAE,IAAI;GAAQ,IAAI;GAAe,IAAI;GAAW,CAAC;EACzD,QAAQ,EAAE;GAAE,IAAI;GAAU,IAAI;GAAW,IAAI;GAAY,CAAC;EAC1D,QAAQ,EAAE;GAAE,IAAI;GAAU,IAAI;GAAa,IAAI;GAAY,CAAC;EAC5D,MAAM,EAAE;GAAE,IAAI;GAAQ,IAAI;GAAY,IAAI;GAAU,CAAC;EACtD,EACF,CACF,CACF,CAAC;CACH,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensureArrayQueryFilter.mjs","names":[],"sources":["../../../src/utils/ensureArrayQueryFilter.ts"],"sourcesContent":["export const ensureArrayQueryFilter = (\n filter: string | string[] | undefined\n): string[] | undefined => {\n let idsArray: string[];\n\n if (typeof filter === 'string') {\n idsArray = filter.split(',');\n } else if (Array.isArray(filter)) {\n idsArray = filter;\n } else {\n idsArray = [];\n }\n\n return idsArray;\n};\n"],"mappings":";AAAA,MAAa,0BACX,WACyB;CACzB,IAAI;
|
|
1
|
+
{"version":3,"file":"ensureArrayQueryFilter.mjs","names":[],"sources":["../../../src/utils/ensureArrayQueryFilter.ts"],"sourcesContent":["export const ensureArrayQueryFilter = (\n filter: string | string[] | undefined\n): string[] | undefined => {\n let idsArray: string[];\n\n if (typeof filter === 'string') {\n idsArray = filter.split(',');\n } else if (Array.isArray(filter)) {\n idsArray = filter;\n } else {\n idsArray = [];\n }\n\n return idsArray;\n};\n"],"mappings":";AAAA,MAAa,0BACX,WACyB;CACzB,IAAI;AAEJ,KAAI,OAAO,WAAW,SACpB,YAAW,OAAO,MAAM,IAAI;UACnB,MAAM,QAAQ,OAAO,CAC9B,YAAW;KAEX,YAAW,EAAE;AAGf,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensureMongoDocumentToObject.mjs","names":[],"sources":["../../../src/utils/ensureMongoDocumentToObject.ts"],"sourcesContent":["import type { Document, ObjectIdToString } from 'mongoose';\n\n/**\n * If the dictionary is a mongoose document, convert it to an object\n * @param potentialDocument - The potential document to convert.\n * @returns The potential document converted to an object.\n */\nexport const ensureMongoDocumentToObject = <T extends object | Document>(\n potentialDocument: T\n): ObjectIdToString<T> => {\n let potentialObject: T = potentialDocument as T;\n\n // If the user is a mongoose document, convert it to an object\n if (typeof (potentialDocument as Document).toObject === 'function') {\n potentialObject = (potentialDocument as Document).toObject();\n }\n\n return potentialObject as ObjectIdToString<T>;\n};\n"],"mappings":";;;;;;AAOA,MAAa,+BACX,sBACwB;CACxB,IAAI,kBAAqB;
|
|
1
|
+
{"version":3,"file":"ensureMongoDocumentToObject.mjs","names":[],"sources":["../../../src/utils/ensureMongoDocumentToObject.ts"],"sourcesContent":["import type { Document, ObjectIdToString } from 'mongoose';\n\n/**\n * If the dictionary is a mongoose document, convert it to an object\n * @param potentialDocument - The potential document to convert.\n * @returns The potential document converted to an object.\n */\nexport const ensureMongoDocumentToObject = <T extends object | Document>(\n potentialDocument: T\n): ObjectIdToString<T> => {\n let potentialObject: T = potentialDocument as T;\n\n // If the user is a mongoose document, convert it to an object\n if (typeof (potentialDocument as Document).toObject === 'function') {\n potentialObject = (potentialDocument as Document).toObject();\n }\n\n return potentialObject as ObjectIdToString<T>;\n};\n"],"mappings":";;;;;;AAOA,MAAa,+BACX,sBACwB;CACxB,IAAI,kBAAqB;AAGzB,KAAI,OAAQ,kBAA+B,aAAa,WACtD,mBAAmB,kBAA+B,UAAU;AAG9D,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorHandler.mjs","names":[],"sources":["../../../../src/utils/errors/ErrorHandler.ts"],"sourcesContent":["// Import required modules and types from their respective locations.\n\nimport * as Locales from '@intlayer/types/locales';\nimport type { StrictModeLocaleMap } from '@intlayer/types/module_augmentation';\nimport { logger } from '@logger';\nimport { formatResponse } from '@utils/responseData';\nimport type { FastifyReply } from 'fastify';\nimport { t } from 'fastify-intlayer';\nimport type { UserAPI } from '@/types/user.types';\nimport { HttpStatusCodes } from '@/utils/httpStatusCodes';\nimport type { AppError } from './ErrorsClass';\nimport { type ErrorCodes, errorData } from './errorCodes';\n\n/**\n * Handles generic error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param errorKey - A key representing the specific error.\n * @param statusCode - (Optional) A specific HTTP status code to use for the response.\n * @param isPaginatedResponse - Flag to determine if the response should be paginated.\n */\nexport const handleGenericErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode; // Use the provided status code or default to the one in errorData.\n\n // Delegate to a more customizable error response handler.\n handleCustomErrorResponse(\n reply,\n errorKey,\n error.title,\n error.message,\n errorDetails,\n status\n );\n};\n\n/**\n * Handles application-specific error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param error - The error object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param isPaginatedResponse - (Optional) Flag to determine if the response should be paginated.\n */\nexport const handleAppErrorResponse = (\n reply: FastifyReply,\n error: AppError,\n messageDetails?: object\n) => {\n if (!error.isAppError) {\n const err = error as any;\n const errorKey =\n err.errorKey ?? err.error ?? err.code ?? err.name ?? 'UNKNOWN_ERROR';\n\n const statusCode =\n err.httpStatusCode ??\n err.statusCode ??\n err.status ??\n HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n const logDetails: Record<string, unknown> = {};\n if (err.url) logDetails.url = err.url;\n if (err.responseBody) logDetails.responseBody = err.responseBody;\n if (err.stack) logDetails.stack = err.stack;\n\n handleCustomErrorResponse(\n reply,\n String(errorKey),\n 'Error',\n err.message ?? JSON.stringify(err),\n undefined,\n statusCode,\n Object.keys(logDetails).length ? logDetails : undefined\n );\n return;\n }\n\n const isMultilingual = error.isMultilingual ?? false;\n handleCustomErrorResponse(\n reply,\n error.errorKey,\n isMultilingual ? error.multilingualTitle : error.title,\n isMultilingual ? error.multilingualMessage : error.message,\n error.messageDetails ?? messageDetails,\n error.httpStatusCode\n );\n};\n\n/**\n * Handles more customizable error responses with detailed error messages and codes.\n * @param res - The response object.\n * @param errorKey - Error code key used to fetch the corresponding message and default status.\n * @param title - The localized error message object.\n * @param message - The localized error message object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param statusCode - (Optional) HTTP status code, defaults to 500 if not specified.\n * @param isPaginatedResponse - Determines if the error should be part of a paginated response.\n */\nexport const handleCustomErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes | string,\n title: StrictModeLocaleMap<string> | string,\n message: StrictModeLocaleMap<string> | string,\n messageDetails?: object,\n statusCode?: HttpStatusCodes,\n logDetails?: object\n) => {\n const errorTitle =\n typeof title === 'string'\n ? title\n : t(title as StrictModeLocaleMap<string>, Locales.ENGLISH);\n const errorMessage =\n typeof message === 'string'\n ? message\n : t(message as StrictModeLocaleMap<string>, Locales.ENGLISH);\n const status = statusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n const req = reply.request;\n const session = req?.session;\n const requestContext = {\n method: req?.method,\n url: req?.url,\n params: req?.params,\n query: req?.query,\n body: req?.body,\n session: session\n ? {\n userId: String(session.user?.id ?? ''),\n userEmail: session.user?.email,\n organizationId: String(session.organization?.id ?? ''),\n organizationName: session.organization?.name,\n projectId: String(session.project?.id ?? ''),\n projectName: session.project?.name,\n }\n : undefined,\n };\n\n logger.error(errorKey, {\n message: errorMessage,\n status,\n request: requestContext,\n ...messageDetails,\n ...logDetails,\n });\n\n // Format the response as a standard non-paginated error response.\n const responseData = formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...messageDetails,\n },\n status,\n });\n\n return reply.code(status).send(responseData);\n};\n\n/**\n * Formats a generic error response without sending it (useful for Fastify plugins).\n * @param errorKey - A key representing the specific error.\n * @param errorDetails - Optional error details to include.\n * @param statusCode - Optional HTTP status code.\n * @returns Formatted error response object.\n */\nexport const formatGenericErrorResponse = (\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode;\n const errorTitle = t(error.title, Locales.ENGLISH);\n const errorMessage = t(error.message, Locales.ENGLISH);\n logger.error(errorKey, { message: errorMessage, status, ...errorDetails });\n\n return formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...errorDetails,\n },\n status,\n });\n};\n\n// Define an object to encapsulate error handling logic for backward compatibility.\nexport const ErrorHandler = {\n handleGenericErrorResponse,\n handleAppErrorResponse,\n handleCustomErrorResponse,\n formatGenericErrorResponse,\n};\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,MAAa,8BACX,OACA,UACA,cACA,eACG;CACH,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,cAAc,MAAM;
|
|
1
|
+
{"version":3,"file":"ErrorHandler.mjs","names":[],"sources":["../../../../src/utils/errors/ErrorHandler.ts"],"sourcesContent":["// Import required modules and types from their respective locations.\n\nimport * as Locales from '@intlayer/types/locales';\nimport type { StrictModeLocaleMap } from '@intlayer/types/module_augmentation';\nimport { logger } from '@logger';\nimport { formatResponse } from '@utils/responseData';\nimport type { FastifyReply } from 'fastify';\nimport { t } from 'fastify-intlayer';\nimport type { UserAPI } from '@/types/user.types';\nimport { HttpStatusCodes } from '@/utils/httpStatusCodes';\nimport type { AppError } from './ErrorsClass';\nimport { type ErrorCodes, errorData } from './errorCodes';\n\n/**\n * Handles generic error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param errorKey - A key representing the specific error.\n * @param statusCode - (Optional) A specific HTTP status code to use for the response.\n * @param isPaginatedResponse - Flag to determine if the response should be paginated.\n */\nexport const handleGenericErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode; // Use the provided status code or default to the one in errorData.\n\n // Delegate to a more customizable error response handler.\n handleCustomErrorResponse(\n reply,\n errorKey,\n error.title,\n error.message,\n errorDetails,\n status\n );\n};\n\n/**\n * Handles application-specific error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param error - The error object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param isPaginatedResponse - (Optional) Flag to determine if the response should be paginated.\n */\nexport const handleAppErrorResponse = (\n reply: FastifyReply,\n error: AppError,\n messageDetails?: object\n) => {\n if (!error.isAppError) {\n const err = error as any;\n const errorKey =\n err.errorKey ?? err.error ?? err.code ?? err.name ?? 'UNKNOWN_ERROR';\n\n const statusCode =\n err.httpStatusCode ??\n err.statusCode ??\n err.status ??\n HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n const logDetails: Record<string, unknown> = {};\n if (err.url) logDetails.url = err.url;\n if (err.responseBody) logDetails.responseBody = err.responseBody;\n if (err.stack) logDetails.stack = err.stack;\n\n handleCustomErrorResponse(\n reply,\n String(errorKey),\n 'Error',\n err.message ?? JSON.stringify(err),\n undefined,\n statusCode,\n Object.keys(logDetails).length ? logDetails : undefined\n );\n return;\n }\n\n const isMultilingual = error.isMultilingual ?? false;\n handleCustomErrorResponse(\n reply,\n error.errorKey,\n isMultilingual ? error.multilingualTitle : error.title,\n isMultilingual ? error.multilingualMessage : error.message,\n error.messageDetails ?? messageDetails,\n error.httpStatusCode\n );\n};\n\n/**\n * Handles more customizable error responses with detailed error messages and codes.\n * @param res - The response object.\n * @param errorKey - Error code key used to fetch the corresponding message and default status.\n * @param title - The localized error message object.\n * @param message - The localized error message object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param statusCode - (Optional) HTTP status code, defaults to 500 if not specified.\n * @param isPaginatedResponse - Determines if the error should be part of a paginated response.\n */\nexport const handleCustomErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes | string,\n title: StrictModeLocaleMap<string> | string,\n message: StrictModeLocaleMap<string> | string,\n messageDetails?: object,\n statusCode?: HttpStatusCodes,\n logDetails?: object\n) => {\n const errorTitle =\n typeof title === 'string'\n ? title\n : t(title as StrictModeLocaleMap<string>, Locales.ENGLISH);\n const errorMessage =\n typeof message === 'string'\n ? message\n : t(message as StrictModeLocaleMap<string>, Locales.ENGLISH);\n const status = statusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n const req = reply.request;\n const session = req?.session;\n const requestContext = {\n method: req?.method,\n url: req?.url,\n params: req?.params,\n query: req?.query,\n body: req?.body,\n session: session\n ? {\n userId: String(session.user?.id ?? ''),\n userEmail: session.user?.email,\n organizationId: String(session.organization?.id ?? ''),\n organizationName: session.organization?.name,\n projectId: String(session.project?.id ?? ''),\n projectName: session.project?.name,\n }\n : undefined,\n };\n\n logger.error(errorKey, {\n message: errorMessage,\n status,\n request: requestContext,\n ...messageDetails,\n ...logDetails,\n });\n\n // Format the response as a standard non-paginated error response.\n const responseData = formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...messageDetails,\n },\n status,\n });\n\n return reply.code(status).send(responseData);\n};\n\n/**\n * Formats a generic error response without sending it (useful for Fastify plugins).\n * @param errorKey - A key representing the specific error.\n * @param errorDetails - Optional error details to include.\n * @param statusCode - Optional HTTP status code.\n * @returns Formatted error response object.\n */\nexport const formatGenericErrorResponse = (\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode;\n const errorTitle = t(error.title, Locales.ENGLISH);\n const errorMessage = t(error.message, Locales.ENGLISH);\n logger.error(errorKey, { message: errorMessage, status, ...errorDetails });\n\n return formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...errorDetails,\n },\n status,\n });\n};\n\n// Define an object to encapsulate error handling logic for backward compatibility.\nexport const ErrorHandler = {\n handleGenericErrorResponse,\n handleAppErrorResponse,\n handleCustomErrorResponse,\n formatGenericErrorResponse,\n};\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,MAAa,8BACX,OACA,UACA,cACA,eACG;CACH,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,cAAc,MAAM;AAGnC,2BACE,OACA,UACA,MAAM,OACN,MAAM,SACN,cACA,OACD;;;;;;;;;AAUH,MAAa,0BACX,OACA,OACA,mBACG;AACH,KAAI,CAAC,MAAM,YAAY;EACrB,MAAM,MAAM;EACZ,MAAM,WACJ,IAAI,YAAY,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ;EAEvD,MAAM,aACJ,IAAI,kBACJ,IAAI,cACJ,IAAI;EAGN,MAAM,aAAsC,EAAE;AAC9C,MAAI,IAAI,IAAK,YAAW,MAAM,IAAI;AAClC,MAAI,IAAI,aAAc,YAAW,eAAe,IAAI;AACpD,MAAI,IAAI,MAAO,YAAW,QAAQ,IAAI;AAEtC,4BACE,OACA,OAAO,SAAS,EAChB,SACA,IAAI,WAAW,KAAK,UAAU,IAAI,EAClC,QACA,YACA,OAAO,KAAK,WAAW,CAAC,SAAS,aAAa,OAC/C;AACD;;CAGF,MAAM,iBAAiB,MAAM,kBAAkB;AAC/C,2BACE,OACA,MAAM,UACN,iBAAiB,MAAM,oBAAoB,MAAM,OACjD,iBAAiB,MAAM,sBAAsB,MAAM,SACnD,MAAM,kBAAkB,gBACxB,MAAM,eACP;;;;;;;;;;;;AAaH,MAAa,6BACX,OACA,UACA,OACA,SACA,gBACA,YACA,eACG;CACH,MAAM,aACJ,OAAO,UAAU,WACb,QACA,EAAE,OAAsC,QAAQ,QAAQ;CAC9D,MAAM,eACJ,OAAO,YAAY,WACf,UACA,EAAE,SAAwC,QAAQ,QAAQ;CAChE,MAAM,SAAS;CAEf,MAAM,MAAM,MAAM;CAClB,MAAM,UAAU,KAAK;CACrB,MAAM,iBAAiB;EACrB,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,QAAQ,KAAK;EACb,OAAO,KAAK;EACZ,MAAM,KAAK;EACX,SAAS,UACL;GACE,QAAQ,OAAO,QAAQ,MAAM,MAAM,GAAG;GACtC,WAAW,QAAQ,MAAM;GACzB,gBAAgB,OAAO,QAAQ,cAAc,MAAM,GAAG;GACtD,kBAAkB,QAAQ,cAAc;GACxC,WAAW,OAAO,QAAQ,SAAS,MAAM,GAAG;GAC5C,aAAa,QAAQ,SAAS;GAC/B,GACD;EACL;AAED,QAAO,MAAM,UAAU;EACrB,SAAS;EACT;EACA,SAAS;EACT,GAAG;EACH,GAAG;EACJ,CAAC;CAGF,MAAM,eAAe,eAAwB;EAC3C,OAAO;GACL,MAAM;GACN,OAAO;GACP,SAAS;GACT,GAAG;GACJ;EACD;EACD,CAAC;AAEF,QAAO,MAAM,KAAK,OAAO,CAAC,KAAK,aAAa;;;;;;;;;AAU9C,MAAa,8BACX,UACA,cACA,eACG;CACH,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,cAAc,MAAM;CACnC,MAAM,aAAa,EAAE,MAAM,OAAO,QAAQ,QAAQ;CAClD,MAAM,eAAe,EAAE,MAAM,SAAS,QAAQ,QAAQ;AACtD,QAAO,MAAM,UAAU;EAAE,SAAS;EAAc;EAAQ,GAAG;EAAc,CAAC;AAE1E,QAAO,eAAwB;EAC7B,OAAO;GACL,MAAM;GACN,OAAO;GACP,SAAS;GACT,GAAG;GACJ;EACD;EACD,CAAC;;AAIJ,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorsClass.mjs","names":[],"sources":["../../../../src/utils/errors/ErrorsClass.ts"],"sourcesContent":["import { HttpStatusCodes } from '@utils/httpStatusCodes';\n// @ts-ignore fastify-intlayer not build yet\nimport { type StrictModeLocaleMap, t } from 'fastify-intlayer';\nimport { type ErrorCodes, errorData } from './errorCodes';\n\n/**\n * Custom error class that extends the native JavaScript Error class.\n * This class supports multilingual error messages and HTTP status codes.\n */\nexport class AppError extends Error {\n public isAppError: boolean = true; // Flag to identify AppError instances.\n public name: string;\n public isMultilingual: boolean = true;\n public errorKey: string;\n public title: string;\n public multilingualTitle: StrictModeLocaleMap<string>;\n public message: string;\n public multilingualMessage: StrictModeLocaleMap<string>;\n public httpStatusCode: HttpStatusCodes;\n public messageDetails?: object;\n\n /**\n * Constructor for the custom error class.\n * @param multilingualMessage - The error message which can be a simple string or a multilingual object.\n * @param httpStatusCode - Optional HTTP status code, defaults to 500 Internal Server Error.\n */\n constructor(\n multilingualTitle: StrictModeLocaleMap<string>,\n multilingualMessage: StrictModeLocaleMap<string>,\n errorKey: string,\n httpStatusCode: HttpStatusCodes = HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n messageDetails?: object\n ) {\n const title = t(multilingualTitle); // Translate title based on current locale\n const message = t(multilingualMessage); // Translate message based on current locale.\n\n super(message); // Use translated message for the superclass constructor.\n this.title = title;\n this.multilingualTitle = multilingualTitle;\n this.message = message;\n this.multilingualMessage = multilingualMessage; // Store original message format for potential use.\n this.name = 'AppError';\n this.errorKey = errorKey;\n this.httpStatusCode = httpStatusCode; // Set the HTTP status code.\n this.messageDetails = messageDetails; // Store any additional message details.\n\n // Capture the stack trace to exclude the constructor call.\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class GenericError extends AppError {\n constructor(errorKey: ErrorCodes, messageDetails?: object) {\n const multilingualTitle = errorData[errorKey].title;\n const multilingualMessage = errorData[errorKey].message;\n const httpStatusCode = errorData[errorKey].statusCode;\n\n super(\n multilingualTitle,\n multilingualMessage,\n errorKey,\n httpStatusCode,\n messageDetails\n );\n }\n}\n"],"mappings":";;;;;;;;;AASA,IAAa,WAAb,cAA8B,MAAM;CAClC,AAAO,aAAsB;CAC7B,AAAO;CACP,AAAO,iBAA0B;CACjC,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;;;;;;CAOP,YACE,mBACA,qBACA,UACA,sBACA,gBACA;EACA,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"ErrorsClass.mjs","names":[],"sources":["../../../../src/utils/errors/ErrorsClass.ts"],"sourcesContent":["import { HttpStatusCodes } from '@utils/httpStatusCodes';\n// @ts-ignore fastify-intlayer not build yet\nimport { type StrictModeLocaleMap, t } from 'fastify-intlayer';\nimport { type ErrorCodes, errorData } from './errorCodes';\n\n/**\n * Custom error class that extends the native JavaScript Error class.\n * This class supports multilingual error messages and HTTP status codes.\n */\nexport class AppError extends Error {\n public isAppError: boolean = true; // Flag to identify AppError instances.\n public name: string;\n public isMultilingual: boolean = true;\n public errorKey: string;\n public title: string;\n public multilingualTitle: StrictModeLocaleMap<string>;\n public message: string;\n public multilingualMessage: StrictModeLocaleMap<string>;\n public httpStatusCode: HttpStatusCodes;\n public messageDetails?: object;\n\n /**\n * Constructor for the custom error class.\n * @param multilingualMessage - The error message which can be a simple string or a multilingual object.\n * @param httpStatusCode - Optional HTTP status code, defaults to 500 Internal Server Error.\n */\n constructor(\n multilingualTitle: StrictModeLocaleMap<string>,\n multilingualMessage: StrictModeLocaleMap<string>,\n errorKey: string,\n httpStatusCode: HttpStatusCodes = HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n messageDetails?: object\n ) {\n const title = t(multilingualTitle); // Translate title based on current locale\n const message = t(multilingualMessage); // Translate message based on current locale.\n\n super(message); // Use translated message for the superclass constructor.\n this.title = title;\n this.multilingualTitle = multilingualTitle;\n this.message = message;\n this.multilingualMessage = multilingualMessage; // Store original message format for potential use.\n this.name = 'AppError';\n this.errorKey = errorKey;\n this.httpStatusCode = httpStatusCode; // Set the HTTP status code.\n this.messageDetails = messageDetails; // Store any additional message details.\n\n // Capture the stack trace to exclude the constructor call.\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport class GenericError extends AppError {\n constructor(errorKey: ErrorCodes, messageDetails?: object) {\n const multilingualTitle = errorData[errorKey].title;\n const multilingualMessage = errorData[errorKey].message;\n const httpStatusCode = errorData[errorKey].statusCode;\n\n super(\n multilingualTitle,\n multilingualMessage,\n errorKey,\n httpStatusCode,\n messageDetails\n );\n }\n}\n"],"mappings":";;;;;;;;;AASA,IAAa,WAAb,cAA8B,MAAM;CAClC,AAAO,aAAsB;CAC7B,AAAO;CACP,AAAO,iBAA0B;CACjC,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;;;;;;CAOP,YACE,mBACA,qBACA,UACA,sBACA,gBACA;EACA,MAAM,QAAQ,EAAE,kBAAkB;EAClC,MAAM,UAAU,EAAE,oBAAoB;AAEtC,QAAM,QAAQ;AACd,OAAK,QAAQ;AACb,OAAK,oBAAoB;AACzB,OAAK,UAAU;AACf,OAAK,sBAAsB;AAC3B,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,OAAK,iBAAiB;AACtB,OAAK,iBAAiB;AAGtB,QAAM,kBAAkB,MAAM,KAAK,YAAY;;;AAInD,IAAa,eAAb,cAAkC,SAAS;CACzC,YAAY,UAAsB,gBAAyB;EACzD,MAAM,oBAAoB,UAAU,UAAU;EAC9C,MAAM,sBAAsB,UAAU,UAAU;EAChD,MAAM,iBAAiB,UAAU,UAAU;AAE3C,QACE,mBACA,qBACA,UACA,gBACA,eACD"}
|