@intlayer/backend 7.2.1-canary.0 → 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.
- package/dist/esm/utils/AI/aiSdk.mjs +7 -1
- package/dist/esm/utils/AI/aiSdk.mjs.map +1 -1
- package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
- package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
- package/dist/types/controllers/tag.controller.d.ts.map +1 -1
- package/dist/types/emails/InviteUserEmail.d.ts +4 -4
- package/dist/types/emails/InviteUserEmail.d.ts.map +1 -1
- package/dist/types/emails/MagicLinkEmail.d.ts +4 -4
- package/dist/types/emails/OAuthTokenCreatedEmail.d.ts +4 -4
- package/dist/types/emails/PasswordChangeConfirmation.d.ts +4 -4
- package/dist/types/emails/PasswordChangeConfirmation.d.ts.map +1 -1
- package/dist/types/emails/ResetUserPassword.d.ts +4 -4
- package/dist/types/emails/ResetUserPassword.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +4 -4
- package/dist/types/emails/SubscriptionPaymentError.d.ts +4 -4
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +4 -4
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -1
- package/dist/types/emails/ValidateUserEmail.d.ts +4 -4
- package/dist/types/emails/Welcome.d.ts +4 -4
- package/dist/types/models/dictionary.model.d.ts +4 -4
- package/dist/types/models/dictionary.model.d.ts.map +1 -1
- package/dist/types/models/discussion.model.d.ts +2 -2
- package/dist/types/models/discussion.model.d.ts.map +1 -1
- package/dist/types/models/oAuth2.model.d.ts +3 -3
- package/dist/types/models/oAuth2.model.d.ts.map +1 -1
- package/dist/types/routes/ai.routes.d.ts.map +1 -1
- package/dist/types/routes/project.routes.d.ts.map +1 -1
- package/dist/types/schemas/dictionary.schema.d.ts +6 -6
- package/dist/types/schemas/dictionary.schema.d.ts.map +1 -1
- package/dist/types/schemas/discussion.schema.d.ts +6 -6
- package/dist/types/schemas/oAuth2.schema.d.ts +5 -5
- package/dist/types/schemas/organization.schema.d.ts +6 -6
- package/dist/types/schemas/plans.schema.d.ts +6 -6
- package/dist/types/schemas/project.schema.d.ts +6 -6
- package/dist/types/schemas/project.schema.d.ts.map +1 -1
- package/dist/types/schemas/session.schema.d.ts +6 -6
- package/dist/types/schemas/tag.schema.d.ts +6 -6
- package/dist/types/schemas/user.schema.d.ts +6 -6
- package/dist/types/services/email.service.d.ts +11 -11
- package/dist/types/utils/filtersAndPagination/getDictionaryFiltersAndPagination.d.ts +2 -2
- package/dist/types/utils/filtersAndPagination/getDiscussionFiltersAndPagination.d.ts +2 -2
- package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts +2 -2
- package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts +2 -2
- package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts +2 -2
- package/package.json +17 -18
- package/dist/cjs/_virtual/_utils_asset.cjs +0 -98
- package/dist/cjs/_virtual/rolldown_runtime.cjs +0 -25
- package/dist/cjs/controllers/ai.controller.cjs +0 -381
- package/dist/cjs/controllers/ai.controller.cjs.map +0 -1
- package/dist/cjs/controllers/dictionary.controller.cjs +0 -463
- package/dist/cjs/controllers/dictionary.controller.cjs.map +0 -1
- package/dist/cjs/controllers/eventListener.controller.cjs +0 -53
- package/dist/cjs/controllers/eventListener.controller.cjs.map +0 -1
- package/dist/cjs/controllers/newsletter.controller.cjs +0 -164
- package/dist/cjs/controllers/newsletter.controller.cjs.map +0 -1
- package/dist/cjs/controllers/oAuth2.controller.cjs +0 -22
- package/dist/cjs/controllers/oAuth2.controller.cjs.map +0 -1
- package/dist/cjs/controllers/organization.controller.cjs +0 -492
- package/dist/cjs/controllers/organization.controller.cjs.map +0 -1
- package/dist/cjs/controllers/project.controller.cjs +0 -430
- package/dist/cjs/controllers/project.controller.cjs.map +0 -1
- package/dist/cjs/controllers/projectAccessKey.controller.cjs +0 -161
- package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +0 -1
- package/dist/cjs/controllers/search.controller.cjs +0 -14
- package/dist/cjs/controllers/search.controller.cjs.map +0 -1
- package/dist/cjs/controllers/stripe.controller.cjs +0 -149
- package/dist/cjs/controllers/stripe.controller.cjs.map +0 -1
- package/dist/cjs/controllers/tag.controller.cjs +0 -226
- package/dist/cjs/controllers/tag.controller.cjs.map +0 -1
- package/dist/cjs/controllers/user.controller.cjs +0 -269
- package/dist/cjs/controllers/user.controller.cjs.map +0 -1
- package/dist/cjs/emails/InviteUserEmail.cjs +0 -325
- package/dist/cjs/emails/InviteUserEmail.cjs.map +0 -1
- package/dist/cjs/emails/MagicLinkEmail.cjs +0 -242
- package/dist/cjs/emails/MagicLinkEmail.cjs.map +0 -1
- package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs +0 -301
- package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs.map +0 -1
- package/dist/cjs/emails/PasswordChangeConfirmation.cjs +0 -177
- package/dist/cjs/emails/PasswordChangeConfirmation.cjs.map +0 -1
- package/dist/cjs/emails/ResetUserPassword.cjs +0 -240
- package/dist/cjs/emails/ResetUserPassword.cjs.map +0 -1
- package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs +0 -202
- package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs.map +0 -1
- package/dist/cjs/emails/SubscriptionPaymentError.cjs +0 -202
- package/dist/cjs/emails/SubscriptionPaymentError.cjs.map +0 -1
- package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs +0 -208
- package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs.map +0 -1
- package/dist/cjs/emails/ValidateUserEmail.cjs +0 -240
- package/dist/cjs/emails/ValidateUserEmail.cjs.map +0 -1
- package/dist/cjs/emails/Welcome.cjs +0 -216
- package/dist/cjs/emails/Welcome.cjs.map +0 -1
- package/dist/cjs/emails/index.cjs +0 -25
- package/dist/cjs/export.cjs +0 -24
- package/dist/cjs/index.cjs +0 -91
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/logger/index.cjs +0 -13
- package/dist/cjs/logger/index.cjs.map +0 -1
- package/dist/cjs/middlewares/oAuth2.middleware.cjs +0 -42
- package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +0 -1
- package/dist/cjs/middlewares/request.middleware.cjs +0 -17
- package/dist/cjs/middlewares/request.middleware.cjs.map +0 -1
- package/dist/cjs/middlewares/sessionAuth.middleware.cjs +0 -22
- package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +0 -1
- package/dist/cjs/models/dictionary.model.cjs +0 -10
- package/dist/cjs/models/dictionary.model.cjs.map +0 -1
- package/dist/cjs/models/discussion.model.cjs +0 -10
- package/dist/cjs/models/discussion.model.cjs.map +0 -1
- package/dist/cjs/models/oAuth2.model.cjs +0 -10
- package/dist/cjs/models/oAuth2.model.cjs.map +0 -1
- package/dist/cjs/models/organization.model.cjs +0 -10
- package/dist/cjs/models/organization.model.cjs.map +0 -1
- package/dist/cjs/models/project.model.cjs +0 -10
- package/dist/cjs/models/project.model.cjs.map +0 -1
- package/dist/cjs/models/session.model.cjs +0 -10
- package/dist/cjs/models/session.model.cjs.map +0 -1
- package/dist/cjs/models/tag.model.cjs +0 -10
- package/dist/cjs/models/tag.model.cjs.map +0 -1
- package/dist/cjs/models/user.model.cjs +0 -10
- package/dist/cjs/models/user.model.cjs.map +0 -1
- package/dist/cjs/routes/ai.routes.cjs +0 -75
- package/dist/cjs/routes/ai.routes.cjs.map +0 -1
- package/dist/cjs/routes/dictionary.routes.cjs +0 -64
- package/dist/cjs/routes/dictionary.routes.cjs.map +0 -1
- package/dist/cjs/routes/eventListener.routes.cjs +0 -20
- package/dist/cjs/routes/eventListener.routes.cjs.map +0 -1
- package/dist/cjs/routes/newsletter.routes.cjs +0 -34
- package/dist/cjs/routes/newsletter.routes.cjs.map +0 -1
- package/dist/cjs/routes/organization.routes.cjs +0 -70
- package/dist/cjs/routes/organization.routes.cjs.map +0 -1
- package/dist/cjs/routes/project.routes.cjs +0 -83
- package/dist/cjs/routes/project.routes.cjs.map +0 -1
- package/dist/cjs/routes/search.routes.cjs +0 -20
- package/dist/cjs/routes/search.routes.cjs.map +0 -1
- package/dist/cjs/routes/stripe.routes.cjs +0 -34
- package/dist/cjs/routes/stripe.routes.cjs.map +0 -1
- package/dist/cjs/routes/tags.routes.cjs +0 -40
- package/dist/cjs/routes/tags.routes.cjs.map +0 -1
- package/dist/cjs/routes/user.routes.cjs +0 -58
- package/dist/cjs/routes/user.routes.cjs.map +0 -1
- package/dist/cjs/schemas/dictionary.schema.cjs +0 -73
- package/dist/cjs/schemas/dictionary.schema.cjs.map +0 -1
- package/dist/cjs/schemas/discussion.schema.cjs +0 -81
- package/dist/cjs/schemas/discussion.schema.cjs.map +0 -1
- package/dist/cjs/schemas/oAuth2.schema.cjs +0 -49
- package/dist/cjs/schemas/oAuth2.schema.cjs.map +0 -1
- package/dist/cjs/schemas/organization.schema.cjs +0 -62
- package/dist/cjs/schemas/organization.schema.cjs.map +0 -1
- package/dist/cjs/schemas/plans.schema.cjs +0 -75
- package/dist/cjs/schemas/plans.schema.cjs.map +0 -1
- package/dist/cjs/schemas/project.schema.cjs +0 -112
- package/dist/cjs/schemas/project.schema.cjs.map +0 -1
- package/dist/cjs/schemas/session.schema.cjs +0 -43
- package/dist/cjs/schemas/session.schema.cjs.map +0 -1
- package/dist/cjs/schemas/tag.schema.cjs +0 -62
- package/dist/cjs/schemas/tag.schema.cjs.map +0 -1
- package/dist/cjs/schemas/user.schema.cjs +0 -87
- package/dist/cjs/schemas/user.schema.cjs.map +0 -1
- package/dist/cjs/services/dictionary.service.cjs +0 -176
- package/dist/cjs/services/dictionary.service.cjs.map +0 -1
- package/dist/cjs/services/email.service.cjs +0 -155
- package/dist/cjs/services/email.service.cjs.map +0 -1
- package/dist/cjs/services/oAuth2.service.cjs +0 -211
- package/dist/cjs/services/oAuth2.service.cjs.map +0 -1
- package/dist/cjs/services/organization.service.cjs +0 -106
- package/dist/cjs/services/organization.service.cjs.map +0 -1
- package/dist/cjs/services/project.service.cjs +0 -89
- package/dist/cjs/services/project.service.cjs.map +0 -1
- package/dist/cjs/services/projectAccessKey.service.cjs +0 -111
- package/dist/cjs/services/projectAccessKey.service.cjs.map +0 -1
- package/dist/cjs/services/subscription.service.cjs +0 -184
- package/dist/cjs/services/subscription.service.cjs.map +0 -1
- package/dist/cjs/services/tag.service.cjs +0 -88
- package/dist/cjs/services/tag.service.cjs.map +0 -1
- package/dist/cjs/services/user.service.cjs +0 -120
- package/dist/cjs/services/user.service.cjs.map +0 -1
- package/dist/cjs/types/Routes.cjs +0 -0
- package/dist/cjs/types/dictionary.types.cjs +0 -0
- package/dist/cjs/types/discussion.types.cjs +0 -0
- package/dist/cjs/types/oAuth2.types.cjs +0 -0
- package/dist/cjs/types/organization.types.cjs +0 -0
- package/dist/cjs/types/plan.types.cjs +0 -0
- package/dist/cjs/types/project.types.cjs +0 -0
- package/dist/cjs/types/session.types.cjs +0 -0
- package/dist/cjs/types/tag.types.cjs +0 -0
- package/dist/cjs/types/user.types.cjs +0 -10
- package/dist/cjs/types/user.types.cjs.map +0 -1
- package/dist/cjs/utils/AI/aiSdk.cjs +0 -94
- package/dist/cjs/utils/AI/aiSdk.cjs.map +0 -1
- package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +0 -201
- package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +0 -1
- package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs +0 -150
- package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs.map +0 -1
- package/dist/cjs/utils/AI/auditDictionary/index.cjs +0 -60
- package/dist/cjs/utils/AI/auditDictionary/index.cjs.map +0 -1
- package/dist/cjs/utils/AI/auditDictionaryField/index.cjs +0 -63
- package/dist/cjs/utils/AI/auditDictionaryField/index.cjs.map +0 -1
- package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs +0 -45
- package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs.map +0 -1
- package/dist/cjs/utils/AI/auditTag/index.cjs +0 -40
- package/dist/cjs/utils/AI/auditTag/index.cjs.map +0 -1
- package/dist/cjs/utils/AI/autocomplete/index.cjs +0 -41
- package/dist/cjs/utils/AI/autocomplete/index.cjs.map +0 -1
- package/dist/cjs/utils/AI/customQuery/index.cjs +0 -27
- package/dist/cjs/utils/AI/customQuery/index.cjs.map +0 -1
- package/dist/cjs/utils/AI/translateJSON/index.cjs +0 -71
- package/dist/cjs/utils/AI/translateJSON/index.cjs.map +0 -1
- package/dist/cjs/utils/access.cjs +0 -0
- package/dist/cjs/utils/accessControl.cjs +0 -133
- package/dist/cjs/utils/accessControl.cjs.map +0 -1
- package/dist/cjs/utils/auth/getAuth.cjs +0 -218
- package/dist/cjs/utils/auth/getAuth.cjs.map +0 -1
- package/dist/cjs/utils/cors.cjs +0 -33
- package/dist/cjs/utils/cors.cjs.map +0 -1
- package/dist/cjs/utils/ensureArrayQueryFilter.cjs +0 -13
- package/dist/cjs/utils/ensureArrayQueryFilter.cjs.map +0 -1
- package/dist/cjs/utils/ensureMongoDocumentToObject.cjs +0 -16
- package/dist/cjs/utils/ensureMongoDocumentToObject.cjs.map +0 -1
- package/dist/cjs/utils/errors/ErrorHandler.cjs +0 -76
- package/dist/cjs/utils/errors/ErrorHandler.cjs.map +0 -1
- package/dist/cjs/utils/errors/ErrorsClass.cjs +0 -54
- package/dist/cjs/utils/errors/ErrorsClass.cjs.map +0 -1
- package/dist/cjs/utils/errors/errorCodes.cjs +0 -1387
- package/dist/cjs/utils/errors/errorCodes.cjs.map +0 -1
- package/dist/cjs/utils/errors/index.cjs +0 -8
- package/dist/cjs/utils/extractJSON.cjs +0 -61
- package/dist/cjs/utils/extractJSON.cjs.map +0 -1
- package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs +0 -94
- package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs.map +0 -1
- package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs +0 -65
- package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs.map +0 -1
- package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs +0 -36
- package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs.map +0 -1
- package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs +0 -49
- package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs.map +0 -1
- package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs +0 -53
- package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs.map +0 -1
- package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs +0 -57
- package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs.map +0 -1
- package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs +0 -74
- package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs.map +0 -1
- package/dist/cjs/utils/httpStatusCodes.cjs +0 -401
- package/dist/cjs/utils/httpStatusCodes.cjs.map +0 -1
- package/dist/cjs/utils/mapper/dictionary.cjs +0 -29
- package/dist/cjs/utils/mapper/dictionary.cjs.map +0 -1
- package/dist/cjs/utils/mapper/organization.cjs +0 -19
- package/dist/cjs/utils/mapper/organization.cjs.map +0 -1
- package/dist/cjs/utils/mapper/project.cjs +0 -26
- package/dist/cjs/utils/mapper/project.cjs.map +0 -1
- package/dist/cjs/utils/mapper/session.cjs +0 -15
- package/dist/cjs/utils/mapper/session.cjs.map +0 -1
- package/dist/cjs/utils/mapper/tag.cjs +0 -25
- package/dist/cjs/utils/mapper/tag.cjs.map +0 -1
- package/dist/cjs/utils/mapper/user.cjs +0 -24
- package/dist/cjs/utils/mapper/user.cjs.map +0 -1
- package/dist/cjs/utils/mergeFunctionTypes.cjs +0 -0
- package/dist/cjs/utils/mongoDB/connectDB.cjs +0 -32
- package/dist/cjs/utils/mongoDB/connectDB.cjs.map +0 -1
- package/dist/cjs/utils/mongoDB/types.cjs +0 -0
- package/dist/cjs/utils/oAuth2.cjs +0 -25
- package/dist/cjs/utils/oAuth2.cjs.map +0 -1
- package/dist/cjs/utils/permissions.cjs +0 -103
- package/dist/cjs/utils/permissions.cjs.map +0 -1
- package/dist/cjs/utils/plan.cjs +0 -63
- package/dist/cjs/utils/plan.cjs.map +0 -1
- package/dist/cjs/utils/rateLimiter.cjs +0 -48
- package/dist/cjs/utils/rateLimiter.cjs.map +0 -1
- package/dist/cjs/utils/removeObjectKeys.cjs +0 -11
- package/dist/cjs/utils/removeObjectKeys.cjs.map +0 -1
- package/dist/cjs/utils/responseData.cjs +0 -33
- package/dist/cjs/utils/responseData.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateArray.cjs +0 -31
- package/dist/cjs/utils/validation/validateArray.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateDictionary.cjs +0 -35
- package/dist/cjs/utils/validation/validateDictionary.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateEmail.cjs +0 -20
- package/dist/cjs/utils/validation/validateEmail.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateOrganization.cjs +0 -43
- package/dist/cjs/utils/validation/validateOrganization.cjs.map +0 -1
- package/dist/cjs/utils/validation/validatePhone.cjs +0 -20
- package/dist/cjs/utils/validation/validatePhone.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateProject.cjs +0 -55
- package/dist/cjs/utils/validation/validateProject.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateString.cjs +0 -21
- package/dist/cjs/utils/validation/validateString.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateTag.cjs +0 -47
- package/dist/cjs/utils/validation/validateTag.cjs.map +0 -1
- package/dist/cjs/utils/validation/validateUser.cjs +0 -47
- package/dist/cjs/utils/validation/validateUser.cjs.map +0 -1
- package/dist/cjs/webhooks/stripe.webhook.cjs +0 -116
- package/dist/cjs/webhooks/stripe.webhook.cjs.map +0 -1
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const require_utils_ensureMongoDocumentToObject = require('../ensureMongoDocumentToObject.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/mapper/project.ts
|
|
4
|
-
/**
|
|
5
|
-
* Maps a project to an API response.
|
|
6
|
-
* @param project - The project to map.
|
|
7
|
-
* @param - Whether the user is an admin of the project.
|
|
8
|
-
* @returns The project mapped to an API response.
|
|
9
|
-
*/
|
|
10
|
-
const mapProjectToAPI = (project) => {
|
|
11
|
-
if (!project) return null;
|
|
12
|
-
return require_utils_ensureMongoDocumentToObject.ensureMongoDocumentToObject(project);
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Formats an array of projects for API response. Removes sensitive information.
|
|
16
|
-
* @param projects - The array of project objects to format.
|
|
17
|
-
* @param user - The user object.
|
|
18
|
-
* @param - Whether the user is an admin of the project.
|
|
19
|
-
* @returns The formatted array of user objects.
|
|
20
|
-
*/
|
|
21
|
-
const mapProjectsToAPI = (projects) => projects.map(mapProjectToAPI).filter(Boolean);
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
|
-
exports.mapProjectToAPI = mapProjectToAPI;
|
|
25
|
-
exports.mapProjectsToAPI = mapProjectsToAPI;
|
|
26
|
-
//# sourceMappingURL=project.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project.cjs","names":["ensureMongoDocumentToObject"],"sources":["../../../../src/utils/mapper/project.ts"],"sourcesContent":["import { ensureMongoDocumentToObject } from '@utils/ensureMongoDocumentToObject';\nimport type { Project, ProjectAPI } from '@/types/project.types';\n\n/**\n * Maps a project to an API response.\n * @param project - The project to map.\n * @param - Whether the user is an admin of the project.\n * @returns The project mapped to an API response.\n */\nexport const mapProjectToAPI = <T extends Project | ProjectAPI | null>(\n project?: T\n): T extends null ? null : ProjectAPI => {\n if (!project) {\n return null as any;\n }\n\n const projectObject = ensureMongoDocumentToObject(project);\n\n return projectObject as any;\n};\n\n/**\n * Formats an array of projects for API response. Removes sensitive information.\n * @param projects - The array of project objects to format.\n * @param user - The user object.\n * @param - Whether the user is an admin of the project.\n * @returns The formatted array of user objects.\n */\nexport const mapProjectsToAPI = (\n projects: (Project | ProjectAPI)[]\n): ProjectAPI[] =>\n projects.map(mapProjectToAPI).filter(Boolean) as ProjectAPI[];\n"],"mappings":";;;;;;;;;AASA,MAAa,mBACX,YACuC;AACvC,KAAI,CAAC,QACH,QAAO;AAKT,QAFsBA,sEAA4B,QAAQ;;;;;;;;;AAY5D,MAAa,oBACX,aAEA,SAAS,IAAI,gBAAgB,CAAC,OAAO,QAAQ"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const require_utils_mapper_user = require('./user.cjs');
|
|
2
|
-
const require_utils_mapper_organization = require('./organization.cjs');
|
|
3
|
-
const require_utils_mapper_project = require('./project.cjs');
|
|
4
|
-
|
|
5
|
-
//#region src/utils/mapper/session.ts
|
|
6
|
-
const mapSessionToAPI = (session) => ({
|
|
7
|
-
...session,
|
|
8
|
-
user: require_utils_mapper_user.mapUserToAPI(session.user),
|
|
9
|
-
organization: require_utils_mapper_organization.mapOrganizationToAPI(session.organization),
|
|
10
|
-
project: require_utils_mapper_project.mapProjectToAPI(session.project)
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
//#endregion
|
|
14
|
-
exports.mapSessionToAPI = mapSessionToAPI;
|
|
15
|
-
//# sourceMappingURL=session.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.cjs","names":["mapUserToAPI","mapOrganizationToAPI","mapProjectToAPI"],"sources":["../../../../src/utils/mapper/session.ts"],"sourcesContent":["import type { OmitId } from 'better-auth';\nimport type { Session, SessionAPI } from '@/types/session.types';\nimport { mapOrganizationToAPI } from './organization';\nimport { mapProjectToAPI } from './project';\nimport { mapUserToAPI } from './user';\n\nexport const mapSessionToAPI = (\n session: OmitId<Session>\n): OmitId<SessionAPI> => ({\n ...session,\n user: mapUserToAPI(session.user),\n organization: mapOrganizationToAPI(session.organization),\n project: mapProjectToAPI(session.project),\n});\n"],"mappings":";;;;;AAMA,MAAa,mBACX,aACwB;CACxB,GAAG;CACH,MAAMA,uCAAa,QAAQ,KAAK;CAChC,cAAcC,uDAAqB,QAAQ,aAAa;CACxD,SAASC,6CAAgB,QAAQ,QAAQ;CAC1C"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const require_utils_ensureMongoDocumentToObject = require('../ensureMongoDocumentToObject.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/mapper/tag.ts
|
|
4
|
-
/**
|
|
5
|
-
* Maps a tag to an API response.
|
|
6
|
-
* @param tag - The tag to map.
|
|
7
|
-
* @returns The tag mapped to an API response.
|
|
8
|
-
*/
|
|
9
|
-
const mapTagToAPI = (tag) => {
|
|
10
|
-
if (!tag) return null;
|
|
11
|
-
return require_utils_ensureMongoDocumentToObject.ensureMongoDocumentToObject(tag);
|
|
12
|
-
};
|
|
13
|
-
/**
|
|
14
|
-
* Formats an array of tags for API response. Removes sensitive information.
|
|
15
|
-
* @param tags - The array of tag objects to format.
|
|
16
|
-
* @param user - The user object.
|
|
17
|
-
* @param isTagAdmin - Whether the user is an admin of the tag.
|
|
18
|
-
* @returns The formatted array of user objects.
|
|
19
|
-
*/
|
|
20
|
-
const mapTagsToAPI = (tags) => tags.map((tag) => mapTagToAPI(tag));
|
|
21
|
-
|
|
22
|
-
//#endregion
|
|
23
|
-
exports.mapTagToAPI = mapTagToAPI;
|
|
24
|
-
exports.mapTagsToAPI = mapTagsToAPI;
|
|
25
|
-
//# sourceMappingURL=tag.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tag.cjs","names":["ensureMongoDocumentToObject"],"sources":["../../../../src/utils/mapper/tag.ts"],"sourcesContent":["import { ensureMongoDocumentToObject } from '@utils/ensureMongoDocumentToObject';\nimport type { Tag, TagAPI } from '@/types/tag.types';\n\n/**\n * Maps a tag to an API response.\n * @param tag - The tag to map.\n * @returns The tag mapped to an API response.\n */\nexport const mapTagToAPI = <T extends Tag | TagAPI | null>(\n tag: T\n): T extends null ? null : TagAPI => {\n if (!tag) {\n return null as any;\n }\n\n const tagObject = ensureMongoDocumentToObject(tag);\n\n return tagObject as any;\n};\n\n/**\n * Formats an array of tags for API response. Removes sensitive information.\n * @param tags - The array of tag objects to format.\n * @param user - The user object.\n * @param isTagAdmin - Whether the user is an admin of the tag.\n * @returns The formatted array of user objects.\n */\nexport const mapTagsToAPI = (tags: Tag[]): TagAPI[] =>\n tags.map((tag) => mapTagToAPI(tag));\n"],"mappings":";;;;;;;;AAQA,MAAa,eACX,QACmC;AACnC,KAAI,CAAC,IACH,QAAO;AAKT,QAFkBA,sEAA4B,IAAI;;;;;;;;;AAYpD,MAAa,gBAAgB,SAC3B,KAAK,KAAK,QAAQ,YAAY,IAAI,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
const require_utils_ensureMongoDocumentToObject = require('../ensureMongoDocumentToObject.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/mapper/user.ts
|
|
4
|
-
/**
|
|
5
|
-
* Formats a user for API response. Removes sensitive information and adds role.
|
|
6
|
-
* @param user - The user object to format.
|
|
7
|
-
* @returns The formatted user object.
|
|
8
|
-
*/
|
|
9
|
-
const mapUserToAPI = (user) => {
|
|
10
|
-
if (!user) return null;
|
|
11
|
-
const { provider, session, ...userAPI } = require_utils_ensureMongoDocumentToObject.ensureMongoDocumentToObject(user);
|
|
12
|
-
return userAPI;
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Formats an array of users for API response. Removes sensitive information and adds role.
|
|
16
|
-
* @param users - The array of user objects to format.
|
|
17
|
-
* @returns The formatted array of user objects.
|
|
18
|
-
*/
|
|
19
|
-
const mapUsersToAPI = (users) => users.map(mapUserToAPI).filter(Boolean);
|
|
20
|
-
|
|
21
|
-
//#endregion
|
|
22
|
-
exports.mapUserToAPI = mapUserToAPI;
|
|
23
|
-
exports.mapUsersToAPI = mapUsersToAPI;
|
|
24
|
-
//# sourceMappingURL=user.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user.cjs","names":["ensureMongoDocumentToObject"],"sources":["../../../../src/utils/mapper/user.ts"],"sourcesContent":["import { ensureMongoDocumentToObject } from '@utils/ensureMongoDocumentToObject';\nimport type { User, UserAPI } from '@/types/user.types';\n\n/**\n * Formats a user for API response. Removes sensitive information and adds role.\n * @param user - The user object to format.\n * @returns The formatted user object.\n */\nexport const mapUserToAPI = <T extends User | UserAPI | null>(\n user?: T\n): T extends null ? null : UserAPI => {\n if (!user) {\n return null as any;\n }\n\n const userObject = ensureMongoDocumentToObject(user);\n\n // biome-ignore lint/correctness/noUnusedVariables: Just filter out provider and session\n const { provider, session, ...userAPI } = userObject as any;\n\n return userAPI as any;\n};\n\n/**\n * Formats an array of users for API response. Removes sensitive information and adds role.\n * @param users - The array of user objects to format.\n * @returns The formatted array of user objects.\n */\nexport const mapUsersToAPI = (users: (User | UserAPI)[]): UserAPI[] =>\n users.map(mapUserToAPI).filter(Boolean) as UserAPI[];\n"],"mappings":";;;;;;;;AAQA,MAAa,gBACX,SACoC;AACpC,KAAI,CAAC,KACH,QAAO;CAMT,MAAM,EAAE,UAAU,SAAS,GAAG,YAHXA,sEAA4B,KAAK;AAKpD,QAAO;;;;;;;AAQT,MAAa,iBAAiB,UAC5B,MAAM,IAAI,aAAa,CAAC,OAAO,QAAQ"}
|
|
File without changes
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
|
|
2
|
-
const require_models_dictionary_model = require('../../models/dictionary.model.cjs');
|
|
3
|
-
const require_logger_index = require('../../logger/index.cjs');
|
|
4
|
-
const require_models_organization_model = require('../../models/organization.model.cjs');
|
|
5
|
-
const require_models_project_model = require('../../models/project.model.cjs');
|
|
6
|
-
const require_models_tag_model = require('../../models/tag.model.cjs');
|
|
7
|
-
const require_models_user_model = require('../../models/user.model.cjs');
|
|
8
|
-
const require_models_oAuth2_model = require('../../models/oAuth2.model.cjs');
|
|
9
|
-
let mongoose = require("mongoose");
|
|
10
|
-
|
|
11
|
-
//#region src/utils/mongoDB/connectDB.ts
|
|
12
|
-
const connectDB = async () => {
|
|
13
|
-
try {
|
|
14
|
-
const client = await (0, mongoose.connect)(`mongodb+srv://${process.env.DB_ID}:${process.env.DB_MDP}@${process.env.DB_CLUSTER}/?retryWrites=true&w=majority&appName=Cluster0`);
|
|
15
|
-
require_logger_index.logger.info("MongoDB connected");
|
|
16
|
-
await require_models_project_model.ProjectModel.syncIndexes();
|
|
17
|
-
await require_models_user_model.UserModel.createIndexes();
|
|
18
|
-
await require_models_oAuth2_model.OAuth2AccessTokenModel.createIndexes();
|
|
19
|
-
await require_models_tag_model.TagModel.createIndexes();
|
|
20
|
-
await require_models_dictionary_model.DictionaryModel.createIndexes();
|
|
21
|
-
await require_models_organization_model.OrganizationModel.createIndexes();
|
|
22
|
-
return client.connection.getClient();
|
|
23
|
-
} catch (error) {
|
|
24
|
-
const errorMessage = `MongoDB connection error - ${error.message}`;
|
|
25
|
-
require_logger_index.logger.error(errorMessage);
|
|
26
|
-
throw new Error(errorMessage);
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
//#endregion
|
|
31
|
-
exports.connectDB = connectDB;
|
|
32
|
-
//# sourceMappingURL=connectDB.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connectDB.cjs","names":["ProjectModel","UserModel","OAuth2AccessTokenModel","TagModel","DictionaryModel","OrganizationModel"],"sources":["../../../../src/utils/mongoDB/connectDB.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { DictionaryModel } from '@models/dictionary.model';\nimport { OAuth2AccessTokenModel } from '@models/oAuth2.model';\nimport { OrganizationModel } from '@models/organization.model';\nimport { ProjectModel } from '@models/project.model';\nimport { TagModel } from '@models/tag.model';\nimport { UserModel } from '@models/user.model';\nimport type { MongoClient } from 'mongodb';\nimport { connect } from 'mongoose';\n\nexport const connectDB = async (): Promise<MongoClient> => {\n try {\n const client = await connect(\n `mongodb+srv://${process.env.DB_ID}:${process.env.DB_MDP}@${process.env.DB_CLUSTER}/?retryWrites=true&w=majority&appName=Cluster0`\n );\n\n logger.info('MongoDB connected');\n\n // Recreate indexes for models\n await ProjectModel.syncIndexes();\n await UserModel.createIndexes();\n await OAuth2AccessTokenModel.createIndexes();\n await TagModel.createIndexes();\n await DictionaryModel.createIndexes();\n await OrganizationModel.createIndexes();\n\n // Return the underlying MongoDB client for better-auth\n return client.connection.getClient();\n } catch (error) {\n const errorMessage = `MongoDB connection error - ${(error as Error).message}`;\n\n logger.error(errorMessage);\n throw new Error(errorMessage);\n }\n};\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,YAAY,YAAkC;AACzD,KAAI;EACF,MAAM,SAAS,4BACb,iBAAiB,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,IAAI,WAAW,gDACpF;AAED,8BAAO,KAAK,oBAAoB;AAGhC,QAAMA,0CAAa,aAAa;AAChC,QAAMC,oCAAU,eAAe;AAC/B,QAAMC,mDAAuB,eAAe;AAC5C,QAAMC,kCAAS,eAAe;AAC9B,QAAMC,gDAAgB,eAAe;AACrC,QAAMC,oDAAkB,eAAe;AAGvC,SAAO,OAAO,WAAW,WAAW;UAC7B,OAAO;EACd,MAAM,eAAe,8BAA+B,MAAgB;AAEpE,8BAAO,MAAM,aAAa;AAC1B,QAAM,IAAI,MAAM,aAAa"}
|
|
File without changes
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const require_services_oAuth2_service = require('../services/oAuth2.service.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/oAuth2.ts
|
|
4
|
-
const ACCESS_TOKEN_EXPIRES_IN = 3600 * 2;
|
|
5
|
-
const getTokenExpireAt = () => new Date(Date.now() + ACCESS_TOKEN_EXPIRES_IN * 1e3);
|
|
6
|
-
const authenticateOptions = {
|
|
7
|
-
scope: void 0,
|
|
8
|
-
addAcceptedScopesHeader: void 0,
|
|
9
|
-
addAuthorizedScopesHeader: void 0,
|
|
10
|
-
allowBearerTokensInQueryString: void 0
|
|
11
|
-
};
|
|
12
|
-
const getAuthModel = () => ({
|
|
13
|
-
getClient: require_services_oAuth2_service.getClient,
|
|
14
|
-
saveToken: require_services_oAuth2_service.saveToken,
|
|
15
|
-
getUserFromClient: require_services_oAuth2_service.getUserFromClient,
|
|
16
|
-
verifyScope: require_services_oAuth2_service.verifyScope,
|
|
17
|
-
getAccessToken: require_services_oAuth2_service.getAccessToken
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
//#endregion
|
|
21
|
-
exports.ACCESS_TOKEN_EXPIRES_IN = ACCESS_TOKEN_EXPIRES_IN;
|
|
22
|
-
exports.authenticateOptions = authenticateOptions;
|
|
23
|
-
exports.getAuthModel = getAuthModel;
|
|
24
|
-
exports.getTokenExpireAt = getTokenExpireAt;
|
|
25
|
-
//# sourceMappingURL=oAuth2.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oAuth2.cjs","names":["authenticateOptions: AuthenticateOptions"],"sources":["../../../src/utils/oAuth2.ts"],"sourcesContent":["import {\n getAccessToken,\n getClient,\n getUserFromClient,\n saveToken,\n verifyScope,\n} from '@services/oAuth2.service';\nimport type OAuth2Server from 'oauth2-server';\nimport type { AuthenticateOptions } from 'oauth2-server';\n\nexport const ACCESS_TOKEN_EXPIRES_IN = 60 * 60 * 2; // 2 hour\n\nexport const getTokenExpireAt = () =>\n new Date(Date.now() + ACCESS_TOKEN_EXPIRES_IN * 1000);\n\nexport const authenticateOptions: AuthenticateOptions = {\n scope: undefined,\n addAcceptedScopesHeader: undefined,\n addAuthorizedScopesHeader: undefined,\n allowBearerTokensInQueryString: undefined,\n};\n\nexport const getAuthModel = (): OAuth2Server.ClientCredentialsModel => ({\n getClient,\n saveToken,\n getUserFromClient,\n verifyScope,\n getAccessToken,\n});\n"],"mappings":";;;AAUA,MAAa,0BAA0B,OAAU;AAEjD,MAAa,yBACX,IAAI,KAAK,KAAK,KAAK,GAAG,0BAA0B,IAAK;AAEvD,MAAaA,sBAA2C;CACtD,OAAO;CACP,yBAAyB;CACzB,2BAA2B;CAC3B,gCAAgC;CACjC;AAED,MAAa,sBAA2D;CACtE;CACA;CACA;CACA;CACA;CACD"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/utils/permissions.ts
|
|
3
|
-
const ROLE_POLICY = {
|
|
4
|
-
admin: {
|
|
5
|
-
"organization:read": () => true,
|
|
6
|
-
"organization:write": () => true,
|
|
7
|
-
"organization:admin": () => true,
|
|
8
|
-
"project:read": () => true,
|
|
9
|
-
"project:write": () => true,
|
|
10
|
-
"project:admin": () => true,
|
|
11
|
-
"dictionary:read": () => true,
|
|
12
|
-
"dictionary:write": () => true,
|
|
13
|
-
"dictionary:admin": () => true,
|
|
14
|
-
"tag:read": () => true,
|
|
15
|
-
"tag:write": () => true,
|
|
16
|
-
"tag:admin": () => true,
|
|
17
|
-
"user:read": () => true,
|
|
18
|
-
"user:write": () => true,
|
|
19
|
-
"user:admin": () => true
|
|
20
|
-
},
|
|
21
|
-
user: {
|
|
22
|
-
"user:read": ({ user, targetUsers }) => targetUsers.every((targetUser) => String(targetUser.id) === String(user?.id) && targetUser.email === user?.email),
|
|
23
|
-
"user:write": ({ user, targetUsers }) => targetUsers.every((targetUser) => String(targetUser.id) === String(user?.id) && targetUser.email === user?.email),
|
|
24
|
-
"user:admin": ({ user, targetUsers }) => targetUsers.every((targetUser) => String(targetUser.id) === String(user?.id) && targetUser.email === user?.email),
|
|
25
|
-
"organization:read": ({ user, targetOrganizations }) => targetOrganizations.every((organization) => organization?.membersIds?.map(String).includes(String(user?.id)))
|
|
26
|
-
},
|
|
27
|
-
org_admin: {
|
|
28
|
-
"organization:read": ({ organization, targetOrganizations }) => targetOrganizations.every((targetOrg) => String(targetOrg.id) === String(organization?.id)),
|
|
29
|
-
"organization:write": ({ organization, targetOrganizations }) => targetOrganizations.every((targetOrg) => String(targetOrg.id) === String(organization?.id)),
|
|
30
|
-
"organization:admin": ({ organization, targetOrganizations }) => targetOrganizations.every((targetOrg) => String(targetOrg.id) === String(organization?.id)),
|
|
31
|
-
"project:read": ({ organization, project }) => String(project?.organizationId) === String(organization?.id),
|
|
32
|
-
"project:write": ({ organization, project }) => String(project?.organizationId) === String(organization?.id),
|
|
33
|
-
"project:admin": ({ organization, project }) => String(project?.organizationId) === String(organization?.id),
|
|
34
|
-
"tag:read": ({ organization, project }) => String(project?.organizationId) === String(organization?.id),
|
|
35
|
-
"tag:write": ({ organization, project }) => String(project?.organizationId) === String(organization?.id),
|
|
36
|
-
"tag:admin": ({ organization, project }) => String(project?.organizationId) === String(organization?.id),
|
|
37
|
-
"user:write": ({ organization, targetUsers }) => targetUsers.every((targetUser) => organization?.membersIds?.map(String).includes(String(targetUser?.id)))
|
|
38
|
-
},
|
|
39
|
-
org_user: {
|
|
40
|
-
"organization:read": ({ organization, targetOrganizations }) => targetOrganizations.every((targetOrg) => String(targetOrg.id) === String(organization?.id)),
|
|
41
|
-
"project:read": ({ user, targetProjects }) => targetProjects?.every((project) => project?.membersIds?.map(String).includes(String(user?.id))),
|
|
42
|
-
"user:read": ({ organization, targetUsers }) => targetUsers.every((targetUser) => organization?.membersIds?.map(String).includes(String(targetUser?.id)))
|
|
43
|
-
},
|
|
44
|
-
project_admin: {
|
|
45
|
-
"project:read": ({ project, targetProjectIds }) => targetProjectIds?.every((projectId) => String(project?.id) === String(projectId)),
|
|
46
|
-
"project:write": ({ project, targetProjectIds }) => targetProjectIds?.every((projectId) => String(project?.id) === String(projectId)),
|
|
47
|
-
"project:admin": ({ project, targetProjectIds }) => targetProjectIds?.every((projectId) => String(project?.id) === String(projectId)),
|
|
48
|
-
"tag:read": ({ project, targetTags }) => targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),
|
|
49
|
-
"tag:write": ({ project, targetTags }) => targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),
|
|
50
|
-
"tag:admin": ({ project, targetTags }) => targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),
|
|
51
|
-
"user:write": ({ project, targetUsers }) => targetUsers.every((targetUser) => project?.membersIds?.map(String).includes(String(targetUser?.id))),
|
|
52
|
-
"dictionary:read": ({ project, user }) => project?.adminsIds?.map(String).includes(String(user?.id)),
|
|
53
|
-
"dictionary:write": ({ project, user }) => project?.adminsIds?.map(String).includes(String(user?.id)),
|
|
54
|
-
"dictionary:admin": ({ project, user }) => project?.adminsIds?.map(String).includes(String(user?.id))
|
|
55
|
-
},
|
|
56
|
-
project_user: {
|
|
57
|
-
"project:read": ({ user, organization, project }) => String(organization?.id) === String(project?.organizationId) && organization?.membersIds?.map(String).includes(String(user?.id)) && project?.membersIds?.map(String).includes(String(user?.id)),
|
|
58
|
-
"dictionary:read": ({ user, project, targetDictionaries }) => project?.membersIds?.map(String).includes(String(user?.id)) && targetDictionaries.every((dictionary) => dictionary?.projectIds?.map(String).includes(String(project?.id))),
|
|
59
|
-
"dictionary:write": ({ user, project }) => project?.adminsIds?.map(String).includes(String(user?.id)),
|
|
60
|
-
"tag:read": ({ project, targetTags, user }) => project?.membersIds?.map(String).includes(String(user?.id)) && targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),
|
|
61
|
-
"tag:write": ({ project, targetTags, user }) => project?.membersIds?.map(String).includes(String(user?.id)) && targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),
|
|
62
|
-
"tag:admin": ({ user, project, targetTags }) => project?.adminsIds?.map(String).includes(String(user?.id)) && targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),
|
|
63
|
-
"user:read": ({ project, targetUsers }) => targetUsers.every((targetUser) => project?.membersIds?.map(String).includes(String(targetUser?.id)))
|
|
64
|
-
},
|
|
65
|
-
project_reviewer: {
|
|
66
|
-
"dictionary:read": ({ user, project }) => project?.membersIds?.map(String).includes(String(user?.id)),
|
|
67
|
-
"dictionary:write": ({ user, project }) => project?.membersIds?.map(String).includes(String(user?.id)),
|
|
68
|
-
"tag:read": () => true
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
const getSessionRoles = ({ user, organization, project }) => {
|
|
72
|
-
const roles = [];
|
|
73
|
-
if (!user) return roles;
|
|
74
|
-
roles.push("user");
|
|
75
|
-
if (user.role === "admin") roles.push("admin");
|
|
76
|
-
if (!organization) return roles;
|
|
77
|
-
if (organization.adminsIds?.map(String).includes(String(user?.id))) roles.push("org_admin");
|
|
78
|
-
if (organization.membersIds?.map(String).includes(String(user?.id))) roles.push("org_user");
|
|
79
|
-
if (!project) return roles;
|
|
80
|
-
if (project.adminsIds?.map(String).includes(String(user?.id))) roles.push("project_admin");
|
|
81
|
-
if (project?.membersIds?.map(String).includes(String(user?.id))) roles.push("project_user");
|
|
82
|
-
return roles;
|
|
83
|
-
};
|
|
84
|
-
const computeEffectivePermission = (roles) => Array.from(new Set(roles.flatMap((role) => Object.keys(ROLE_POLICY[role]))));
|
|
85
|
-
/**
|
|
86
|
-
* Intersect two permission lists
|
|
87
|
-
* @param permissionList1 - The first permission list
|
|
88
|
-
* @param permissionList2 - The second permission list
|
|
89
|
-
* @returns The intersection of the two permission lists (only permissions present in both)
|
|
90
|
-
*/
|
|
91
|
-
const intersectPermissions = (permissions1, permissions2) => permissions1.filter((permission) => permissions2.includes(permission));
|
|
92
|
-
const hasPermission = (roles, permission) => {
|
|
93
|
-
const rolesCheck = roles.map((role) => ROLE_POLICY[role]?.[permission] ?? (() => false));
|
|
94
|
-
return ((args) => rolesCheck.some((check) => check(args)));
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
//#endregion
|
|
98
|
-
exports.ROLE_POLICY = ROLE_POLICY;
|
|
99
|
-
exports.computeEffectivePermission = computeEffectivePermission;
|
|
100
|
-
exports.getSessionRoles = getSessionRoles;
|
|
101
|
-
exports.hasPermission = hasPermission;
|
|
102
|
-
exports.intersectPermissions = intersectPermissions;
|
|
103
|
-
//# sourceMappingURL=permissions.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.cjs","names":["roles: Roles[]","rolesCheck: any"],"sources":["../../../src/utils/permissions.ts"],"sourcesContent":["import type { Dictionary, DictionaryAPI } from '@/types/dictionary.types';\nimport type { Organization, OrganizationAPI } from '@/types/organization.types';\nimport type { Project, ProjectAPI } from '@/types/project.types';\nimport type { SessionContext } from '@/types/session.types';\nimport type { Tag, TagAPI } from '@/types/tag.types';\nimport type { User, UserAPI } from '@/types/user.types';\n\n/**\n * A named grouping of privileges (e.g. `\"org_admin\"`).\n * Users are *granted* one or more Roles.\n */\nexport type Roles =\n | 'user'\n | 'admin'\n | 'org_admin'\n | 'org_user'\n | 'project_admin'\n | 'project_user'\n | 'project_reviewer';\n\n/**\n * An atomic operation that can be performed on a resource.\n * - **read**: view or list\n * - **write**: create or update\n * - **admin**: delete or change permissions\n */\nexport type Action = 'read' | 'write' | 'admin';\n\n/**\n * A first‑class entity in your domain model that you want to protect.\n */\nexport type Resource = {\n organization: Organization;\n project: Project;\n dictionary: Dictionary;\n tag: Tag;\n user: User;\n};\n\n/**\n * A literal string combining a Resource and an Action, e.g. `\"project:write\"`.\n * This is the *unit* checked at runtime in your middleware.\n */\nexport type Permission = `${keyof Resource}:${Action}`;\n\ntype CheckPrivilege = (\n args: any\n) => boolean | undefined | Promise<boolean> | Promise<undefined>;\n\ntype RolePolicy = Record<Roles, Partial<Record<Permission, CheckPrivilege>>>;\n\nexport const ROLE_POLICY = {\n admin: {\n 'organization:read': () => true,\n 'organization:write': () => true,\n 'organization:admin': () => true,\n 'project:read': () => true,\n 'project:write': () => true,\n 'project:admin': () => true,\n 'dictionary:read': () => true,\n 'dictionary:write': () => true,\n 'dictionary:admin': () => true,\n 'tag:read': () => true,\n 'tag:write': () => true,\n 'tag:admin': () => true,\n 'user:read': () => true,\n 'user:write': () => true,\n 'user:admin': () => true,\n },\n user: {\n 'user:read': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'user:write': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'user:admin': ({\n user,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every(\n (targetUser) =>\n String(targetUser.id) === String(user?.id) &&\n targetUser.email === user?.email\n ),\n 'organization:read': ({\n user,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every((organization) =>\n organization?.membersIds?.map(String).includes(String(user?.id))\n ),\n },\n org_admin: {\n 'organization:read': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n 'organization:write': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n 'organization:admin': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n\n 'project:read': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'project:write': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'project:admin': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n\n 'tag:read': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'tag:write': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n 'tag:admin': ({ organization, project }: SessionContext) =>\n String(project?.organizationId) === String(organization?.id),\n\n 'user:write': ({\n organization,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n organization?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n org_user: {\n 'organization:read': ({\n organization,\n targetOrganizations,\n }: SessionContext & {\n targetOrganizations: (Organization | OrganizationAPI)[];\n }) =>\n targetOrganizations.every(\n (targetOrg) => String(targetOrg.id) === String(organization?.id)\n ),\n\n 'project:read': ({\n user,\n targetProjects,\n }: SessionContext & {\n targetProjects: (Project | ProjectAPI)[];\n }) =>\n targetProjects?.every((project) =>\n project?.membersIds?.map(String).includes(String(user?.id))\n ),\n\n 'user:read': ({\n organization,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n organization?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n project_admin: {\n 'project:read': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n 'project:write': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n 'project:admin': ({\n project,\n targetProjectIds,\n }: SessionContext & {\n targetProjectIds?: (Project | ProjectAPI)['id'][];\n }) =>\n targetProjectIds?.every(\n (projectId) => String(project?.id) === String(projectId)\n ),\n\n 'tag:read': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:write': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:admin': ({\n project,\n targetTags,\n }: SessionContext & { targetTags: (Tag | TagAPI)[] }) =>\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n\n 'user:write': ({\n project,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n project?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n\n 'dictionary:read': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n 'dictionary:write': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n 'dictionary:admin': ({ project, user }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n },\n project_user: {\n 'project:read': ({ user, organization, project }: SessionContext) =>\n String(organization?.id) === String(project?.organizationId) &&\n organization?.membersIds?.map(String).includes(String(user?.id)) &&\n project?.membersIds?.map(String).includes(String(user?.id)),\n\n 'dictionary:read': ({\n user,\n project,\n targetDictionaries,\n }: SessionContext & {\n targetDictionaries: (Dictionary | DictionaryAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetDictionaries.every((dictionary) =>\n dictionary?.projectIds?.map(String).includes(String(project?.id))\n ),\n 'dictionary:write': ({ user, project }: SessionContext) =>\n project?.adminsIds?.map(String).includes(String(user?.id)),\n\n 'tag:read': ({\n project,\n targetTags,\n user,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:write': ({\n project,\n targetTags,\n user,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.membersIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n 'tag:admin': ({\n user,\n project,\n targetTags,\n }: SessionContext & {\n targetTags: (Tag | TagAPI)[];\n }) =>\n project?.adminsIds?.map(String).includes(String(user?.id)) &&\n targetTags.every((tag) => String(project?.id) === String(tag?.projectId)),\n\n 'user:read': ({\n project,\n targetUsers,\n }: SessionContext & { targetUsers: (User | UserAPI)[] }) =>\n targetUsers.every((targetUser) =>\n project?.membersIds?.map(String).includes(String(targetUser?.id))\n ),\n },\n project_reviewer: {\n 'dictionary:read': ({ user, project }: SessionContext) =>\n project?.membersIds?.map(String).includes(String(user?.id)),\n 'dictionary:write': ({ user, project }: SessionContext) =>\n project?.membersIds?.map(String).includes(String(user?.id)),\n\n 'tag:read': () => true,\n },\n} as const satisfies RolePolicy;\n\nexport const getSessionRoles = ({\n user,\n organization,\n project,\n}: SessionContext): Roles[] => {\n const roles: Roles[] = [];\n\n if (!user) {\n return roles;\n }\n\n roles.push('user');\n\n const isUserAdmin = user.role === 'admin';\n\n if (isUserAdmin) {\n roles.push('admin');\n }\n\n if (!organization) {\n return roles;\n }\n\n const isOrganizationAdmin = organization.adminsIds\n ?.map(String)\n .includes(String(user?.id));\n\n if (isOrganizationAdmin) {\n roles.push('org_admin');\n }\n\n const isOrganizationMember = organization.membersIds\n ?.map(String)\n .includes(String(user?.id));\n\n if (isOrganizationMember) {\n roles.push('org_user');\n }\n\n if (!project) {\n return roles;\n }\n\n const isProjectAdmin = project.adminsIds\n ?.map(String)\n .includes(String(user?.id));\n\n if (isProjectAdmin) {\n roles.push('project_admin');\n }\n\n const isProjectMember = project?.membersIds\n ?.map(String)\n .includes(String(user?.id));\n\n if (isProjectMember) {\n roles.push('project_user');\n }\n\n // const isProjectReviewer =\n // session.project?.reviewersIds?.includes(session.user!.id);\n\n // if (isProjectReviewer) {\n // roles.push('project_reviewer');\n // }\n\n return roles;\n};\n\nexport const computeEffectivePermission = (roles: Roles[]): Permission[] =>\n Array.from(\n new Set(\n roles.flatMap((role) => Object.keys(ROLE_POLICY[role]) as Permission[])\n )\n );\n\n/**\n * Intersect two permission lists\n * @param permissionList1 - The first permission list\n * @param permissionList2 - The second permission list\n * @returns The intersection of the two permission lists (only permissions present in both)\n */\nexport const intersectPermissions = (\n permissions1: Permission[],\n permissions2: Permission[]\n): Permission[] =>\n permissions1.filter((permission) => permissions2.includes(permission));\n\ntype PermissionResult<\n R extends Roles,\n P extends Permission,\n> = (typeof ROLE_POLICY)[R] extends infer RolePerms\n ? RolePerms extends Record<string, (args: any) => any>\n ? P extends keyof RolePerms\n ? RolePerms[P] extends undefined\n ? never\n : RolePerms[P]\n : never\n : never\n : never;\n\nexport const hasPermission = <P extends Permission>(\n roles: Roles[],\n permission: P\n): PermissionResult<Roles, P> => {\n const rolesCheck: any = roles.map(\n (role) =>\n ROLE_POLICY[role]?.[\n permission as keyof (typeof ROLE_POLICY)[typeof role]\n ] ?? (() => false)\n ) as unknown as PermissionResult<Roles, P>[];\n\n return ((args: any) => rolesCheck.some((check: any) => check(args))) as any;\n};\n"],"mappings":"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"}
|
package/dist/cjs/utils/plan.cjs
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/utils/plan.ts
|
|
3
|
-
/**
|
|
4
|
-
* Retrieves the plan type based on the price ID.
|
|
5
|
-
* @param priceId - The price ID to retrieve the plan type from.
|
|
6
|
-
* @returns The plan type and period.
|
|
7
|
-
*/
|
|
8
|
-
const retrievePlanInformation = (priceId) => {
|
|
9
|
-
switch (priceId) {
|
|
10
|
-
case process.env.STRIPE_PREMIUM_YEARLY_PRICE_ID: return {
|
|
11
|
-
period: "YEARLY",
|
|
12
|
-
type: "PREMIUM"
|
|
13
|
-
};
|
|
14
|
-
case process.env.STRIPE_PREMIUM_MONTHLY_PRICE_ID: return {
|
|
15
|
-
period: "MONTHLY",
|
|
16
|
-
type: "PREMIUM"
|
|
17
|
-
};
|
|
18
|
-
case process.env.STRIPE_ENTERPRISE_YEARLY_PRICE_ID: return {
|
|
19
|
-
period: "YEARLY",
|
|
20
|
-
type: "ENTERPRISE"
|
|
21
|
-
};
|
|
22
|
-
case process.env.STRIPE_ENTERPRISE_MONTHLY_PRICE_ID: return {
|
|
23
|
-
period: "MONTHLY",
|
|
24
|
-
type: "ENTERPRISE"
|
|
25
|
-
};
|
|
26
|
-
default: return {
|
|
27
|
-
period: void 0,
|
|
28
|
-
type: "FREE"
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
const planDetails = {
|
|
33
|
-
FREE: {
|
|
34
|
-
numberOfOrganizationUsers: 1,
|
|
35
|
-
numberOfProjects: 1,
|
|
36
|
-
totalStorage: 100,
|
|
37
|
-
SeoAI: false,
|
|
38
|
-
contentAI: false
|
|
39
|
-
},
|
|
40
|
-
PREMIUM: {
|
|
41
|
-
numberOfOrganizationUsers: 20,
|
|
42
|
-
numberOfProjects: 10,
|
|
43
|
-
totalStorage: 500,
|
|
44
|
-
SeoAI: false,
|
|
45
|
-
contentAI: true
|
|
46
|
-
},
|
|
47
|
-
ENTERPRISE: {
|
|
48
|
-
numberOfOrganizationUsers: void 0,
|
|
49
|
-
numberOfProjects: void 0,
|
|
50
|
-
totalStorage: void 0,
|
|
51
|
-
SeoAI: true,
|
|
52
|
-
contentAI: true
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
const getPlanDetails = (plan) => {
|
|
56
|
-
if (plan?.status !== "active") return planDetails.FREE;
|
|
57
|
-
return planDetails[plan.type];
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
//#endregion
|
|
61
|
-
exports.getPlanDetails = getPlanDetails;
|
|
62
|
-
exports.retrievePlanInformation = retrievePlanInformation;
|
|
63
|
-
//# sourceMappingURL=plan.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan.cjs","names":["planDetails: Record<Plan['type'], PlanDetails>"],"sources":["../../../src/utils/plan.ts"],"sourcesContent":["import type { Plan } from '@/types/plan.types';\n\n/**\n * Retrieves the plan type based on the price ID.\n * @param priceId - The price ID to retrieve the plan type from.\n * @returns The plan type and period.\n */\nexport const retrievePlanInformation = (\n priceId: string\n): Pick<Plan, 'period' | 'type'> => {\n switch (priceId) {\n case process.env.STRIPE_PREMIUM_YEARLY_PRICE_ID!:\n return { period: 'YEARLY', type: 'PREMIUM' };\n case process.env.STRIPE_PREMIUM_MONTHLY_PRICE_ID!:\n return { period: 'MONTHLY', type: 'PREMIUM' };\n case process.env.STRIPE_ENTERPRISE_YEARLY_PRICE_ID!:\n return { period: 'YEARLY', type: 'ENTERPRISE' };\n case process.env.STRIPE_ENTERPRISE_MONTHLY_PRICE_ID!:\n return { period: 'MONTHLY', type: 'ENTERPRISE' };\n default:\n return { period: undefined, type: 'FREE' };\n }\n};\n\ntype PlanDetails = {\n numberOfOrganizationUsers?: number;\n numberOfProjects?: number;\n totalStorage?: number;\n SeoAI: boolean;\n contentAI: boolean;\n};\n\nconst planDetails: Record<Plan['type'], PlanDetails> = {\n FREE: {\n numberOfOrganizationUsers: 1,\n numberOfProjects: 1,\n totalStorage: 100, // 100 MB\n SeoAI: false,\n contentAI: false,\n },\n PREMIUM: {\n numberOfOrganizationUsers: 20,\n numberOfProjects: 10,\n totalStorage: 500, // 500 MB\n SeoAI: false,\n contentAI: true,\n },\n ENTERPRISE: {\n numberOfOrganizationUsers: undefined,\n numberOfProjects: undefined,\n totalStorage: undefined,\n SeoAI: true,\n contentAI: true,\n },\n};\n\nexport const getPlanDetails = (plan?: Plan): PlanDetails => {\n if (plan?.status !== 'active') {\n return planDetails.FREE;\n }\n\n return planDetails[plan.type];\n};\n"],"mappings":";;;;;;;AAOA,MAAa,2BACX,YACkC;AAClC,SAAQ,SAAR;EACE,KAAK,QAAQ,IAAI,+BACf,QAAO;GAAE,QAAQ;GAAU,MAAM;GAAW;EAC9C,KAAK,QAAQ,IAAI,gCACf,QAAO;GAAE,QAAQ;GAAW,MAAM;GAAW;EAC/C,KAAK,QAAQ,IAAI,kCACf,QAAO;GAAE,QAAQ;GAAU,MAAM;GAAc;EACjD,KAAK,QAAQ,IAAI,mCACf,QAAO;GAAE,QAAQ;GAAW,MAAM;GAAc;EAClD,QACE,QAAO;GAAE,QAAQ;GAAW,MAAM;GAAQ;;;AAYhD,MAAMA,cAAiD;CACrD,MAAM;EACJ,2BAA2B;EAC3B,kBAAkB;EAClB,cAAc;EACd,OAAO;EACP,WAAW;EACZ;CACD,SAAS;EACP,2BAA2B;EAC3B,kBAAkB;EAClB,cAAc;EACd,OAAO;EACP,WAAW;EACZ;CACD,YAAY;EACV,2BAA2B;EAC3B,kBAAkB;EAClB,cAAc;EACd,OAAO;EACP,WAAW;EACZ;CACF;AAED,MAAa,kBAAkB,SAA6B;AAC1D,KAAI,MAAM,WAAW,SACnB,QAAO,YAAY;AAGrB,QAAO,YAAY,KAAK"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
-
const require_utils_errors_ErrorHandler = require('./errors/ErrorHandler.cjs');
|
|
3
|
-
let express_rate_limit = require("express-rate-limit");
|
|
4
|
-
express_rate_limit = require_rolldown_runtime.__toESM(express_rate_limit);
|
|
5
|
-
|
|
6
|
-
//#region src/utils/rateLimiter.ts
|
|
7
|
-
const ipLimiterOptions = {
|
|
8
|
-
windowMs: 60 * 1e3,
|
|
9
|
-
limit: 500,
|
|
10
|
-
standardHeaders: "draft-8",
|
|
11
|
-
legacyHeaders: false,
|
|
12
|
-
keyGenerator: (req) => {
|
|
13
|
-
return (0, express_rate_limit.ipKeyGenerator)(req.ip ?? req.socket?.remoteAddress ?? "unknown");
|
|
14
|
-
},
|
|
15
|
-
handler: (req, res) => {
|
|
16
|
-
const { limit, remaining, resetTime } = req.rateLimit;
|
|
17
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "RATE_LIMIT_EXCEEDED", {
|
|
18
|
-
limit: `${limit} per minute`,
|
|
19
|
-
retryAfter: Math.ceil((resetTime?.getTime() - Date.now()) / 1e3),
|
|
20
|
-
remaining
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
const ipLimiter = (0, express_rate_limit.default)(ipLimiterOptions);
|
|
25
|
-
const unauthenticatedChatBotLimiterOptions = {
|
|
26
|
-
windowMs: 3600 * 1e3,
|
|
27
|
-
limit: 3,
|
|
28
|
-
standardHeaders: "draft-8",
|
|
29
|
-
skip: (_req, res) => Boolean(res.locals.user),
|
|
30
|
-
legacyHeaders: false,
|
|
31
|
-
keyGenerator: (req) => {
|
|
32
|
-
return (0, express_rate_limit.ipKeyGenerator)(req.ip ?? req.socket?.remoteAddress ?? "unknown");
|
|
33
|
-
},
|
|
34
|
-
handler: (req, res) => {
|
|
35
|
-
const { limit, remaining, resetTime } = req.rateLimit;
|
|
36
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "RATE_LIMIT_EXCEEDED_UNAUTHENTICATED", {
|
|
37
|
-
limit: `${limit} per hour`,
|
|
38
|
-
retryAfter: Math.ceil((resetTime?.getTime() - Date.now()) / 1e3),
|
|
39
|
-
remaining
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const unauthenticatedChatBotLimiter = (0, express_rate_limit.default)(unauthenticatedChatBotLimiterOptions);
|
|
44
|
-
|
|
45
|
-
//#endregion
|
|
46
|
-
exports.ipLimiter = ipLimiter;
|
|
47
|
-
exports.unauthenticatedChatBotLimiter = unauthenticatedChatBotLimiter;
|
|
48
|
-
//# sourceMappingURL=rateLimiter.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimiter.cjs","names":["ipLimiterOptions: Partial<Options>","ipLimiter: any","unauthenticatedChatBotLimiterOptions: Partial<Options>","unauthenticatedChatBotLimiter: any"],"sources":["../../../src/utils/rateLimiter.ts"],"sourcesContent":["import type { Response } from 'express';\nimport rateLimit, {\n ipKeyGenerator,\n type Options,\n type RateLimitRequestHandler,\n} from 'express-rate-limit';\nimport { ErrorHandler } from './errors';\n\n// -------------------------------------------------------------\n// Create the rate-limiter instances once at module load-time so\n// that the hit counters are shared across every incoming request.\n// -------------------------------------------------------------\n\nconst ipLimiterOptions: Partial<Options> = {\n windowMs: 60 * 1000, // 1-minute window\n limit: 500, // 500 requests / IP / window\n standardHeaders: 'draft-8',\n legacyHeaders: false,\n // Use a custom key generator that handles proxy headers securely\n keyGenerator: (req) => {\n // Normalize IPv6 to subnet using helper to avoid bypasses\n return ipKeyGenerator(req.ip ?? req.socket?.remoteAddress ?? 'unknown');\n },\n handler: (req, res) => {\n const { limit, remaining, resetTime } = (req as any).rateLimit;\n\n ErrorHandler.handleGenericErrorResponse(\n res as unknown as Response,\n 'RATE_LIMIT_EXCEEDED',\n {\n limit: `${limit} per minute`,\n retryAfter: Math.ceil((resetTime?.getTime() - Date.now()) / 1000),\n remaining,\n }\n );\n },\n};\n\n// Fix type error of express-rate-limit\nexport const ipLimiter: any = rateLimit(\n ipLimiterOptions\n) satisfies RateLimitRequestHandler;\n\nconst unauthenticatedChatBotLimiterOptions: Partial<Options> = {\n windowMs: 60 * 60 * 1000, // 1-hour window\n limit: 3, // 3 requests / IP / window\n standardHeaders: 'draft-8',\n skip: (_req, res) => Boolean(res.locals.user), // authenticated? then skip\n legacyHeaders: false,\n // Use a custom key generator that handles proxy headers securely\n keyGenerator: (req) => {\n // Normalize IPv6 to subnet using helper to avoid bypasses\n return ipKeyGenerator(req.ip ?? req.socket?.remoteAddress ?? 'unknown');\n },\n handler: (req, res) => {\n const { limit, remaining, resetTime } = (req as any).rateLimit;\n\n ErrorHandler.handleGenericErrorResponse(\n res as unknown as Response,\n 'RATE_LIMIT_EXCEEDED_UNAUTHENTICATED',\n {\n limit: `${limit} per hour`,\n retryAfter: Math.ceil((resetTime?.getTime() - Date.now()) / 1000),\n remaining,\n }\n );\n },\n};\n\n// Fix type error of express-rate-limit\nexport const unauthenticatedChatBotLimiter: any = rateLimit(\n unauthenticatedChatBotLimiterOptions\n) satisfies RateLimitRequestHandler;\n"],"mappings":";;;;;;AAaA,MAAMA,mBAAqC;CACzC,UAAU,KAAK;CACf,OAAO;CACP,iBAAiB;CACjB,eAAe;CAEf,eAAe,QAAQ;AAErB,gDAAsB,IAAI,MAAM,IAAI,QAAQ,iBAAiB,UAAU;;CAEzE,UAAU,KAAK,QAAQ;EACrB,MAAM,EAAE,OAAO,WAAW,cAAe,IAAY;AAErD,iDAAa,2BACX,KACA,uBACA;GACE,OAAO,GAAG,MAAM;GAChB,YAAY,KAAK,MAAM,WAAW,SAAS,GAAG,KAAK,KAAK,IAAI,IAAK;GACjE;GACD,CACF;;CAEJ;AAGD,MAAaC,4CACX,iBACD;AAED,MAAMC,uCAAyD;CAC7D,UAAU,OAAU;CACpB,OAAO;CACP,iBAAiB;CACjB,OAAO,MAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK;CAC7C,eAAe;CAEf,eAAe,QAAQ;AAErB,gDAAsB,IAAI,MAAM,IAAI,QAAQ,iBAAiB,UAAU;;CAEzE,UAAU,KAAK,QAAQ;EACrB,MAAM,EAAE,OAAO,WAAW,cAAe,IAAY;AAErD,iDAAa,2BACX,KACA,uCACA;GACE,OAAO,GAAG,MAAM;GAChB,YAAY,KAAK,MAAM,WAAW,SAAS,GAAG,KAAK,KAAK,IAAI,IAAK;GACjE;GACD,CACF;;CAEJ;AAGD,MAAaC,gEACX,qCACD"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/utils/removeObjectKeys.ts
|
|
3
|
-
const removeObjectKeys = (obj, keys) => {
|
|
4
|
-
const result = { ...obj };
|
|
5
|
-
for (const key of keys) delete result[key];
|
|
6
|
-
return result;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
//#endregion
|
|
10
|
-
exports.removeObjectKeys = removeObjectKeys;
|
|
11
|
-
//# sourceMappingURL=removeObjectKeys.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"removeObjectKeys.cjs","names":[],"sources":["../../../src/utils/removeObjectKeys.ts"],"sourcesContent":["export const removeObjectKeys = <\n T extends Record<string, unknown>,\n K extends (keyof T)[],\n>(\n obj: T,\n keys: K\n): Omit<T, K[number]> => {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n\n return result;\n};\n"],"mappings":";;AAAA,MAAa,oBAIX,KACA,SACuB;CACvB,MAAM,SAAS,EAAE,GAAG,KAAK;AACzB,MAAK,MAAM,OAAO,KAChB,QAAO,OAAO;AAGhB,QAAO"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
const require_utils_httpStatusCodes = require('./httpStatusCodes.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/responseData.ts
|
|
4
|
-
const isSuccessStatus = (status) => status === require_utils_httpStatusCodes.HttpStatusCodes.OK_200 || status === require_utils_httpStatusCodes.HttpStatusCodes.CREATED_201 || status === require_utils_httpStatusCodes.HttpStatusCodes.ACCEPTED_202 || status === require_utils_httpStatusCodes.HttpStatusCodes.NON_AUTHORITATIVE_INFORMATION_203 || status === require_utils_httpStatusCodes.HttpStatusCodes.NO_CONTENT_204 || status === require_utils_httpStatusCodes.HttpStatusCodes.RESET_CONTENT_205 || status === require_utils_httpStatusCodes.HttpStatusCodes.PARTIAL_CONTENT_206 || status === require_utils_httpStatusCodes.HttpStatusCodes.MULTI_STATUS_207 || status === require_utils_httpStatusCodes.HttpStatusCodes.ALREADY_REPORTED_208 || status === require_utils_httpStatusCodes.HttpStatusCodes.IM_USED_226;
|
|
5
|
-
function formatResponse({ message, description, data, error, status = require_utils_httpStatusCodes.HttpStatusCodes.OK_200 }) {
|
|
6
|
-
return {
|
|
7
|
-
success: isSuccessStatus(status),
|
|
8
|
-
message: message ?? void 0,
|
|
9
|
-
description: description ?? void 0,
|
|
10
|
-
data: data ?? null,
|
|
11
|
-
error: error ?? void 0,
|
|
12
|
-
status
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
function formatPaginatedResponse({ status = require_utils_httpStatusCodes.HttpStatusCodes.OK_200, message, description, data, error, page, pageSize, totalPages, totalItems }) {
|
|
16
|
-
return {
|
|
17
|
-
success: isSuccessStatus(status),
|
|
18
|
-
message: message ?? void 0,
|
|
19
|
-
description: description ?? void 0,
|
|
20
|
-
data: data ?? null,
|
|
21
|
-
error: error ?? void 0,
|
|
22
|
-
status,
|
|
23
|
-
page: page ?? null,
|
|
24
|
-
page_size: pageSize ?? null,
|
|
25
|
-
total_pages: totalPages ?? null,
|
|
26
|
-
total_items: totalItems ?? null
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
//#endregion
|
|
31
|
-
exports.formatPaginatedResponse = formatPaginatedResponse;
|
|
32
|
-
exports.formatResponse = formatResponse;
|
|
33
|
-
//# sourceMappingURL=responseData.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"responseData.cjs","names":["HttpStatusCodes"],"sources":["../../../src/utils/responseData.ts"],"sourcesContent":["import { HttpStatusCodes } from '@utils/httpStatusCodes';\n\ntype ErrorData = {\n code: string;\n title: string;\n message: string;\n} & object;\n\nexport type ResponseData<T = null> = {\n message?: string;\n description?: string;\n success: boolean;\n status: HttpStatusCodes;\n data: T | null;\n error?: ErrorData | ErrorData[];\n};\n\ntype ValidResponseStatus =\n | HttpStatusCodes.OK_200\n | HttpStatusCodes.CREATED_201\n | HttpStatusCodes.ACCEPTED_202\n | HttpStatusCodes.NON_AUTHORITATIVE_INFORMATION_203\n | HttpStatusCodes.NO_CONTENT_204\n | HttpStatusCodes.RESET_CONTENT_205\n | HttpStatusCodes.PARTIAL_CONTENT_206\n | HttpStatusCodes.MULTI_STATUS_207\n | HttpStatusCodes.ALREADY_REPORTED_208\n | HttpStatusCodes.IM_USED_226;\n\ntype SuccessResponseArgs<T = undefined> = {\n message?: string;\n description?: string;\n data: T;\n status?: ValidResponseStatus;\n error?: null;\n};\n\ntype ErrorResponseArgs = {\n error: ErrorData | ErrorData[];\n status: HttpStatusCodes;\n data?: null;\n message?: null;\n description?: null;\n};\n\nconst isSuccessStatus = (\n status: HttpStatusCodes\n): status is HttpStatusCodes.OK_200 =>\n status === HttpStatusCodes.OK_200 ||\n status === HttpStatusCodes.CREATED_201 ||\n status === HttpStatusCodes.ACCEPTED_202 ||\n status === HttpStatusCodes.NON_AUTHORITATIVE_INFORMATION_203 ||\n status === HttpStatusCodes.NO_CONTENT_204 ||\n status === HttpStatusCodes.RESET_CONTENT_205 ||\n status === HttpStatusCodes.PARTIAL_CONTENT_206 ||\n status === HttpStatusCodes.MULTI_STATUS_207 ||\n status === HttpStatusCodes.ALREADY_REPORTED_208 ||\n status === HttpStatusCodes.IM_USED_226;\n\nexport function formatResponse<T>({\n message,\n description,\n data,\n status,\n}: SuccessResponseArgs<T>): ResponseData<T>;\nexport function formatResponse<T>({\n error,\n status,\n}: ErrorResponseArgs): ResponseData<T>;\nexport function formatResponse<T>({\n message,\n description,\n data,\n error,\n status = HttpStatusCodes.OK_200,\n}: SuccessResponseArgs<T> | ErrorResponseArgs): ResponseData<T> {\n const success = isSuccessStatus(status);\n\n return {\n success,\n message: message ?? undefined,\n description: description ?? undefined,\n data: data ?? null,\n error: error ?? undefined,\n status,\n };\n}\n\nexport type PaginatedResponse<T = undefined> = Omit<ResponseData<T>, 'data'> & {\n data: T[] | null;\n page: number | null;\n page_size: number | null;\n total_pages: number | null;\n total_items: number | null;\n};\n\ntype SuccessPaginatedResponseArgs<T = undefined> = {\n message?: string;\n description?: string;\n data: T[];\n status?: ValidResponseStatus;\n page: number;\n pageSize: number;\n totalPages: number;\n totalItems: number;\n\n error?: null;\n};\n\ntype ErrorPaginatedResponseArgs = {\n error: ErrorData | ErrorData[];\n status: HttpStatusCodes;\n\n message?: null;\n description?: null;\n data?: null;\n\n page?: null;\n pageSize?: null;\n totalPages?: null;\n totalItems?: null;\n};\n\nexport function formatPaginatedResponse<T>({\n message,\n description,\n data,\n status,\n page,\n pageSize,\n totalPages,\n totalItems,\n}: SuccessPaginatedResponseArgs<T>): PaginatedResponse<T>;\nexport function formatPaginatedResponse<T>({\n error,\n status,\n}: ErrorPaginatedResponseArgs): PaginatedResponse<T>;\nexport function formatPaginatedResponse<T>({\n status = HttpStatusCodes.OK_200,\n message,\n description,\n data,\n error,\n page,\n pageSize,\n totalPages,\n totalItems,\n}:\n | SuccessPaginatedResponseArgs<T>\n | ErrorPaginatedResponseArgs): PaginatedResponse<T> {\n const success = isSuccessStatus(status);\n\n return {\n success,\n message: message ?? undefined,\n description: description ?? undefined,\n data: data ?? null,\n error: error ?? undefined,\n status,\n page: page ?? null,\n page_size: pageSize ?? null,\n total_pages: totalPages ?? null,\n total_items: totalItems ?? null,\n };\n}\n"],"mappings":";;;AA6CA,MAAM,mBACJ,WAEA,WAAWA,8CAAgB,UAC3B,WAAWA,8CAAgB,eAC3B,WAAWA,8CAAgB,gBAC3B,WAAWA,8CAAgB,qCAC3B,WAAWA,8CAAgB,kBAC3B,WAAWA,8CAAgB,qBAC3B,WAAWA,8CAAgB,uBAC3B,WAAWA,8CAAgB,oBAC3B,WAAWA,8CAAgB,wBAC3B,WAAWA,8CAAgB;AAY7B,SAAgB,eAAkB,EAChC,SACA,aACA,MACA,OACA,SAASA,8CAAgB,UACqC;AAG9D,QAAO;EACL,SAHc,gBAAgB,OAAO;EAIrC,SAAS,WAAW;EACpB,aAAa,eAAe;EAC5B,MAAM,QAAQ;EACd,OAAO,SAAS;EAChB;EACD;;AAoDH,SAAgB,wBAA2B,EACzC,SAASA,8CAAgB,QACzB,SACA,aACA,MACA,OACA,MACA,UACA,YACA,cAGoD;AAGpD,QAAO;EACL,SAHc,gBAAgB,OAAO;EAIrC,SAAS,WAAW;EACpB,aAAa,eAAe;EAC5B,MAAM,QAAQ;EACd,OAAO,SAAS;EAChB;EACA,MAAM,QAAQ;EACd,WAAW,YAAY;EACvB,aAAa,cAAc;EAC3B,aAAa,cAAc;EAC5B"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/utils/validation/validateArray.ts
|
|
3
|
-
/**
|
|
4
|
-
* Validates a email field.
|
|
5
|
-
* @param value The value to validate.
|
|
6
|
-
* @param entityName The name of the entity being validated.
|
|
7
|
-
* @param minLength The minimum length of the string.
|
|
8
|
-
* @param maxLength The maximum length of the string.
|
|
9
|
-
* @returns An array of validation errors.
|
|
10
|
-
*/
|
|
11
|
-
const validateArray = (value, entityName = "Array", elementType, elementValidator, minLength = 0, maxLength = void 0) => {
|
|
12
|
-
const errors = [];
|
|
13
|
-
if (!Array.isArray(value)) errors.push(`${entityName} must be an array.`);
|
|
14
|
-
else if (minLength && value.length < minLength) errors.push(`${entityName} must be at least ${minLength} items long.`);
|
|
15
|
-
else if (maxLength && value.length > maxLength) errors.push(`${entityName} must be at most ${maxLength} items long.`);
|
|
16
|
-
else if (elementType) {
|
|
17
|
-
if (!value.every((element) => {
|
|
18
|
-
return typeof element === elementType;
|
|
19
|
-
})) errors.push(`${entityName} must contain only ${elementType} elements.`);
|
|
20
|
-
} else if (elementValidator) {
|
|
21
|
-
const isValidOrErrorList = value.every(elementValidator);
|
|
22
|
-
if (Array.isArray(isValidOrErrorList)) {
|
|
23
|
-
if (!(isValidOrErrorList.length > 0)) errors.push(...isValidOrErrorList);
|
|
24
|
-
} else if (!isValidOrErrorList) errors.push(`${entityName} must contain valid elements.`);
|
|
25
|
-
}
|
|
26
|
-
return errors;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
//#endregion
|
|
30
|
-
exports.validateArray = validateArray;
|
|
31
|
-
//# sourceMappingURL=validateArray.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateArray.cjs","names":["errors: string[]"],"sources":["../../../../src/utils/validation/validateArray.ts"],"sourcesContent":["type ElementType = 'string' | 'number' | 'boolean' | 'object' | 'array';\ntype ElementValidator<T> = (value: T) => boolean | string[];\n\n/**\n * Validates a email field.\n * @param value The value to validate.\n * @param entityName The name of the entity being validated.\n * @param minLength The minimum length of the string.\n * @param maxLength The maximum length of the string.\n * @returns An array of validation errors.\n */\nexport const validateArray = <T = unknown>(\n value: T[],\n entityName = 'Array',\n elementType?: ElementType,\n elementValidator?: ElementValidator<T>,\n minLength = 0,\n maxLength = undefined\n): string[] => {\n const errors: string[] = [];\n\n if (!Array.isArray(value)) {\n errors.push(`${entityName} must be an array.`);\n } else if (minLength && value.length < minLength) {\n errors.push(`${entityName} must be at least ${minLength} items long.`);\n } else if (maxLength && value.length > maxLength) {\n errors.push(`${entityName} must be at most ${maxLength} items long.`);\n } else if (elementType) {\n const isValid = value.every((element) => {\n return typeof element === elementType;\n });\n\n if (!isValid) {\n errors.push(`${entityName} must contain only ${elementType} elements.`);\n }\n } else if (elementValidator) {\n const isValidOrErrorList = value.every(elementValidator);\n\n if (Array.isArray(isValidOrErrorList)) {\n const isValid = isValidOrErrorList.length > 0;\n\n if (!isValid) {\n errors.push(...isValidOrErrorList);\n }\n } else {\n const isValid = isValidOrErrorList;\n\n if (!isValid) {\n errors.push(`${entityName} must contain valid elements.`);\n }\n }\n }\n\n return errors;\n};\n"],"mappings":";;;;;;;;;;AAWA,MAAa,iBACX,OACA,aAAa,SACb,aACA,kBACA,YAAY,GACZ,YAAY,WACC;CACb,MAAMA,SAAmB,EAAE;AAE3B,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO,KAAK,GAAG,WAAW,oBAAoB;UACrC,aAAa,MAAM,SAAS,UACrC,QAAO,KAAK,GAAG,WAAW,oBAAoB,UAAU,cAAc;UAC7D,aAAa,MAAM,SAAS,UACrC,QAAO,KAAK,GAAG,WAAW,mBAAmB,UAAU,cAAc;UAC5D,aAKT;MAAI,CAJY,MAAM,OAAO,YAAY;AACvC,UAAO,OAAO,YAAY;IAC1B,CAGA,QAAO,KAAK,GAAG,WAAW,qBAAqB,YAAY,YAAY;YAEhE,kBAAkB;EAC3B,MAAM,qBAAqB,MAAM,MAAM,iBAAiB;AAExD,MAAI,MAAM,QAAQ,mBAAmB,EAGnC;OAAI,EAFY,mBAAmB,SAAS,GAG1C,QAAO,KAAK,GAAG,mBAAmB;aAKhC,CAFY,mBAGd,QAAO,KAAK,GAAG,WAAW,+BAA+B;;AAK/D,QAAO"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
const require_utils_validation_validateArray = require('./validateArray.cjs');
|
|
2
|
-
const require_services_project_service = require('../../services/project.service.cjs');
|
|
3
|
-
|
|
4
|
-
//#region src/utils/validation/validateDictionary.ts
|
|
5
|
-
const defaultFieldsToCheck = ["projectIds"];
|
|
6
|
-
/**
|
|
7
|
-
* Validates an dictionary object.
|
|
8
|
-
* @param dictionary The dictionary object to validate.
|
|
9
|
-
* @returns An object containing the validation errors for each field.
|
|
10
|
-
*/
|
|
11
|
-
const validateDictionary = async (dictionary, fieldsToCheck = defaultFieldsToCheck) => {
|
|
12
|
-
const errors = {};
|
|
13
|
-
const fieldsToValidate = new Set(fieldsToCheck);
|
|
14
|
-
const dictionaryJSON = JSON.parse(JSON.stringify(dictionary));
|
|
15
|
-
const projects = await require_services_project_service.findProjects({ _id: dictionary.projectIds });
|
|
16
|
-
for (const field of fieldsToValidate) {
|
|
17
|
-
const value = dictionaryJSON[field];
|
|
18
|
-
errors[field] = [];
|
|
19
|
-
if (field === "projectIds") {
|
|
20
|
-
const projectsErrors = require_utils_validation_validateArray.validateArray(value, "Project", "string", (value$1) => {
|
|
21
|
-
const projectErrors = [];
|
|
22
|
-
if (typeof value$1 !== "string") projectErrors.push("Project id must be a string");
|
|
23
|
-
if (!value$1) projectErrors.push("Project id is required");
|
|
24
|
-
if (!projects) projectErrors.push("Project not found");
|
|
25
|
-
return projectsErrors;
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
if (errors[field].length === 0) delete errors[field];
|
|
29
|
-
}
|
|
30
|
-
return errors;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
//#endregion
|
|
34
|
-
exports.validateDictionary = validateDictionary;
|
|
35
|
-
//# sourceMappingURL=validateDictionary.cjs.map
|