diff --git a/apps/api/v2/package.json b/apps/api/v2/package.json index 7646daef14..628b671535 100644 --- a/apps/api/v2/package.json +++ b/apps/api/v2/package.json @@ -30,7 +30,7 @@ "@axiomhq/winston": "^1.2.0", "@calcom/platform-constants": "*", "@calcom/platform-enums": "*", - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.99", + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.110", "@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2", "@calcom/platform-types": "*", "@calcom/platform-utils": "*", @@ -91,6 +91,7 @@ "@types/supertest": "^2.0.12", "jest": "^29.7.0", "jest-date-mock": "^1.0.10", + "node-mocks-http": "^1.16.2", "prettier": "^2.8.6", "source-map-support": "^0.5.21", "supertest": "^6.3.3", diff --git a/apps/api/v2/src/ee/bookings/2024-04-15/bookings.module.ts b/apps/api/v2/src/ee/bookings/2024-04-15/bookings.module.ts index de0b63ddf3..d1ba1149e7 100644 --- a/apps/api/v2/src/ee/bookings/2024-04-15/bookings.module.ts +++ b/apps/api/v2/src/ee/bookings/2024-04-15/bookings.module.ts @@ -1,5 +1,5 @@ import { BookingsController_2024_04_15 } from "@/ee/bookings/2024-04-15/controllers/bookings.controller"; -import { ApiKeyRepository } from "@/modules/api-key/api-key-repository"; +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; import { BillingModule } from "@/modules/billing/billing.module"; import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository"; import { OAuthFlowService } from "@/modules/oauth-clients/services/oauth-flow.service"; @@ -11,7 +11,7 @@ import { Module } from "@nestjs/common"; @Module({ imports: [PrismaModule, RedisModule, TokensModule, BillingModule], - providers: [TokensRepository, OAuthFlowService, OAuthClientRepository, ApiKeyRepository], + providers: [TokensRepository, OAuthFlowService, OAuthClientRepository, ApiKeysRepository], controllers: [BookingsController_2024_04_15], }) export class BookingsModule_2024_04_15 {} diff --git a/apps/api/v2/src/ee/bookings/2024-04-15/controllers/bookings.controller.ts b/apps/api/v2/src/ee/bookings/2024-04-15/controllers/bookings.controller.ts index 20f621e6ca..9a76e59c70 100644 --- a/apps/api/v2/src/ee/bookings/2024-04-15/controllers/bookings.controller.ts +++ b/apps/api/v2/src/ee/bookings/2024-04-15/controllers/bookings.controller.ts @@ -6,7 +6,7 @@ import { GetBookingsOutput_2024_04_15 } from "@/ee/bookings/2024-04-15/outputs/g import { MarkNoShowOutput_2024_04_15 } from "@/ee/bookings/2024-04-15/outputs/mark-no-show.output"; import { hashAPIKey, isApiKey, stripApiKey } from "@/lib/api-key"; import { VERSION_2024_04_15, VERSION_2024_06_11, VERSION_2024_06_14 } from "@/lib/api-versions"; -import { ApiKeyRepository } from "@/modules/api-key/api-key-repository"; +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; import { Permissions } from "@/modules/auth/decorators/permissions/permissions.decorator"; import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; @@ -98,7 +98,7 @@ export class BookingsController_2024_04_15 { private readonly oAuthClientRepository: OAuthClientRepository, private readonly billingService: BillingService, private readonly config: ConfigService, - private readonly apiKeyRepository: ApiKeyRepository + private readonly apiKeyRepository: ApiKeysRepository ) {} @Get("/") diff --git a/apps/api/v2/src/ee/bookings/2024-08-13/bookings.module.ts b/apps/api/v2/src/ee/bookings/2024-08-13/bookings.module.ts index bd24568f4f..42b732f33c 100644 --- a/apps/api/v2/src/ee/bookings/2024-08-13/bookings.module.ts +++ b/apps/api/v2/src/ee/bookings/2024-08-13/bookings.module.ts @@ -4,7 +4,7 @@ import { BookingsService_2024_08_13 } from "@/ee/bookings/2024-08-13/services/bo import { InputBookingsService_2024_08_13 } from "@/ee/bookings/2024-08-13/services/input.service"; import { OutputBookingsService_2024_08_13 } from "@/ee/bookings/2024-08-13/services/output.service"; import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository"; -import { ApiKeyRepository } from "@/modules/api-key/api-key-repository"; +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; import { BillingModule } from "@/modules/billing/billing.module"; import { BookingSeatModule } from "@/modules/booking-seat/booking-seat.module"; import { BookingSeatRepository } from "@/modules/booking-seat/booking-seat.repository"; @@ -29,7 +29,7 @@ import { Module } from "@nestjs/common"; BookingsRepository_2024_08_13, EventTypesRepository_2024_06_14, BookingSeatRepository, - ApiKeyRepository, + ApiKeysRepository, ], controllers: [BookingsController_2024_08_13], exports: [InputBookingsService_2024_08_13, OutputBookingsService_2024_08_13, BookingsService_2024_08_13], diff --git a/apps/api/v2/src/ee/bookings/2024-08-13/services/input.service.ts b/apps/api/v2/src/ee/bookings/2024-08-13/services/input.service.ts index 5825889345..72e4645b96 100644 --- a/apps/api/v2/src/ee/bookings/2024-08-13/services/input.service.ts +++ b/apps/api/v2/src/ee/bookings/2024-08-13/services/input.service.ts @@ -5,7 +5,7 @@ import { } from "@/ee/bookings/2024-08-13/services/output.service"; import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository"; import { hashAPIKey, isApiKey, stripApiKey } from "@/lib/api-key"; -import { ApiKeyRepository } from "@/modules/api-key/api-key-repository"; +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; import { BookingSeatRepository } from "@/modules/booking-seat/booking-seat.repository"; import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository"; import { OAuthFlowService } from "@/modules/oauth-clients/services/oauth-flow.service"; @@ -74,7 +74,7 @@ export class InputBookingsService_2024_08_13 { private readonly eventTypesRepository: EventTypesRepository_2024_06_14, private readonly bookingsRepository: BookingsRepository_2024_08_13, private readonly config: ConfigService, - private readonly apiKeyRepository: ApiKeyRepository, + private readonly apiKeyRepository: ApiKeysRepository, private readonly bookingSeatRepository: BookingSeatRepository ) {} diff --git a/apps/api/v2/src/lib/safe-parse/safe-parse.ts b/apps/api/v2/src/lib/safe-parse/safe-parse.ts index fdaacd409f..16e11c0686 100644 --- a/apps/api/v2/src/lib/safe-parse/safe-parse.ts +++ b/apps/api/v2/src/lib/safe-parse/safe-parse.ts @@ -3,12 +3,7 @@ import { ZodSchema } from "zod"; const logger = new Logger("safeParse"); -export function safeParse( - schema: ZodSchema, - value: unknown, - defaultValue: T, - logError = true -): T { +export function safeParse(schema: ZodSchema, value: unknown, defaultValue: T, logError = true): T { const result = schema.safeParse(value); if (result.success) { return result.data; diff --git a/apps/api/v2/src/modules/api-key/api-key.module.ts b/apps/api/v2/src/modules/api-key/api-key.module.ts deleted file mode 100644 index 993210e07a..0000000000 --- a/apps/api/v2/src/modules/api-key/api-key.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ApiKeyRepository } from "@/modules/api-key/api-key-repository"; -import { PrismaModule } from "@/modules/prisma/prisma.module"; -import { Module } from "@nestjs/common"; - -@Module({ - imports: [PrismaModule], - providers: [ApiKeyRepository], - exports: [ApiKeyRepository], -}) -export class ApiKeyModule {} diff --git a/apps/api/v2/src/modules/api-key/api-key-repository.ts b/apps/api/v2/src/modules/api-keys/api-keys-repository.ts similarity index 60% rename from apps/api/v2/src/modules/api-key/api-key-repository.ts rename to apps/api/v2/src/modules/api-keys/api-keys-repository.ts index 66af5f68c4..6408f847a6 100644 --- a/apps/api/v2/src/modules/api-key/api-key-repository.ts +++ b/apps/api/v2/src/modules/api-keys/api-keys-repository.ts @@ -3,7 +3,7 @@ import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; @Injectable() -export class ApiKeyRepository { +export class ApiKeysRepository { constructor(private readonly dbRead: PrismaReadService, private readonly dbWrite: PrismaWriteService) {} async getApiKeyFromHash(hashedKey: string) { @@ -13,4 +13,20 @@ export class ApiKeyRepository { }, }); } + + async getTeamApiKeys(teamId: number) { + return this.dbRead.prisma.apiKey.findMany({ + where: { + teamId, + }, + }); + } + + async deleteById(id: string) { + return this.dbWrite.prisma.apiKey.delete({ + where: { + id, + }, + }); + } } diff --git a/apps/api/v2/src/modules/api-keys/api-keys.module.ts b/apps/api/v2/src/modules/api-keys/api-keys.module.ts new file mode 100644 index 0000000000..cee9339155 --- /dev/null +++ b/apps/api/v2/src/modules/api-keys/api-keys.module.ts @@ -0,0 +1,13 @@ +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; +import { ApiKeysController } from "@/modules/api-keys/controllers/api-keys.controller"; +import { ApiKeysService } from "@/modules/api-keys/services/api-keys.service"; +import { PrismaModule } from "@/modules/prisma/prisma.module"; +import { Module } from "@nestjs/common"; + +@Module({ + imports: [PrismaModule], + providers: [ApiKeysRepository, ApiKeysService], + controllers: [ApiKeysController], + exports: [ApiKeysRepository, ApiKeysService], +}) +export class ApiKeysModule {} diff --git a/apps/api/v2/src/modules/api-keys/controllers/api-keys.controller.ts b/apps/api/v2/src/modules/api-keys/controllers/api-keys.controller.ts new file mode 100644 index 0000000000..63a04c708f --- /dev/null +++ b/apps/api/v2/src/modules/api-keys/controllers/api-keys.controller.ts @@ -0,0 +1,48 @@ +import { API_VERSIONS_VALUES } from "@/lib/api-versions"; +import { RefreshApiKeyInput } from "@/modules/api-keys/inputs/refresh-api-key.input"; +import { RefreshApiKeyOutput } from "@/modules/api-keys/outputs/refresh-api-key.output"; +import { ApiKeysService } from "@/modules/api-keys/services/api-keys.service"; +import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; +import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; +import { ApiAuthGuardRequest } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { Body, Controller, HttpCode, HttpStatus, Post, Req, UseGuards } from "@nestjs/common"; +import { ApiTags, ApiHeader, ApiOperation } from "@nestjs/swagger"; + +import { SUCCESS_STATUS } from "@calcom/platform-constants"; + +@Controller({ + path: "/v2/api-keys", + version: API_VERSIONS_VALUES, +}) +@UseGuards(ApiAuthGuard) +@ApiTags("Api Keys") +export class ApiKeysController { + constructor(private readonly apiKeysService: ApiKeysService) {} + + @ApiOperation({ + summary: "Refresh API Key", + description: `Generate a new API key and delete the current one. Provide API key to refresh as a Bearer token in the Authorization header (e.g. "Authorization: Bearer ").`, + }) + @ApiHeader({ + name: "Authorization", + description: "Bearer ", + required: true, + schema: { type: "string" }, + }) + @Post("/refresh") + @HttpCode(HttpStatus.OK) + async refresh( + @Body() body: RefreshApiKeyInput, + @GetUser("id") userId: number, + @Req() request: ApiAuthGuardRequest + ): Promise { + const currentApiKey = await this.apiKeysService.getRequestApiKey(request); + const newApiKey = await this.apiKeysService.refreshApiKey(userId, currentApiKey, body); + return { + status: SUCCESS_STATUS, + data: { + apiKey: newApiKey, + }, + }; + } +} diff --git a/apps/api/v2/src/modules/api-keys/inputs/create-api-key.input.ts b/apps/api/v2/src/modules/api-keys/inputs/create-api-key.input.ts new file mode 100644 index 0000000000..d3f17f3514 --- /dev/null +++ b/apps/api/v2/src/modules/api-keys/inputs/create-api-key.input.ts @@ -0,0 +1,20 @@ +import { RefreshApiKeyInput } from "@/modules/api-keys/inputs/refresh-api-key.input"; +import { ApiPropertyOptional } from "@nestjs/swagger"; +import { IsInt, IsOptional, IsString } from "class-validator"; + +export class CreateApiKeyInput extends RefreshApiKeyInput { + @IsOptional() + @IsInt() + @ApiPropertyOptional({ + description: "For which team or organization is the api key.", + }) + readonly teamId?: number; + + @IsOptional() + @IsString() + @ApiPropertyOptional({ + description: "Store additional note about this api key.", + example: "This is an api key for development purposes.", + }) + readonly note?: string; +} diff --git a/apps/api/v2/src/modules/api-keys/inputs/refresh-api-key.input.ts b/apps/api/v2/src/modules/api-keys/inputs/refresh-api-key.input.ts new file mode 100644 index 0000000000..01263625c7 --- /dev/null +++ b/apps/api/v2/src/modules/api-keys/inputs/refresh-api-key.input.ts @@ -0,0 +1,20 @@ +import { ApiPropertyOptional } from "@nestjs/swagger"; +import { IsBoolean, IsInt, IsOptional, Min } from "class-validator"; + +export class RefreshApiKeyInput { + @IsOptional() + @IsInt() + @Min(1) + @ApiPropertyOptional({ + description: "For how many days is managed organization api key valid. Defaults to 30 days.", + example: 60, + default: 30, + minimum: 1, + }) + readonly apiKeyDaysValid?: number; + + @IsOptional() + @IsBoolean() + @ApiPropertyOptional({ description: "If true, organization api key never expires.", example: true }) + readonly apiKeyNeverExpires?: boolean; +} diff --git a/apps/api/v2/src/modules/api-keys/outputs/api-key.output.ts b/apps/api/v2/src/modules/api-keys/outputs/api-key.output.ts new file mode 100644 index 0000000000..19818105f7 --- /dev/null +++ b/apps/api/v2/src/modules/api-keys/outputs/api-key.output.ts @@ -0,0 +1,10 @@ +import { ApiProperty as DocsProperty } from "@nestjs/swagger"; +import { Expose } from "class-transformer"; +import { IsString } from "class-validator"; + +export class ApiKeyOutput { + @IsString() + @Expose() + @DocsProperty() + readonly apiKey!: string; +} diff --git a/apps/api/v2/src/modules/api-keys/outputs/refresh-api-key.output.ts b/apps/api/v2/src/modules/api-keys/outputs/refresh-api-key.output.ts new file mode 100644 index 0000000000..e36ccafc07 --- /dev/null +++ b/apps/api/v2/src/modules/api-keys/outputs/refresh-api-key.output.ts @@ -0,0 +1,18 @@ +import { ApiKeyOutput } from "@/modules/api-keys/outputs/api-key.output"; +import { ApiProperty } from "@nestjs/swagger"; +import { Expose, Type } from "class-transformer"; +import { IsEnum, ValidateNested } from "class-validator"; + +import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants"; + +export class RefreshApiKeyOutput { + @ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] }) + @IsEnum([SUCCESS_STATUS, ERROR_STATUS]) + status!: typeof SUCCESS_STATUS | typeof ERROR_STATUS; + + @ApiProperty({ type: ApiKeyOutput }) + @Expose() + @ValidateNested() + @Type(() => ApiKeyOutput) + data!: ApiKeyOutput; +} diff --git a/apps/api/v2/src/modules/api-keys/services/api-keys.service.ts b/apps/api/v2/src/modules/api-keys/services/api-keys.service.ts new file mode 100644 index 0000000000..79f3a3bb3f --- /dev/null +++ b/apps/api/v2/src/modules/api-keys/services/api-keys.service.ts @@ -0,0 +1,80 @@ +import { hashAPIKey, stripApiKey } from "@/lib/api-key"; +import { AuthMethods } from "@/lib/enums/auth-methods"; +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; +import { CreateApiKeyInput } from "@/modules/api-keys/inputs/create-api-key.input"; +import { RefreshApiKeyInput } from "@/modules/api-keys/inputs/refresh-api-key.input"; +import { ApiAuthGuardRequest } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { BadRequestException, Injectable, UnauthorizedException } from "@nestjs/common"; +import { ConfigService } from "@nestjs/config"; +import { DateTime } from "luxon"; + +import { createApiKeyHandler } from "@calcom/platform-libraries"; + +@Injectable() +export class ApiKeysService { + constructor( + private readonly apiKeysRepository: ApiKeysRepository, + private readonly config: ConfigService + ) {} + + async getRequestApiKey(request: ApiAuthGuardRequest) { + if (request.authMethod !== AuthMethods.API_KEY) { + throw new UnauthorizedException( + "ApiKeysService - This endpoint can only be accessed using an API key by providing 'Authorization: Bearer ' header" + ); + } + const apiKey = request.get("Authorization")?.replace("Bearer ", ""); + if (!apiKey) { + throw new UnauthorizedException("ApiKeysService - No API key provided"); + } + return apiKey; + } + + async createApiKey(authUserId: number, createApiKeyInput: CreateApiKeyInput) { + if (createApiKeyInput.apiKeyDaysValid && createApiKeyInput.apiKeyNeverExpires) { + throw new BadRequestException( + "ApiKeysService -Cannot set both apiKeyDaysValid and apiKeyNeverExpires. It has to be either or none of them." + ); + } + + const defaultApiKeyDaysValid = 30; + const apiKeyExpiresAfterDays = createApiKeyInput.apiKeyDaysValid + ? createApiKeyInput.apiKeyDaysValid + : defaultApiKeyDaysValid; + const apiKeyExpiresAt = DateTime.utc().plus({ days: apiKeyExpiresAfterDays }).toJSDate(); + const apiKey = await createApiKeyHandler({ + ctx: { + user: { + id: authUserId, + }, + }, + input: { + note: createApiKeyInput.note, + neverExpires: !!createApiKeyInput.apiKeyNeverExpires, + expiresAt: apiKeyExpiresAt, + teamId: createApiKeyInput.teamId, + }, + }); + + return apiKey; + } + + async refreshApiKey(authUserId: number, apiKey: string, refreshApiKeyInput: RefreshApiKeyInput) { + const strippedApiKey = stripApiKey(apiKey, this.config.get("api.keyPrefix")); + const apiKeyHash = hashAPIKey(strippedApiKey); + const apiKeyInDb = await this.apiKeysRepository.getApiKeyFromHash(apiKeyHash); + if (!apiKeyInDb) { + throw new UnauthorizedException("ApiKeysService - provided api key is not valid."); + } + + const newApiKey = await this.createApiKey(authUserId, { + ...refreshApiKeyInput, + note: apiKeyInDb.note || undefined, + teamId: apiKeyInDb.teamId || undefined, + }); + + await this.apiKeysRepository.deleteById(apiKeyInDb.id); + + return newApiKey; + } +} diff --git a/apps/api/v2/src/modules/auth/auth.module.ts b/apps/api/v2/src/modules/auth/auth.module.ts index 8663d429b7..eea576c84e 100644 --- a/apps/api/v2/src/modules/auth/auth.module.ts +++ b/apps/api/v2/src/modules/auth/auth.module.ts @@ -1,4 +1,4 @@ -import { ApiKeyModule } from "@/modules/api-key/api-key.module"; +import { ApiKeysModule } from "@/modules/api-keys/api-keys.module"; import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; import { NextAuthGuard } from "@/modules/auth/guards/next-auth/next-auth.guard"; import { ApiAuthStrategy } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; @@ -17,7 +17,7 @@ import { PassportModule } from "@nestjs/passport"; imports: [ PassportModule, RedisModule, - ApiKeyModule, + ApiKeysModule, UsersModule, MembershipsModule, TokensModule, diff --git a/apps/api/v2/src/modules/auth/decorators/get-org-id/get-org-id.decorator.ts b/apps/api/v2/src/modules/auth/decorators/get-org-id/get-org-id.decorator.ts new file mode 100644 index 0000000000..8f94ae029d --- /dev/null +++ b/apps/api/v2/src/modules/auth/decorators/get-org-id/get-org-id.decorator.ts @@ -0,0 +1,12 @@ +import { createParamDecorator, ExecutionContext, UnauthorizedException } from "@nestjs/common"; + +export const GetOrgId = createParamDecorator((_: unknown, ctx: ExecutionContext): number => { + const request = ctx.switchToHttp().getRequest(); + const organizationId = request.organizationId; + + if (!organizationId) { + throw new UnauthorizedException("GetOrgId decorator: Organization ID not found"); + } + + return organizationId; +}); diff --git a/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.spec.ts b/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.spec.ts index e65dbb5815..b4aea0a00a 100644 --- a/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.spec.ts +++ b/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.spec.ts @@ -1,5 +1,5 @@ import { PlatformPlanGuard } from "@/modules/auth/guards/billing/platform-plan.guard"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { RedisService } from "@/modules/redis/redis.service"; import { createMock } from "@golevelup/ts-jest"; import { ExecutionContext } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.ts b/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.ts index 7974a65e55..977e17d329 100644 --- a/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/billing/platform-plan.guard.ts @@ -1,7 +1,7 @@ import { PlatformPlan } from "@/modules/auth/decorators/billing/platform-plan.decorator"; import { ApiAuthGuardUser } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; import { PlatformPlanType } from "@/modules/billing/types"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { RedisService } from "@/modules/redis/redis.service"; import { Injectable, CanActivate, ExecutionContext } from "@nestjs/common"; import { Reflector } from "@nestjs/core"; diff --git a/apps/api/v2/src/modules/auth/guards/memberships/is-membership-in-org.guard.ts b/apps/api/v2/src/modules/auth/guards/memberships/is-membership-in-org.guard.ts index 56a3f3c48c..75fca8654d 100644 --- a/apps/api/v2/src/modules/auth/guards/memberships/is-membership-in-org.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/memberships/is-membership-in-org.guard.ts @@ -1,4 +1,4 @@ -import { OrganizationsMembershipRepository } from "@/modules/organizations/repositories/organizations-membership.repository"; +import { OrganizationsMembershipRepository } from "@/modules/organizations/memberships/organizations-membership.repository"; import { Injectable, CanActivate, diff --git a/apps/api/v2/src/modules/auth/guards/organization-roles/organization-roles.guard.ts b/apps/api/v2/src/modules/auth/guards/organization-roles/organization-roles.guard.ts index 1105a9a3a1..12d45e1266 100644 --- a/apps/api/v2/src/modules/auth/guards/organization-roles/organization-roles.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/organization-roles/organization-roles.guard.ts @@ -1,6 +1,6 @@ import { MembershipRoles } from "@/modules/auth/decorators/roles/membership-roles.decorator"; import { MembershipsRepository } from "@/modules/memberships/memberships.repository"; -import { OrganizationsService } from "@/modules/organizations/services/organizations.service"; +import { OrganizationsService } from "@/modules/organizations/index/organizations.service"; import { UsersService } from "@/modules/users/services/users.service"; import { UserWithProfile } from "@/modules/users/users.repository"; import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common"; @@ -20,10 +20,10 @@ export class OrganizationRolesGuard implements CanActivate { async canActivate(context: ExecutionContext): Promise { const request = context.switchToHttp().getRequest(); const user: UserWithProfile = request.user; - const organizationId = user ? this.usersService.getUserMainOrgId(user) : null; + const organizationId = this.getOrganizationId(context); if (!user || !organizationId) { - throw new ForbiddenException("No organization associated with the user."); + throw new ForbiddenException("OrganizationRolesGuard - No organization associated with the user."); } await this.isPlatform(organizationId); @@ -40,13 +40,25 @@ export class OrganizationRolesGuard implements CanActivate { async isPlatform(organizationId: number) { const isPlatform = await this.organizationsService.isPlatform(organizationId); if (!isPlatform) { - throw new ForbiddenException("Organization is not a platform (SHP)."); + throw new ForbiddenException("OrganizationRolesGuard - Organization is not a platform (SHP)."); } } + getOrganizationId(context: ExecutionContext) { + const request = context.switchToHttp().getRequest(); + const user: UserWithProfile = request.user; + const authMethodOrganizationId = request.organizationId; + if (authMethodOrganizationId) return authMethodOrganizationId; + + const userOrganizationId = user ? this.usersService.getUserMainOrgId(user) : null; + return userOrganizationId; + } + isMembershipAccepted(accepted: boolean) { if (!accepted) { - throw new ForbiddenException(`User has not accepted membership in the organization.`); + throw new ForbiddenException( + `OrganizationRolesGuard - User has not accepted membership in the organization.` + ); } } @@ -57,7 +69,9 @@ export class OrganizationRolesGuard implements CanActivate { const hasRequiredRole = allowedRoles.includes(membershipRole); if (!hasRequiredRole) { - throw new ForbiddenException(`User must have one of the roles: ${allowedRoles.join(", ")}.`); + throw new ForbiddenException( + `OrganizationRolesGuard - User must have one of the roles: ${allowedRoles.join(", ")}.` + ); } } } diff --git a/apps/api/v2/src/modules/auth/guards/organizations/is-admin-api-enabled.guard.ts b/apps/api/v2/src/modules/auth/guards/organizations/is-admin-api-enabled.guard.ts index a922160c6d..e93bf1dd20 100644 --- a/apps/api/v2/src/modules/auth/guards/organizations/is-admin-api-enabled.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/organizations/is-admin-api-enabled.guard.ts @@ -1,4 +1,4 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { RedisService } from "@/modules/redis/redis.service"; import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common"; import { Request } from "express"; diff --git a/apps/api/v2/src/modules/auth/guards/organizations/is-managed-org-in-manager-org.guard.ts b/apps/api/v2/src/modules/auth/guards/organizations/is-managed-org-in-manager-org.guard.ts new file mode 100644 index 0000000000..9ac6c8cce1 --- /dev/null +++ b/apps/api/v2/src/modules/auth/guards/organizations/is-managed-org-in-manager-org.guard.ts @@ -0,0 +1,43 @@ +import { ManagedOrganizationsRepository } from "@/modules/organizations/organizations/managed-organizations.repository"; +import { + Injectable, + CanActivate, + ExecutionContext, + ForbiddenException, + NotFoundException, +} from "@nestjs/common"; +import { Request } from "express"; + +import { Team } from "@calcom/prisma/client"; + +@Injectable() +export class IsManagedOrgInManagerOrg implements CanActivate { + constructor(private managedOrganizationsRepository: ManagedOrganizationsRepository) {} + + async canActivate(context: ExecutionContext): Promise { + const request = context.switchToHttp().getRequest(); + const managedOrgId: string = request.params.managedOrganizationId; + const managerOrgId: string = request.params.orgId; + + if (!managerOrgId) { + throw new ForbiddenException("No manager org id found in request params."); + } + + if (!managedOrgId) { + throw new ForbiddenException("No managed org id found in request params."); + } + + const managedOrganization = await this.managedOrganizationsRepository.getByManagerManagedIds( + Number(managerOrgId), + Number(managedOrgId) + ); + + if (!managedOrganization) { + throw new NotFoundException( + `Managed organization with id=${managedOrgId} within manager organization with id=${managerOrgId} not found.` + ); + } + + return true; + } +} diff --git a/apps/api/v2/src/modules/auth/guards/organizations/is-org.guard.ts b/apps/api/v2/src/modules/auth/guards/organizations/is-org.guard.ts index ce9143d36f..02484fcdba 100644 --- a/apps/api/v2/src/modules/auth/guards/organizations/is-org.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/organizations/is-org.guard.ts @@ -1,4 +1,4 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { RedisService } from "@/modules/redis/redis.service"; import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common"; import { Request } from "express"; diff --git a/apps/api/v2/src/modules/auth/guards/organizations/is-webhook-in-org.guard.ts b/apps/api/v2/src/modules/auth/guards/organizations/is-webhook-in-org.guard.ts index 0dbdc9fe65..5505c8fed1 100644 --- a/apps/api/v2/src/modules/auth/guards/organizations/is-webhook-in-org.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/organizations/is-webhook-in-org.guard.ts @@ -1,5 +1,5 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; -import { OrganizationsWebhooksRepository } from "@/modules/organizations/repositories/organizations-webhooks.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsWebhooksRepository } from "@/modules/organizations/webhooks/organizations-webhooks.repository"; import { RedisService } from "@/modules/redis/redis.service"; import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common"; import { Request } from "express"; diff --git a/apps/api/v2/src/modules/auth/guards/teams/is-team-in-org.guard.ts b/apps/api/v2/src/modules/auth/guards/teams/is-team-in-org.guard.ts index eb90203845..88cc7d90ee 100644 --- a/apps/api/v2/src/modules/auth/guards/teams/is-team-in-org.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/teams/is-team-in-org.guard.ts @@ -1,4 +1,4 @@ -import { OrganizationsTeamsRepository } from "@/modules/organizations/repositories/organizations-teams.repository"; +import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository"; import { Injectable, CanActivate, diff --git a/apps/api/v2/src/modules/auth/guards/users/is-user-in-org-team.guard.ts b/apps/api/v2/src/modules/auth/guards/users/is-user-in-org-team.guard.ts index 12bcaee592..f88eb9ef1a 100644 --- a/apps/api/v2/src/modules/auth/guards/users/is-user-in-org-team.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/users/is-user-in-org-team.guard.ts @@ -1,4 +1,4 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common"; import { Request } from "express"; diff --git a/apps/api/v2/src/modules/auth/guards/users/is-user-in-org.guard.ts b/apps/api/v2/src/modules/auth/guards/users/is-user-in-org.guard.ts index e35bac45d5..f9119f0abc 100644 --- a/apps/api/v2/src/modules/auth/guards/users/is-user-in-org.guard.ts +++ b/apps/api/v2/src/modules/auth/guards/users/is-user-in-org.guard.ts @@ -1,4 +1,4 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common"; import { Request } from "express"; diff --git a/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.e2e-spec.ts b/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.e2e-spec.ts index b4bdb132ab..3f2cc3fee4 100644 --- a/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.e2e-spec.ts +++ b/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.e2e-spec.ts @@ -1,5 +1,6 @@ import appConfig from "@/config/app"; -import { ApiKeyRepository } from "@/modules/api-key/api-key-repository"; +import { AuthMethods } from "@/lib/enums/auth-methods"; +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; import { DeploymentsRepository } from "@/modules/deployments/deployments.repository"; import { DeploymentsService } from "@/modules/deployments/deployments.service"; import { JwtService } from "@/modules/jwt/jwt.service"; @@ -9,6 +10,7 @@ import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { ProfilesModule } from "@/modules/profiles/profiles.module"; import { TokensRepository } from "@/modules/tokens/tokens.repository"; +import { UsersService } from "@/modules/users/services/users.service"; import { UsersRepository } from "@/modules/users/users.repository"; import { ExecutionContext, HttpException } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; @@ -16,6 +18,7 @@ import { ConfigModule } from "@nestjs/config"; import { JwtService as NestJwtService } from "@nestjs/jwt"; import { Test, TestingModule } from "@nestjs/testing"; import { PlatformOAuthClient, Team, User } from "@prisma/client"; +import { createRequest } from "node-mocks-http"; import { ApiKeysRepositoryFixture } from "test/fixtures/repository/api-keys.repository.fixture"; import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture"; import { ProfileRepositoryFixture } from "test/fixtures/repository/profiles.repository.fixture"; @@ -27,6 +30,7 @@ import { randomString } from "test/utils/randomString"; import { X_CAL_CLIENT_ID, X_CAL_SECRET_KEY } from "@calcom/platform-constants"; +import { ApiAuthGuardRequest } from "./api-auth.strategy"; import { ApiAuthStrategy } from "./api-auth.strategy"; describe("ApiAuthStrategy", () => { @@ -35,7 +39,9 @@ describe("ApiAuthStrategy", () => { let tokensRepositoryFixture: TokensRepositoryFixture; let teamRepositoryFixture: TeamRepositoryFixture; let organization: Team; + let organizationTwo: Team; let oAuthClient: PlatformOAuthClient; + let oAuthClientTwo: PlatformOAuthClient; let apiKeysRepositoryFixture: ApiKeysRepositoryFixture; let oAuthClientRepositoryFixture: OAuthClientRepositoryFixture; let profilesRepositoryFixture: ProfileRepositoryFixture; @@ -65,7 +71,8 @@ describe("ApiAuthStrategy", () => { ConfigService, OAuthFlowService, UsersRepository, - ApiKeyRepository, + UsersService, + ApiKeysRepository, DeploymentsService, OAuthClientRepository, PrismaReadService, @@ -84,7 +91,11 @@ describe("ApiAuthStrategy", () => { teamRepositoryFixture = new TeamRepositoryFixture(module); oAuthClientRepositoryFixture = new OAuthClientRepositoryFixture(module); profilesRepositoryFixture = new ProfileRepositoryFixture(module); - organization = await teamRepositoryFixture.create({ name: `api-auth-organization-${randomString()}` }); + organization = await teamRepositoryFixture.create({ name: `api-auth-organization-1-${randomString()}` }); + organizationTwo = await teamRepositoryFixture.create({ + name: `api-auth-organization-2-${randomString()}`, + }); + validApiKeyUser = await userRepositoryFixture.create({ email: validApiKeyEmail, }); @@ -103,6 +114,13 @@ describe("ApiAuthStrategy", () => { organization: { connect: { id: organization.id } }, }); + await profilesRepositoryFixture.create({ + uid: "asd-asd", + username: validOAuthEmail, + user: { connect: { id: validOAuthUser.id } }, + organization: { connect: { id: organizationTwo.id } }, + }); + const data = { logo: "logo-url", name: "name", @@ -110,6 +128,7 @@ describe("ApiAuthStrategy", () => { permissions: 32, }; oAuthClient = await oAuthClientRepositoryFixture.create(organization.id, data, "secret"); + oAuthClientTwo = await oAuthClientRepositoryFixture.create(organizationTwo.id, data, "secret"); }); describe("authenticate with strategy", () => { @@ -119,25 +138,68 @@ describe("ApiAuthStrategy", () => { oAuthClient.id ); - const user = await strategy.accessTokenStrategy(accessToken); + const mockRequest = createRequest() as ApiAuthGuardRequest; + mockRequest.authMethod = AuthMethods.ACCESS_TOKEN; + mockRequest.organizationId = null; + const user = await strategy.accessTokenStrategy(accessToken, mockRequest); expect(user).toBeDefined(); expect(user?.id).toEqual(validAccessTokenUser.id); }); - it("should return user associated with valid api key", async () => { + it("should return user associated with valid api key and correctly set organizationId for org1", async () => { const now = new Date(); now.setDate(now.getDate() + 1); - const { keyString } = await apiKeysRepositoryFixture.createApiKey(validApiKeyUser.id, now); + const { keyString } = await apiKeysRepositoryFixture.createApiKey( + validApiKeyUser.id, + now, + organization.id + ); - const user = await strategy.apiKeyStrategy(keyString); + const mockRequest = createRequest() as ApiAuthGuardRequest; + mockRequest.authMethod = AuthMethods.API_KEY; + mockRequest.organizationId = null; + const user = await strategy.apiKeyStrategy(keyString, mockRequest); expect(user).toBeDefined(); expect(user?.id).toEqual(validApiKeyUser.id); + expect(mockRequest.organizationId).toEqual(organization.id); + }); + + it("should return user associated with valid api key and correctly set organizationId for org2", async () => { + const now = new Date(); + now.setDate(now.getDate() + 1); + const { keyString } = await apiKeysRepositoryFixture.createApiKey( + validApiKeyUser.id, + now, + organizationTwo.id + ); + + const mockRequest = createRequest() as ApiAuthGuardRequest; + mockRequest.authMethod = AuthMethods.API_KEY; + mockRequest.organizationId = null; + const user = await strategy.apiKeyStrategy(keyString, mockRequest); + expect(user).toBeDefined(); + expect(user?.id).toEqual(validApiKeyUser.id); + expect(mockRequest.organizationId).toEqual(organizationTwo.id); }); it("should return user associated with valid OAuth client", async () => { - const user = await strategy.oAuthClientStrategy(oAuthClient.id, oAuthClient.secret); + const mockRequest = createRequest() as ApiAuthGuardRequest; + mockRequest.authMethod = AuthMethods.OAUTH_CLIENT; + mockRequest.organizationId = null; + const user = await strategy.oAuthClientStrategy(oAuthClient.id, oAuthClient.secret, mockRequest); expect(user).toBeDefined(); expect(user.id).toEqual(validOAuthUser.id); + expect(mockRequest.organizationId).toEqual(organization.id); + }); + + it("should return user associated with valid OAuth client for org2", async () => { + const mockRequest = createRequest() as ApiAuthGuardRequest; + mockRequest.authMethod = AuthMethods.OAUTH_CLIENT; + mockRequest.organizationId = null; + const user = await strategy.oAuthClientStrategy(oAuthClientTwo.id, oAuthClientTwo.secret, mockRequest); + expect(user).toBeDefined(); + expect(user.id).toEqual(validOAuthUser.id); + expect(mockRequest.organizationId).toEqual(organizationTwo.id); }); it("should throw 401 if api key is invalid", async () => { diff --git a/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.ts b/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.ts index 713cacc883..916fe5cf99 100644 --- a/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.ts +++ b/apps/api/v2/src/modules/auth/strategies/api-auth/api-auth.strategy.ts @@ -2,12 +2,13 @@ import { hashAPIKey, isApiKey, stripApiKey } from "@/lib/api-key"; import { AuthMethods } from "@/lib/enums/auth-methods"; import { isOriginAllowed } from "@/lib/is-origin-allowed/is-origin-allowed"; import { BaseStrategy } from "@/lib/passport/strategies/types"; -import { ApiKeyRepository } from "@/modules/api-key/api-key-repository"; +import { ApiKeysRepository } from "@/modules/api-keys/api-keys-repository"; import { DeploymentsService } from "@/modules/deployments/deployments.service"; import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository"; import { OAuthFlowService } from "@/modules/oauth-clients/services/oauth-flow.service"; import { ProfilesRepository } from "@/modules/profiles/profiles.repository"; import { TokensRepository } from "@/modules/tokens/tokens.repository"; +import { UsersService } from "@/modules/users/services/users.service"; import { UserWithProfile, UsersRepository } from "@/modules/users/users.repository"; import { Injectable, InternalServerErrorException, UnauthorizedException } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; @@ -18,7 +19,11 @@ import { getToken } from "next-auth/jwt"; import { INVALID_ACCESS_TOKEN, X_CAL_CLIENT_ID, X_CAL_SECRET_KEY } from "@calcom/platform-constants"; export type ApiAuthGuardUser = UserWithProfile & { isSystemAdmin: boolean }; - +export type ApiAuthGuardRequest = Request & { + authMethod: AuthMethods; + organizationId: number | null; + user: ApiAuthGuardUser; +}; export const NO_AUTH_PROVIDED_MESSAGE = "No authentication method provided. Either pass an API key as 'Bearer' header or OAuth client credentials as 'x-cal-secret-key' and 'x-cal-client-id' headers"; @Injectable() @@ -29,14 +34,15 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") private readonly oauthFlowService: OAuthFlowService, private readonly tokensRepository: TokensRepository, private readonly userRepository: UsersRepository, - private readonly apiKeyRepository: ApiKeyRepository, + private readonly apiKeyRepository: ApiKeysRepository, private readonly oauthRepository: OAuthClientRepository, - private readonly profilesRepository: ProfilesRepository + private readonly profilesRepository: ProfilesRepository, + private readonly usersService: UsersService ) { super(); } - async authenticate(request: Request & { authMethod: AuthMethods }) { + async authenticate(request: ApiAuthGuardRequest) { try { const { params } = request; const oAuthClientSecret = request.get(X_CAL_SECRET_KEY); @@ -45,7 +51,7 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") if (oAuthClientId && oAuthClientSecret) { request.authMethod = AuthMethods["OAUTH_CLIENT"]; - return await this.authenticateOAuthClient(oAuthClientId, oAuthClientSecret); + return await this.authenticateOAuthClient(oAuthClientId, oAuthClientSecret, request); } if (bearerToken) { @@ -53,7 +59,7 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") request.authMethod = isApiKey(bearerToken, this.config.get("api.apiKeyPrefix") ?? "cal_") ? AuthMethods["API_KEY"] : AuthMethods["ACCESS_TOKEN"]; - return await this.authenticateBearerToken(bearerToken, requestOrigin); + return await this.authenticateBearerToken(bearerToken, request, requestOrigin); } const nextAuthSecret = this.config.get("next.authSecret", { infer: true }); @@ -61,7 +67,7 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") if (nextAuthToken) { request.authMethod = AuthMethods["NEXT_AUTH"]; - return await this.authenticateNextAuth(nextAuthToken); + return await this.authenticateNextAuth(nextAuthToken, request); } throw new UnauthorizedException(NO_AUTH_PROVIDED_MESSAGE); @@ -75,8 +81,8 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") } } - async authenticateNextAuth(token: { email?: string | null }) { - const user = await this.nextAuthStrategy(token); + async authenticateNextAuth(token: { email?: string | null }, request: ApiAuthGuardRequest) { + const user = await this.nextAuthStrategy(token, request); return this.success(this.getSuccessUser(user)); } @@ -87,12 +93,16 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") }; } - async authenticateOAuthClient(oAuthClientId: string, oAuthClientSecret: string) { - const user = await this.oAuthClientStrategy(oAuthClientId, oAuthClientSecret); + async authenticateOAuthClient( + oAuthClientId: string, + oAuthClientSecret: string, + request: ApiAuthGuardRequest + ) { + const user = await this.oAuthClientStrategy(oAuthClientId, oAuthClientSecret, request); return this.success(this.getSuccessUser(user)); } - async oAuthClientStrategy(oAuthClientId: string, oAuthClientSecret: string) { + async oAuthClientStrategy(oAuthClientId: string, oAuthClientSecret: string, request: ApiAuthGuardRequest) { const client = await this.oauthRepository.getOAuthClient(oAuthClientId); if (!client) { @@ -115,14 +125,20 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") throw new UnauthorizedException("No user associated with the provided OAuth client"); } + request.organizationId = client.organizationId; + return user; } - async authenticateBearerToken(authString: string, requestOrigin: string | undefined) { + async authenticateBearerToken( + authString: string, + request: ApiAuthGuardRequest, + requestOrigin: string | undefined + ) { try { const user = isApiKey(authString, this.config.get("api.apiKeyPrefix") ?? "cal_") - ? await this.apiKeyStrategy(authString) - : await this.accessTokenStrategy(authString, requestOrigin); + ? await this.apiKeyStrategy(authString, request) + : await this.accessTokenStrategy(authString, request, requestOrigin); if (!user) { return this.error(new UnauthorizedException("No user associated with the provided token")); @@ -139,7 +155,7 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") } } - async apiKeyStrategy(apiKey: string) { + async apiKeyStrategy(apiKey: string, request: ApiAuthGuardRequest) { const isLicenseValid = await this.deploymentsService.checkLicense(); if (!isLicenseValid) { throw new UnauthorizedException("Invalid or missing CALCOM_LICENSE_KEY environment variable"); @@ -163,10 +179,12 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") } const user: UserWithProfile | null = await this.userRepository.findByIdWithProfile(apiKeyOwnerId); + request.organizationId = keyData.teamId; + return user; } - async accessTokenStrategy(accessToken: string, origin?: string) { + async accessTokenStrategy(accessToken: string, request: ApiAuthGuardRequest, origin?: string) { const accessTokenValid = await this.oauthFlowService.validateAccessToken(accessToken); if (!accessTokenValid) { throw new UnauthorizedException(INVALID_ACCESS_TOKEN); @@ -190,10 +208,17 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") } const user: UserWithProfile | null = await this.userRepository.findByIdWithProfile(ownerId); + if (!user) { + throw new UnauthorizedException("User associated with the authentication api key not found."); + } + + const organizationId = this.usersService.getUserMainOrgId(user) as number; + request.organizationId = organizationId; + return user; } - async nextAuthStrategy(token: { email?: string | null }) { + async nextAuthStrategy(token: { email?: string | null }, request: ApiAuthGuardRequest) { if (!token.email) { throw new UnauthorizedException("Email not found in the authentication token."); } @@ -202,6 +227,8 @@ export class ApiAuthStrategy extends PassportStrategy(BaseStrategy, "api-auth") if (!user) { throw new UnauthorizedException("User associated with the authentication token email not found."); } + const organizationId = this.usersService.getUserMainOrgId(user) as number; + request.organizationId = organizationId; return user; } diff --git a/apps/api/v2/src/modules/billing/billing.module.ts b/apps/api/v2/src/modules/billing/billing.module.ts index b09f662fa0..6b4d355fa0 100644 --- a/apps/api/v2/src/modules/billing/billing.module.ts +++ b/apps/api/v2/src/modules/billing/billing.module.ts @@ -3,6 +3,7 @@ import { BillingRepository } from "@/modules/billing/billing.repository"; import { BillingController } from "@/modules/billing/controllers/billing.controller"; import { BillingConfigService } from "@/modules/billing/services/billing.config.service"; import { BillingService } from "@/modules/billing/services/billing.service"; +import { ManagedOrganizationsBillingService } from "@/modules/billing/services/managed-organizations.billing.service"; import { MembershipsModule } from "@/modules/memberships/memberships.module"; import { OrganizationsModule } from "@/modules/organizations/organizations.module"; import { PrismaModule } from "@/modules/prisma/prisma.module"; @@ -26,8 +27,14 @@ import { Module } from "@nestjs/common"; }), UsersModule, ], - providers: [BillingConfigService, BillingService, BillingRepository, BillingProcessor], - exports: [BillingService, BillingRepository], + providers: [ + BillingConfigService, + BillingService, + BillingRepository, + BillingProcessor, + ManagedOrganizationsBillingService, + ], + exports: [BillingService, BillingRepository, ManagedOrganizationsBillingService], controllers: [BillingController], }) export class BillingModule {} diff --git a/apps/api/v2/src/modules/billing/billing.processor.ts b/apps/api/v2/src/modules/billing/billing.processor.ts index f432998051..003e28e9cc 100644 --- a/apps/api/v2/src/modules/billing/billing.processor.ts +++ b/apps/api/v2/src/modules/billing/billing.processor.ts @@ -1,5 +1,5 @@ import { BillingRepository } from "@/modules/billing/billing.repository"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { StripeService } from "@/modules/stripe/stripe.service"; import { Process, Processor } from "@nestjs/bull"; import { Logger } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/billing/billing.repository.ts b/apps/api/v2/src/modules/billing/billing.repository.ts index 87fc4eb63f..4d8cc01919 100644 --- a/apps/api/v2/src/modules/billing/billing.repository.ts +++ b/apps/api/v2/src/modules/billing/billing.repository.ts @@ -38,7 +38,7 @@ export class BillingRepository { async updateBillingOverdue(subId: string, cusId: string, overdue: boolean) { try { - return this.dbWrite.prisma.platformBilling.update({ + return this.dbWrite.prisma.platformBilling.updateMany({ where: { subscriptionId: subId, customerId: cusId, diff --git a/apps/api/v2/src/modules/billing/controllers/billing.controller.e2e-spec.ts b/apps/api/v2/src/modules/billing/controllers/billing.controller.e2e-spec.ts index 5a9124c4de..2c59d2c1b4 100644 --- a/apps/api/v2/src/modules/billing/controllers/billing.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/billing/controllers/billing.controller.e2e-spec.ts @@ -141,7 +141,6 @@ describe("Platform Billing Controller (e2e)", () => { }, } as unknown as Stripe) ); - return request(app.getHttpServer()) .post("/v2/billing/webhook") .expect(200) diff --git a/apps/api/v2/src/modules/billing/services/billing.service.ts b/apps/api/v2/src/modules/billing/services/billing.service.ts index 95088ccad5..56c12584c0 100644 --- a/apps/api/v2/src/modules/billing/services/billing.service.ts +++ b/apps/api/v2/src/modules/billing/services/billing.service.ts @@ -3,7 +3,7 @@ import { BILLING_QUEUE, INCREMENT_JOB, IncrementJobDataType } from "@/modules/bi import { BillingRepository } from "@/modules/billing/billing.repository"; import { BillingConfigService } from "@/modules/billing/services/billing.config.service"; import { PlatformPlan } from "@/modules/billing/types"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { StripeService } from "@/modules/stripe/stripe.service"; import { InjectQueue } from "@nestjs/bull"; import { diff --git a/apps/api/v2/src/modules/billing/services/managed-organizations.billing.service.ts b/apps/api/v2/src/modules/billing/services/managed-organizations.billing.service.ts new file mode 100644 index 0000000000..6289fd9577 --- /dev/null +++ b/apps/api/v2/src/modules/billing/services/managed-organizations.billing.service.ts @@ -0,0 +1,34 @@ +import { PlatformPlan } from "@/modules/billing/types"; +import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; +import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; +import { Injectable, NotFoundException } from "@nestjs/common"; + +@Injectable() +export class ManagedOrganizationsBillingService { + constructor(private readonly dbRead: PrismaReadService, private readonly dbWrite: PrismaWriteService) {} + + async createManagedOrganizationBilling(managerOrgId: number, managedOrgId: number) { + const managerOrgBilling = await this.dbRead.prisma.platformBilling.findUnique({ + where: { id: managerOrgId }, + }); + if (!managerOrgBilling) { + throw new NotFoundException("Manager organization billing not found."); + } + if (managerOrgBilling.plan !== PlatformPlan.SCALE) { + throw new NotFoundException("Manager organization billing plan is not SCALE."); + } + + return this.dbWrite.prisma.platformBilling.create({ + data: { + id: managedOrgId, + customerId: managerOrgBilling.customerId, + subscriptionId: managerOrgBilling.subscriptionId, + plan: managerOrgBilling.plan, + billingCycleStart: managerOrgBilling.billingCycleStart, + billingCycleEnd: managerOrgBilling.billingCycleEnd, + overdue: managerOrgBilling.overdue, + managerBillingId: managerOrgBilling.id, + }, + }); + } +} diff --git a/apps/api/v2/src/modules/endpoints.module.ts b/apps/api/v2/src/modules/endpoints.module.ts index 80f62ba306..ce785ff5a5 100644 --- a/apps/api/v2/src/modules/endpoints.module.ts +++ b/apps/api/v2/src/modules/endpoints.module.ts @@ -4,7 +4,7 @@ import { BillingModule } from "@/modules/billing/billing.module"; import { ConferencingModule } from "@/modules/conferencing/conferencing.module"; import { DestinationCalendarsModule } from "@/modules/destination-calendars/destination-calendars.module"; import { OAuthClientModule } from "@/modules/oauth-clients/oauth-client.module"; -import { OrganizationsTeamsBookingsModule } from "@/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.module"; +import { OrganizationsTeamsBookingsModule } from "@/modules/organizations/teams/bookings/organizations-teams-bookings.module"; import { RouterModule } from "@/modules/router/router.module"; import { StripeModule } from "@/modules/stripe/stripe.module"; import { TimezoneModule } from "@/modules/timezones/timezones.module"; diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.e2e-spec.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.e2e-spec.ts index 8586b5a674..b359c4126f 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.e2e-spec.ts @@ -3,8 +3,7 @@ import { AppModule } from "@/app.module"; import { HttpExceptionFilter } from "@/filters/http-exception.filter"; import { PrismaExceptionFilter } from "@/filters/prisma-exception.filter"; import { AuthModule } from "@/modules/auth/auth.module"; -import { NextAuthStrategy } from "@/modules/auth/strategies/next-auth/next-auth.strategy"; -import { UpdateOAuthClientInput } from "@/modules/oauth-clients/inputs/update-oauth-client.input"; +import { ApiAuthStrategy } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; import { OAuthClientModule } from "@/modules/oauth-clients/oauth-client.module"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { UsersModule } from "@/modules/users/users.module"; @@ -15,14 +14,27 @@ import { Membership, PlatformOAuthClient, Team, User } from "@prisma/client"; import * as request from "supertest"; import { PlatformBillingRepositoryFixture } from "test/fixtures/repository/billing.repository.fixture"; import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture"; +import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture"; import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture"; import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; -import { NextAuthMockStrategy } from "test/mocks/next-auth-mock.strategy"; +import { ApiAuthMockStrategy } from "test/mocks/api-auth-mock.strategy"; import { randomString } from "test/utils/randomString"; -import { withNextAuth } from "test/utils/withNextAuth"; +import { withApiAuth } from "test/utils/withApiAuth"; -import { SUCCESS_STATUS } from "@calcom/platform-constants"; -import type { CreateOAuthClientInput } from "@calcom/platform-types"; +import { + APPS_READ, + APPS_WRITE, + BOOKING_READ, + BOOKING_WRITE, + EVENT_TYPE_READ, + EVENT_TYPE_WRITE, + PROFILE_READ, + PROFILE_WRITE, + SCHEDULE_READ, + SCHEDULE_WRITE, + SUCCESS_STATUS, +} from "@calcom/platform-constants"; +import type { CreateOAuthClientInput, UpdateOAuthClientInput } from "@calcom/platform-types"; import { ApiSuccessResponse } from "@calcom/platform-types"; describe("OAuth Clients Endpoints", () => { @@ -72,15 +84,15 @@ describe("OAuth Clients Endpoints", () => { const userEmail = `oauth-clients-user-${randomString()}@api.com`; beforeAll(async () => { - const moduleRef = await withNextAuth( + const moduleRef = await withApiAuth( userEmail, Test.createTestingModule({ providers: [PrismaExceptionFilter, HttpExceptionFilter], imports: [AppModule, OAuthClientModule, UsersModule, AuthModule, PrismaModule], }) ).compile(); - const strategy = moduleRef.get(NextAuthStrategy); - expect(strategy).toBeInstanceOf(NextAuthMockStrategy); + const strategy = moduleRef.get(ApiAuthStrategy); + expect(strategy).toBeInstanceOf(ApiAuthMockStrategy); usersFixtures = new UserRepositoryFixture(moduleRef); membershipFixtures = new MembershipRepositoryFixture(moduleRef); teamFixtures = new TeamRepositoryFixture(moduleRef); @@ -123,6 +135,7 @@ describe("OAuth Clients Endpoints", () => { let membershipFixtures: MembershipRepositoryFixture; let teamFixtures: TeamRepositoryFixture; let platformBillingRepositoryFixture: PlatformBillingRepositoryFixture; + let oAuthClientsRepositoryFixture: OAuthClientRepositoryFixture; let user: User; let org: Team; @@ -130,19 +143,20 @@ describe("OAuth Clients Endpoints", () => { const userEmail = `oauth-clients-user-${randomString()}@api.com`; beforeAll(async () => { - const moduleRef = await withNextAuth( + const moduleRef = await withApiAuth( userEmail, Test.createTestingModule({ providers: [PrismaExceptionFilter, HttpExceptionFilter], imports: [AppModule, OAuthClientModule, UsersModule, AuthModule, PrismaModule], }) ).compile(); - const strategy = moduleRef.get(NextAuthStrategy); - expect(strategy).toBeInstanceOf(NextAuthMockStrategy); + const strategy = moduleRef.get(ApiAuthStrategy); + expect(strategy).toBeInstanceOf(ApiAuthMockStrategy); usersFixtures = new UserRepositoryFixture(moduleRef); membershipFixtures = new MembershipRepositoryFixture(moduleRef); teamFixtures = new TeamRepositoryFixture(moduleRef); platformBillingRepositoryFixture = new PlatformBillingRepositoryFixture(moduleRef); + oAuthClientsRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef); user = await usersFixtures.create({ email: userEmail, @@ -218,17 +232,17 @@ describe("OAuth Clients Endpoints", () => { membership = await membershipFixtures.addUserToOrg(user, org, "ADMIN", true); }); - it(`/POST`, () => { + it(`/POST`, async () => { const body: CreateOAuthClientInput = { name: oAuthClientName, redirectUris: ["http://test-oauth-client.com"], - permissions: 32, + permissions: ["BOOKING_READ", "PROFILE_WRITE"], }; return request(app.getHttpServer()) .post("/api/v2/oauth-clients") .send(body) .expect(201) - .then((response) => { + .then(async (response) => { const responseBody: ApiSuccessResponse<{ clientId: string; clientSecret: string }> = response.body; expect(responseBody.status).toEqual(SUCCESS_STATUS); @@ -239,6 +253,9 @@ describe("OAuth Clients Endpoints", () => { clientId: responseBody.data.clientId, clientSecret: responseBody.data.clientSecret, }; + const dbOAuthClient = await oAuthClientsRepositoryFixture.get(client.clientId); + expect(dbOAuthClient).toBeDefined(); + expect(dbOAuthClient?.permissions).toEqual(BOOKING_READ + PROFILE_WRITE); }); }); it(`/GET`, () => { @@ -291,7 +308,18 @@ describe("OAuth Clients Endpoints", () => { let membership: Membership; let client: { clientId: string; clientSecret: string }; const oAuthClientName = `oauth-clients-owner-${randomString()}`; - const oAuthClientPermissions = 32; + const oAuthClientPermissions: CreateOAuthClientInput["permissions"] = [ + "EVENT_TYPE_READ", + "EVENT_TYPE_WRITE", + "BOOKING_READ", + "BOOKING_WRITE", + "SCHEDULE_READ", + "SCHEDULE_WRITE", + "APPS_READ", + "APPS_WRITE", + "PROFILE_READ", + "PROFILE_WRITE", + ]; beforeAll(async () => { membership = await membershipFixtures.addUserToOrg(user, org, "OWNER", true); @@ -301,13 +329,13 @@ describe("OAuth Clients Endpoints", () => { const body: CreateOAuthClientInput = { name: oAuthClientName, redirectUris: ["http://test-oauth-client.com"], - permissions: 32, + permissions: ["*"], }; return request(app.getHttpServer()) .post("/api/v2/oauth-clients") .send(body) .expect(201) - .then((response) => { + .then(async (response) => { const responseBody: ApiSuccessResponse<{ clientId: string; clientSecret: string }> = response.body; expect(responseBody.status).toEqual(SUCCESS_STATUS); @@ -318,6 +346,20 @@ describe("OAuth Clients Endpoints", () => { clientId: responseBody.data.clientId, clientSecret: responseBody.data.clientSecret, }; + const dbOAuthClient = await oAuthClientsRepositoryFixture.get(client.clientId); + expect(dbOAuthClient).toBeDefined(); + expect(dbOAuthClient?.permissions).toEqual( + EVENT_TYPE_READ + + EVENT_TYPE_WRITE + + BOOKING_READ + + BOOKING_WRITE + + SCHEDULE_READ + + SCHEDULE_WRITE + + APPS_READ + + APPS_WRITE + + PROFILE_READ + + PROFILE_WRITE + ); }); }); diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.ts index ac61c7d048..84ecaa6927 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/oauth-clients.controller.ts @@ -1,8 +1,7 @@ -import { getEnv } from "@/env"; import { API_VERSIONS_VALUES } from "@/lib/api-versions"; -import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; +import { GetOrgId } from "@/modules/auth/decorators/get-org-id/get-org-id.decorator"; import { MembershipRoles } from "@/modules/auth/decorators/roles/membership-roles.decorator"; -import { NextAuthGuard } from "@/modules/auth/guards/next-auth/next-auth.guard"; +import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; import { OrganizationRolesGuard } from "@/modules/auth/guards/organization-roles/organization-roles.guard"; import { GetManagedUsersOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-users.output"; import { ManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/managed-user.output"; @@ -10,11 +9,9 @@ import { CreateOAuthClientResponseDto } from "@/modules/oauth-clients/controller import { GetOAuthClientResponseDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto"; import { GetOAuthClientsResponseDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientsResponse.dto"; import { OAuthClientGuard } from "@/modules/oauth-clients/guards/oauth-client-guard"; -import { UpdateOAuthClientInput } from "@/modules/oauth-clients/inputs/update-oauth-client.input"; import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; -import { UsersService } from "@/modules/users/services/users.service"; -import { UserWithProfile } from "@/modules/users/users.repository"; +import { OAuthClientsService } from "@/modules/oauth-clients/services/oauth-clients/oauth-clients.service"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { UsersRepository } from "@/modules/users/users.repository"; import { Body, @@ -33,15 +30,14 @@ import { BadRequestException, } from "@nestjs/common"; import { - ApiTags as DocsTags, - ApiExcludeController as DocsExcludeController, ApiOperation as DocsOperation, ApiCreatedResponse as DocsCreatedResponse, + ApiTags, } from "@nestjs/swagger"; import { User, MembershipRole } from "@prisma/client"; import { SUCCESS_STATUS } from "@calcom/platform-constants"; -import { CreateOAuthClientInput } from "@calcom/platform-types"; +import { CreateOAuthClientInput, UpdateOAuthClientInput } from "@calcom/platform-types"; import { Pagination } from "@calcom/platform-types"; const AUTH_DOCUMENTATION = `⚠️ First, this endpoint requires \`Cookie: next-auth.session-token=eyJhbGciOiJ\` header. Log into Cal web app using owner of organization that was created after visiting \`/settings/organizations/new\`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard. @@ -51,15 +47,16 @@ Second, make sure that the logged in user has organizationId set to pass the Org path: "/v2/oauth-clients", version: API_VERSIONS_VALUES, }) -@UseGuards(NextAuthGuard, OrganizationRolesGuard) +@ApiTags("OAuth Clients") +@UseGuards(ApiAuthGuard, OrganizationRolesGuard) export class OAuthClientsController { private readonly logger = new Logger("OAuthClientController"); constructor( private readonly oauthClientRepository: OAuthClientRepository, + private readonly oAuthClientsService: OAuthClientsService, private readonly userRepository: UsersRepository, - private readonly teamsRepository: OrganizationsRepository, - private usersService: UsersService + private readonly teamsRepository: OrganizationsRepository ) {} @Post("/") @@ -71,10 +68,9 @@ export class OAuthClientsController { type: CreateOAuthClientResponseDto, }) async createOAuthClient( - @GetUser() user: UserWithProfile, + @GetOrgId() organizationId: number, @Body() body: CreateOAuthClientInput ): Promise { - const organizationId = this.usersService.getUserMainOrgId(user) as number; this.logger.log( `For organisation ${organizationId} creating OAuth Client with data: ${JSON.stringify(body)}` ); @@ -84,14 +80,11 @@ export class OAuthClientsController { throw new BadRequestException("Team is not subscribed, cannot create an OAuth Client."); } - const { id, secret } = await this.oauthClientRepository.createOAuthClient(organizationId, body); + const oAuthClientCredentials = await this.oAuthClientsService.createOAuthClient(organizationId, body); return { status: SUCCESS_STATUS, - data: { - clientId: id, - clientSecret: secret, - }, + data: oAuthClientCredentials, }; } @@ -99,10 +92,8 @@ export class OAuthClientsController { @HttpCode(HttpStatus.OK) @MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER, MembershipRole.MEMBER]) @DocsOperation({ description: AUTH_DOCUMENTATION }) - async getOAuthClients(@GetUser() user: UserWithProfile): Promise { - const organizationId = this.usersService.getUserMainOrgId(user) as number; - - const clients = await this.oauthClientRepository.getOrganizationOAuthClients(organizationId); + async getOAuthClients(@GetOrgId() organizationId: number): Promise { + const clients = await this.oAuthClientsService.getOAuthClients(organizationId); return { status: SUCCESS_STATUS, data: clients }; } @@ -112,11 +103,7 @@ export class OAuthClientsController { @DocsOperation({ description: AUTH_DOCUMENTATION }) @UseGuards(OAuthClientGuard) async getOAuthClientById(@Param("clientId") clientId: string): Promise { - const client = await this.oauthClientRepository.getOAuthClient(clientId); - if (!client) { - throw new NotFoundException(`OAuth client with ID ${clientId} not found`); - } - + const client = await this.oAuthClientsService.getOAuthClientById(clientId); return { status: SUCCESS_STATUS, data: client }; } @@ -149,8 +136,7 @@ export class OAuthClientsController { @Body() body: UpdateOAuthClientInput ): Promise { this.logger.log(`For client ${clientId} updating OAuth Client with data: ${JSON.stringify(body)}`); - const client = await this.oauthClientRepository.updateOAuthClient(clientId, body); - + const client = await this.oAuthClientsService.updateOAuthClient(clientId, body); return { status: SUCCESS_STATUS, data: client }; } @@ -161,7 +147,7 @@ export class OAuthClientsController { @UseGuards(OAuthClientGuard) async deleteOAuthClient(@Param("clientId") clientId: string): Promise { this.logger.log(`Deleting OAuth Client with ID: ${clientId}`); - const client = await this.oauthClientRepository.deleteOAuthClient(clientId); + const client = await this.oAuthClientsService.deleteOAuthClient(clientId); return { status: SUCCESS_STATUS, data: client }; } diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto.ts index 83a7f0cd98..fe47f57d28 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto.ts @@ -1,53 +1,9 @@ -import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { ApiProperty } from "@nestjs/swagger"; import { Type } from "class-transformer"; -import { - IsArray, - ValidateNested, - IsEnum, - IsString, - IsNumber, - IsOptional, - IsDate, - IsNotEmptyObject, -} from "class-validator"; +import { ValidateNested, IsEnum, IsNotEmptyObject } from "class-validator"; import { SUCCESS_STATUS, ERROR_STATUS } from "@calcom/platform-constants"; - -export class PlatformOAuthClientDto { - @ApiProperty({ example: "clsx38nbl0001vkhlwin9fmt0" }) - @IsString() - id!: string; - - @ApiProperty({ example: "MyClient" }) - @IsString() - name!: string; - - @ApiProperty({ example: "secretValue" }) - @IsString() - secret!: string; - - @ApiProperty({ example: 3 }) - @IsNumber() - permissions!: number; - - @ApiPropertyOptional({ example: "https://example.com/logo.png" }) - @IsOptional() - @IsString() - logo!: string | null; - - @ApiProperty({ example: ["https://example.com/callback"] }) - @IsArray() - @IsString({ each: true }) - redirectUris!: string[]; - - @ApiProperty({ example: 1 }) - @IsNumber() - organizationId!: number; - - @ApiProperty({ example: "2024-03-23T08:33:21.851Z", type: Date }) - @IsDate() - createdAt!: Date; -} +import { PlatformOAuthClientDto } from "@calcom/platform-types"; export class GetOAuthClientResponseDto { @ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] }) diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientsResponse.dto.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientsResponse.dto.ts index 584729b9f0..55fcc35a47 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientsResponse.dto.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientsResponse.dto.ts @@ -1,9 +1,9 @@ -import { PlatformOAuthClientDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto"; import { ApiProperty } from "@nestjs/swagger"; import { Type } from "class-transformer"; import { IsArray, ValidateNested, IsEnum } from "class-validator"; import { SUCCESS_STATUS, ERROR_STATUS } from "@calcom/platform-constants"; +import { PlatformOAuthClientDto } from "@calcom/platform-types"; export class GetOAuthClientsResponseDto { @ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] }) diff --git a/apps/api/v2/src/modules/oauth-clients/guards/oauth-client-guard.ts b/apps/api/v2/src/modules/oauth-clients/guards/oauth-client-guard.ts index b06eaad2fb..4c61ccc4f4 100644 --- a/apps/api/v2/src/modules/oauth-clients/guards/oauth-client-guard.ts +++ b/apps/api/v2/src/modules/oauth-clients/guards/oauth-client-guard.ts @@ -1,6 +1,7 @@ -import { ApiAuthGuardUser } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { ApiAuthGuardRequest, ApiAuthGuardUser } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository"; import { UsersService } from "@/modules/users/services/users.service"; +import { UserWithProfile } from "@/modules/users/users.repository"; import { Injectable, CanActivate, @@ -15,25 +16,35 @@ export class OAuthClientGuard implements CanActivate { constructor(private oAuthClientRepository: OAuthClientRepository, private usersService: UsersService) {} async canActivate(context: ExecutionContext): Promise { - const request = context.switchToHttp().getRequest(); + const request = context.switchToHttp().getRequest(); + const organizationId = this.getOrganizationId(context); const user: ApiAuthGuardUser = request.user; - const organizationId = user ? this.usersService.getUserMainOrgId(user) : null; const oAuthClientId = request.params.clientId; if (!oAuthClientId) { - throw new ForbiddenException("No OAuth client associated with the request."); + throw new ForbiddenException("OAuthClientGuard - No OAuth client associated with the request."); } if (!user || !organizationId) { - throw new ForbiddenException("No organization associated with the user."); + throw new ForbiddenException("OAuthClientGuard - No organization associated with the user."); } const oAuthClient = await this.oAuthClientRepository.getOAuthClient(oAuthClientId); if (!oAuthClient) { - throw new NotFoundException("OAuth client not found."); + throw new NotFoundException("OAuthClientGuard - OAuth client not found."); } return Boolean(user.isSystemAdmin || oAuthClient.organizationId === organizationId); } + + getOrganizationId(context: ExecutionContext) { + const request = context.switchToHttp().getRequest(); + const user: UserWithProfile = request.user; + const authMethodOrganizationId = request.organizationId; + if (authMethodOrganizationId) return authMethodOrganizationId; + + const userOrganizationId = user ? this.usersService.getUserMainOrgId(user) : null; + return userOrganizationId; + } } diff --git a/apps/api/v2/src/modules/oauth-clients/oauth-client.module.ts b/apps/api/v2/src/modules/oauth-clients/oauth-client.module.ts index d757748d62..8756c2de50 100644 --- a/apps/api/v2/src/modules/oauth-clients/oauth-client.module.ts +++ b/apps/api/v2/src/modules/oauth-clients/oauth-client.module.ts @@ -8,9 +8,12 @@ import { OAuthClientsController } from "@/modules/oauth-clients/controllers/oaut import { OAuthFlowController } from "@/modules/oauth-clients/controllers/oauth-flow/oauth-flow.controller"; import { OAuthClientRepository } from "@/modules/oauth-clients/oauth-client.repository"; import { OAuthClientUsersService } from "@/modules/oauth-clients/services/oauth-clients-users.service"; +import { OAuthClientsInputService } from "@/modules/oauth-clients/services/oauth-clients/oauth-clients-input.service"; +import { OAuthClientsOutputService } from "@/modules/oauth-clients/services/oauth-clients/oauth-clients-output.service"; +import { OAuthClientsService } from "@/modules/oauth-clients/services/oauth-clients/oauth-clients.service"; import { OAuthFlowService } from "@/modules/oauth-clients/services/oauth-flow.service"; import { OrganizationsModule } from "@/modules/organizations/organizations.module"; -import { OrganizationsTeamsService } from "@/modules/organizations/services/organizations-teams.service"; +import { OrganizationsTeamsService } from "@/modules/organizations/teams/index/services/organizations-teams.service"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { RedisModule } from "@/modules/redis/redis.module"; import { StripeModule } from "@/modules/stripe/stripe.module"; @@ -18,6 +21,7 @@ import { TokensModule } from "@/modules/tokens/tokens.module"; import { TokensRepository } from "@/modules/tokens/tokens.repository"; import { UsersModule } from "@/modules/users/users.module"; import { Global, Module } from "@nestjs/common"; +import { JwtService } from "@nestjs/jwt"; @Global() @Module({ @@ -40,6 +44,10 @@ import { Global, Module } from "@nestjs/common"; OAuthFlowService, OAuthClientUsersService, OrganizationsTeamsService, + OAuthClientsService, + OAuthClientsInputService, + OAuthClientsOutputService, + JwtService, ], controllers: [OAuthClientUsersController, OAuthClientsController, OAuthFlowController], exports: [OAuthClientRepository], diff --git a/apps/api/v2/src/modules/oauth-clients/oauth-client.repository.ts b/apps/api/v2/src/modules/oauth-clients/oauth-client.repository.ts index dbbf2dbf21..a449f9544e 100644 --- a/apps/api/v2/src/modules/oauth-clients/oauth-client.repository.ts +++ b/apps/api/v2/src/modules/oauth-clients/oauth-client.repository.ts @@ -1,24 +1,19 @@ -import { JwtService } from "@/modules/jwt/jwt.service"; import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; -import type { PlatformOAuthClient } from "@prisma/client"; - -import type { CreateOAuthClientInput } from "@calcom/platform-types"; +import type { PlatformOAuthClient, Prisma } from "@prisma/client"; @Injectable() export class OAuthClientRepository { - constructor( - private readonly dbRead: PrismaReadService, - private readonly dbWrite: PrismaWriteService, - private jwtService: JwtService - ) {} + constructor(private readonly dbRead: PrismaReadService, private readonly dbWrite: PrismaWriteService) {} - async createOAuthClient(organizationId: number, data: CreateOAuthClientInput) { + async createOAuthClient( + organizationId: number, + data: Omit + ) { return this.dbWrite.prisma.platformOAuthClient.create({ data: { ...data, - secret: this.jwtService.sign(data), organizationId, }, }); @@ -86,7 +81,7 @@ export class OAuthClientRepository { async updateOAuthClient( clientId: string, - updateData: Partial + updateData: Prisma.PlatformOAuthClientUpdateInput ): Promise { return this.dbWrite.prisma.platformOAuthClient.update({ where: { id: clientId }, diff --git a/apps/api/v2/src/modules/oauth-clients/services/oauth-clients-users.service.ts b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients-users.service.ts index 338361ca78..b6762e6541 100644 --- a/apps/api/v2/src/modules/oauth-clients/services/oauth-clients-users.service.ts +++ b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients-users.service.ts @@ -1,6 +1,6 @@ import { EventTypesService_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/services/event-types.service"; import { SchedulesService_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/services/schedules.service"; -import { OrganizationsTeamsService } from "@/modules/organizations/services/organizations-teams.service"; +import { OrganizationsTeamsService } from "@/modules/organizations/teams/index/services/organizations-teams.service"; import { TokensRepository } from "@/modules/tokens/tokens.repository"; import { CreateManagedUserInput } from "@/modules/users/inputs/create-managed-user.input"; import { UpdateManagedUserInput } from "@/modules/users/inputs/update-managed-user.input"; diff --git a/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients-input.service.ts b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients-input.service.ts new file mode 100644 index 0000000000..40f689f416 --- /dev/null +++ b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients-input.service.ts @@ -0,0 +1,29 @@ +import { JwtService } from "@/modules/jwt/jwt.service"; +import { Injectable } from "@nestjs/common"; + +import { PERMISSION_MAP } from "@calcom/platform-constants"; +import { CreateOAuthClientInput } from "@calcom/platform-types"; + +@Injectable() +export class OAuthClientsInputService { + constructor(private readonly jwtService: JwtService) {} + + transformCreateOAuthClientInput(input: CreateOAuthClientInput) { + const transformed = { + ...input, + permissions: this.transformPermissions(input.permissions), + }; + + return { + ...transformed, + secret: this.jwtService.sign(transformed), + }; + } + + transformPermissions(permissions: Array): number { + const values = permissions.includes("*") + ? Object.values(PERMISSION_MAP) + : permissions.map((p) => PERMISSION_MAP[p as keyof typeof PERMISSION_MAP]); + return values.reduce((acc, val) => acc | val, 0); + } +} diff --git a/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients-output.service.ts b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients-output.service.ts new file mode 100644 index 0000000000..280f76e975 --- /dev/null +++ b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients-output.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from "@nestjs/common"; +import { PlatformOAuthClient } from "@prisma/client"; + +import { PERMISSIONS, PERMISSION_MAP } from "@calcom/platform-constants"; +import { PlatformOAuthClientDto } from "@calcom/platform-types"; + +@Injectable() +export class OAuthClientsOutputService { + transformPermissions(permissionsNumber: number): Array { + const permissionNumbers = PERMISSIONS.filter( + (permission) => (permissionsNumber & permission) === permission + ); + + return permissionNumbers.map( + (permission) => + Object.entries(PERMISSION_MAP).find( + ([_, value]) => value === permission + )?.[0] as keyof typeof PERMISSION_MAP + ); + } + + transformOAuthClient(client: PlatformOAuthClient): PlatformOAuthClientDto { + return { + id: client.id, + name: client.name, + secret: client.secret, + permissions: this.transformPermissions(client.permissions), + logo: client.logo, + redirectUris: client.redirectUris, + organizationId: client.organizationId, + createdAt: client.createdAt, + bookingRedirectUri: client.bookingRedirectUri ?? undefined, + bookingCancelRedirectUri: client.bookingCancelRedirectUri ?? undefined, + bookingRescheduleRedirectUri: client.bookingRescheduleRedirectUri ?? undefined, + areEmailsEnabled: client.areEmailsEnabled, + }; + } + + transformOAuthClients(clients: PlatformOAuthClient[]): PlatformOAuthClientDto[] { + return clients.map((client) => this.transformOAuthClient(client)); + } +} diff --git a/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients.service.ts b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients.service.ts new file mode 100644 index 0000000000..f61db1af93 --- /dev/null +++ b/apps/api/v2/src/modules/oauth-clients/services/oauth-clients/oauth-clients.service.ts @@ -0,0 +1,53 @@ +import { Injectable, NotFoundException } from "@nestjs/common"; + +import { CreateOAuthClientInput, UpdateOAuthClientInput } from "@calcom/platform-types"; + +import { OAuthClientRepository } from "../../oauth-client.repository"; +import { OAuthClientsInputService } from "./oauth-clients-input.service"; +import { OAuthClientsOutputService } from "./oauth-clients-output.service"; + +@Injectable() +export class OAuthClientsService { + constructor( + private readonly oauthClientRepository: OAuthClientRepository, + private readonly oauthClientsInputService: OAuthClientsInputService, + private readonly oauthClientsOutputService: OAuthClientsOutputService + ) {} + + async createOAuthClient(organizationId: number, input: CreateOAuthClientInput) { + const transformedInput = this.oauthClientsInputService.transformCreateOAuthClientInput(input); + + const { id, secret } = await this.oauthClientRepository.createOAuthClient( + organizationId, + transformedInput + ); + + return { + clientId: id, + clientSecret: secret, + }; + } + + async getOAuthClients(organizationId: number) { + const clients = await this.oauthClientRepository.getOrganizationOAuthClients(organizationId); + return this.oauthClientsOutputService.transformOAuthClients(clients); + } + + async getOAuthClientById(clientId: string) { + const client = await this.oauthClientRepository.getOAuthClient(clientId); + if (!client) { + throw new NotFoundException(`OAuth client with ID ${clientId} not found`); + } + return this.oauthClientsOutputService.transformOAuthClient(client); + } + + async updateOAuthClient(clientId: string, input: UpdateOAuthClientInput) { + const client = await this.oauthClientRepository.updateOAuthClient(clientId, input); + return this.oauthClientsOutputService.transformOAuthClient(client); + } + + async deleteOAuthClient(clientId: string) { + const client = await this.oauthClientRepository.deleteOAuthClient(clientId); + return this.oauthClientsOutputService.transformOAuthClient(client); + } +} diff --git a/apps/api/v2/src/modules/organizations/controllers/attributes/organization-attributes.e2e-spec.ts b/apps/api/v2/src/modules/organizations/attributes/index/controllers/organization-attributes.e2e-spec.ts similarity index 98% rename from apps/api/v2/src/modules/organizations/controllers/attributes/organization-attributes.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/attributes/index/controllers/organization-attributes.e2e-spec.ts index c7d75c8fd4..a73244e651 100644 --- a/apps/api/v2/src/modules/organizations/controllers/attributes/organization-attributes.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/controllers/organization-attributes.e2e-spec.ts @@ -1,7 +1,7 @@ import { bootstrap } from "@/app"; import { AppModule } from "@/app.module"; -import { CreateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/create-organization-attribute.input"; -import { UpdateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/update-organization-attribute.input"; +import { CreateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/create-organization-attribute.input"; +import { UpdateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/update-organization-attribute.input"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { TokensModule } from "@/modules/tokens/tokens.module"; import { UsersModule } from "@/modules/users/users.module"; diff --git a/apps/api/v2/src/modules/organizations/controllers/attributes/organizations-attributes.controller.ts b/apps/api/v2/src/modules/organizations/attributes/index/controllers/organizations-attributes.controller.ts similarity index 89% rename from apps/api/v2/src/modules/organizations/controllers/attributes/organizations-attributes.controller.ts rename to apps/api/v2/src/modules/organizations/attributes/index/controllers/organizations-attributes.controller.ts index 7cb6270f8e..ea38461a90 100644 --- a/apps/api/v2/src/modules/organizations/controllers/attributes/organizations-attributes.controller.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/controllers/organizations-attributes.controller.ts @@ -6,16 +6,16 @@ import { PlatformPlanGuard } from "@/modules/auth/guards/billing/platform-plan.g import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-admin-api-enabled.guard"; import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; -import { CreateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/create-organization-attribute.input"; -import { UpdateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/update-organization-attribute.input"; -import { CreateOrganizationAttributesOutput } from "@/modules/organizations/outputs/attributes/create-organization-attributes.output"; -import { DeleteOrganizationAttributesOutput } from "@/modules/organizations/outputs/attributes/delete-organization-attributes.output"; +import { CreateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/create-organization-attribute.input"; +import { UpdateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/update-organization-attribute.input"; +import { CreateOrganizationAttributesOutput } from "@/modules/organizations/attributes/index/outputs/create-organization-attributes.output"; +import { DeleteOrganizationAttributesOutput } from "@/modules/organizations/attributes/index/outputs/delete-organization-attributes.output"; import { GetOrganizationAttributesOutput, GetSingleAttributeOutput, -} from "@/modules/organizations/outputs/attributes/get-organization-attributes.output"; -import { UpdateOrganizationAttributesOutput } from "@/modules/organizations/outputs/attributes/update-organization-attributes.output"; -import { OrganizationAttributesService } from "@/modules/organizations/services/attributes/organization-attributes.service"; +} from "@/modules/organizations/attributes/index/outputs/get-organization-attributes.output"; +import { UpdateOrganizationAttributesOutput } from "@/modules/organizations/attributes/index/outputs/update-organization-attributes.output"; +import { OrganizationAttributesService } from "@/modules/organizations/attributes/index/services/organization-attributes.service"; import { Body, Controller, diff --git a/apps/api/v2/src/modules/organizations/inputs/attributes/create-organization-attribute.input.ts b/apps/api/v2/src/modules/organizations/attributes/index/inputs/create-organization-attribute.input.ts similarity index 94% rename from apps/api/v2/src/modules/organizations/inputs/attributes/create-organization-attribute.input.ts rename to apps/api/v2/src/modules/organizations/attributes/index/inputs/create-organization-attribute.input.ts index d292e5238c..273024ec8e 100644 --- a/apps/api/v2/src/modules/organizations/inputs/attributes/create-organization-attribute.input.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/inputs/create-organization-attribute.input.ts @@ -1,4 +1,4 @@ -import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/create-organization-attribute-option.input"; +import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input"; import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; import { AttributeType } from "@prisma/client"; import { Type } from "class-transformer"; diff --git a/apps/api/v2/src/modules/organizations/inputs/attributes/update-organization-attribute.input.ts b/apps/api/v2/src/modules/organizations/attributes/index/inputs/update-organization-attribute.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/attributes/update-organization-attribute.input.ts rename to apps/api/v2/src/modules/organizations/attributes/index/inputs/update-organization-attribute.input.ts diff --git a/apps/api/v2/src/modules/organizations/repositories/attributes/organization-attribute.repository.ts b/apps/api/v2/src/modules/organizations/attributes/index/organization-attributes.repository.ts similarity index 94% rename from apps/api/v2/src/modules/organizations/repositories/attributes/organization-attribute.repository.ts rename to apps/api/v2/src/modules/organizations/attributes/index/organization-attributes.repository.ts index 0b3a7314d3..7a6c6d6a2b 100644 --- a/apps/api/v2/src/modules/organizations/repositories/attributes/organization-attribute.repository.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/organization-attributes.repository.ts @@ -1,5 +1,5 @@ -import { CreateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/create-organization-attribute.input"; -import { UpdateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/update-organization-attribute.input"; +import { CreateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/create-organization-attribute.input"; +import { UpdateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/update-organization-attribute.input"; import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/attribute.output.ts b/apps/api/v2/src/modules/organizations/attributes/index/outputs/attribute.output.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/outputs/attributes/attribute.output.ts rename to apps/api/v2/src/modules/organizations/attributes/index/outputs/attribute.output.ts diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/base.output.ts b/apps/api/v2/src/modules/organizations/attributes/index/outputs/base.output.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/outputs/attributes/base.output.ts rename to apps/api/v2/src/modules/organizations/attributes/index/outputs/base.output.ts diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/create-organization-attributes.output.ts b/apps/api/v2/src/modules/organizations/attributes/index/outputs/create-organization-attributes.output.ts similarity index 57% rename from apps/api/v2/src/modules/organizations/outputs/attributes/create-organization-attributes.output.ts rename to apps/api/v2/src/modules/organizations/attributes/index/outputs/create-organization-attributes.output.ts index aa2ff2f547..d0cafc9ae0 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/create-organization-attributes.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/outputs/create-organization-attributes.output.ts @@ -1,5 +1,5 @@ -import { Attribute } from "@/modules/organizations/outputs/attributes/attribute.output"; -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; +import { Attribute } from "@/modules/organizations/attributes/index/outputs/attribute.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; import { Expose, Type } from "class-transformer"; import { ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/delete-organization-attributes.output.ts b/apps/api/v2/src/modules/organizations/attributes/index/outputs/delete-organization-attributes.output.ts similarity index 57% rename from apps/api/v2/src/modules/organizations/outputs/attributes/delete-organization-attributes.output.ts rename to apps/api/v2/src/modules/organizations/attributes/index/outputs/delete-organization-attributes.output.ts index 5aa36314c9..e036a2666f 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/delete-organization-attributes.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/outputs/delete-organization-attributes.output.ts @@ -1,5 +1,5 @@ -import { Attribute } from "@/modules/organizations/outputs/attributes/attribute.output"; -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; +import { Attribute } from "@/modules/organizations/attributes/index/outputs/attribute.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; import { Expose, Type } from "class-transformer"; import { ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/get-organization-attributes.output.ts b/apps/api/v2/src/modules/organizations/attributes/index/outputs/get-organization-attributes.output.ts similarity index 75% rename from apps/api/v2/src/modules/organizations/outputs/attributes/get-organization-attributes.output.ts rename to apps/api/v2/src/modules/organizations/attributes/index/outputs/get-organization-attributes.output.ts index d77ac00284..28d85f4553 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/get-organization-attributes.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/outputs/get-organization-attributes.output.ts @@ -1,5 +1,5 @@ -import { Attribute } from "@/modules/organizations/outputs/attributes/attribute.output"; -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; +import { Attribute } from "@/modules/organizations/attributes/index/outputs/attribute.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; import { ApiProperty } from "@nestjs/swagger"; import { Expose, Type } from "class-transformer"; import { IsOptional, ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/update-organization-attributes.output.ts b/apps/api/v2/src/modules/organizations/attributes/index/outputs/update-organization-attributes.output.ts similarity index 57% rename from apps/api/v2/src/modules/organizations/outputs/attributes/update-organization-attributes.output.ts rename to apps/api/v2/src/modules/organizations/attributes/index/outputs/update-organization-attributes.output.ts index 3aa5b2c9b4..d5fb7e9a4a 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/update-organization-attributes.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/outputs/update-organization-attributes.output.ts @@ -1,5 +1,5 @@ -import { Attribute } from "@/modules/organizations/outputs/attributes/attribute.output"; -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; +import { Attribute } from "@/modules/organizations/attributes/index/outputs/attribute.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; import { Expose, Type } from "class-transformer"; import { ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/services/attributes/organization-attributes.service.ts b/apps/api/v2/src/modules/organizations/attributes/index/services/organization-attributes.service.ts similarity index 89% rename from apps/api/v2/src/modules/organizations/services/attributes/organization-attributes.service.ts rename to apps/api/v2/src/modules/organizations/attributes/index/services/organization-attributes.service.ts index a7a67215c4..97a2b9fc8a 100644 --- a/apps/api/v2/src/modules/organizations/services/attributes/organization-attributes.service.ts +++ b/apps/api/v2/src/modules/organizations/attributes/index/services/organization-attributes.service.ts @@ -1,6 +1,6 @@ -import { CreateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/create-organization-attribute.input"; -import { UpdateOrganizationAttributeInput } from "@/modules/organizations/inputs/attributes/update-organization-attribute.input"; -import { OrganizationAttributesRepository } from "@/modules/organizations/repositories/attributes/organization-attribute.repository"; +import { CreateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/create-organization-attribute.input"; +import { UpdateOrganizationAttributeInput } from "@/modules/organizations/attributes/index/inputs/update-organization-attribute.input"; +import { OrganizationAttributesRepository } from "@/modules/organizations/attributes/index/organization-attributes.repository"; import { Injectable } from "@nestjs/common"; @Injectable() diff --git a/apps/api/v2/src/modules/organizations/inputs/attributes/options/create-organization-attribute-option.input.ts b/apps/api/v2/src/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/attributes/options/create-organization-attribute-option.input.ts rename to apps/api/v2/src/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input.ts diff --git a/apps/api/v2/src/modules/organizations/inputs/attributes/assign/organizations-attributes-options-assign.input.ts b/apps/api/v2/src/modules/organizations/attributes/options/inputs/organizations-attributes-options-assign.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/attributes/assign/organizations-attributes-options-assign.input.ts rename to apps/api/v2/src/modules/organizations/attributes/options/inputs/organizations-attributes-options-assign.input.ts diff --git a/apps/api/v2/src/modules/organizations/inputs/attributes/options/update-organizaiton-attribute-option.input.ts.ts b/apps/api/v2/src/modules/organizations/attributes/options/inputs/update-organizaiton-attribute-option.input.ts.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/attributes/options/update-organizaiton-attribute-option.input.ts.ts rename to apps/api/v2/src/modules/organizations/attributes/options/inputs/update-organizaiton-attribute-option.input.ts.ts diff --git a/apps/api/v2/src/modules/organizations/repositories/attributes/organization-attribute-option.repository.ts b/apps/api/v2/src/modules/organizations/attributes/options/organization-attribute-options.repository.ts similarity index 96% rename from apps/api/v2/src/modules/organizations/repositories/attributes/organization-attribute-option.repository.ts rename to apps/api/v2/src/modules/organizations/attributes/options/organization-attribute-options.repository.ts index 150965bdf0..2c77a0ba53 100644 --- a/apps/api/v2/src/modules/organizations/repositories/attributes/organization-attribute-option.repository.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/organization-attribute-options.repository.ts @@ -1,6 +1,6 @@ -import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/create-organization-attribute-option.input"; -import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/update-organizaiton-attribute-option.input.ts"; -import { OrganizationsMembershipService } from "@/modules/organizations/services/organizations-membership.service"; +import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input"; +import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/update-organizaiton-attribute-option.input.ts"; +import { OrganizationsMembershipService } from "@/modules/organizations/memberships/services/organizations-membership.service"; import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable, Logger, NotFoundException } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/controllers/attributes/organization-attributes-options.e2e-spec.ts b/apps/api/v2/src/modules/organizations/attributes/options/organization-attributes-options.e2e-spec.ts similarity index 97% rename from apps/api/v2/src/modules/organizations/controllers/attributes/organization-attributes-options.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/attributes/options/organization-attributes-options.e2e-spec.ts index b16f0504a5..7fc76901e6 100644 --- a/apps/api/v2/src/modules/organizations/controllers/attributes/organization-attributes-options.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/organization-attributes-options.e2e-spec.ts @@ -1,8 +1,8 @@ import { bootstrap } from "@/app"; import { AppModule } from "@/app.module"; -import { AssignOrganizationAttributeOptionToUserInput } from "@/modules/organizations/inputs/attributes/assign/organizations-attributes-options-assign.input"; -import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/create-organization-attribute-option.input"; -import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/update-organizaiton-attribute-option.input.ts"; +import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input"; +import { AssignOrganizationAttributeOptionToUserInput } from "@/modules/organizations/attributes/options/inputs/organizations-attributes-options-assign.input"; +import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/update-organizaiton-attribute-option.input.ts"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { TokensModule } from "@/modules/tokens/tokens.module"; import { UsersModule } from "@/modules/users/users.module"; diff --git a/apps/api/v2/src/modules/organizations/controllers/attributes/organizations-attributes-options.controller.ts b/apps/api/v2/src/modules/organizations/attributes/options/organizations-attributes-options.controller.ts similarity index 89% rename from apps/api/v2/src/modules/organizations/controllers/attributes/organizations-attributes-options.controller.ts rename to apps/api/v2/src/modules/organizations/attributes/options/organizations-attributes-options.controller.ts index 14fce71f99..56ed7e5347 100644 --- a/apps/api/v2/src/modules/organizations/controllers/attributes/organizations-attributes-options.controller.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/organizations-attributes-options.controller.ts @@ -6,19 +6,19 @@ import { PlatformPlanGuard } from "@/modules/auth/guards/billing/platform-plan.g import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-admin-api-enabled.guard"; import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; -import { AssignOrganizationAttributeOptionToUserInput } from "@/modules/organizations/inputs/attributes/assign/organizations-attributes-options-assign.input"; -import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/create-organization-attribute-option.input"; -import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/update-organizaiton-attribute-option.input.ts"; +import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input"; +import { AssignOrganizationAttributeOptionToUserInput } from "@/modules/organizations/attributes/options/inputs/organizations-attributes-options-assign.input"; +import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/update-organizaiton-attribute-option.input.ts"; import { AssignOptionUserOutput, UnassignOptionUserOutput, -} from "@/modules/organizations/outputs/attributes/options/assign-option-user.output"; -import { CreateAttributeOptionOutput } from "@/modules/organizations/outputs/attributes/options/create-option.output"; -import { DeleteAttributeOptionOutput } from "@/modules/organizations/outputs/attributes/options/delete-option.output"; -import { GetOptionUserOutput } from "@/modules/organizations/outputs/attributes/options/get-option-user.output"; -import { GetAllAttributeOptionOutput } from "@/modules/organizations/outputs/attributes/options/get-option.output"; -import { UpdateAttributeOptionOutput } from "@/modules/organizations/outputs/attributes/options/update-option.output"; -import { OrganizationAttributeOptionService } from "@/modules/organizations/services/attributes/organization-attributes-option.service"; +} from "@/modules/organizations/attributes/options/outputs/assign-option-user.output"; +import { CreateAttributeOptionOutput } from "@/modules/organizations/attributes/options/outputs/create-option.output"; +import { DeleteAttributeOptionOutput } from "@/modules/organizations/attributes/options/outputs/delete-option.output"; +import { GetOptionUserOutput } from "@/modules/organizations/attributes/options/outputs/get-option-user.output"; +import { GetAllAttributeOptionOutput } from "@/modules/organizations/attributes/options/outputs/get-option.output"; +import { UpdateAttributeOptionOutput } from "@/modules/organizations/attributes/options/outputs/update-option.output"; +import { OrganizationAttributeOptionService } from "@/modules/organizations/attributes/options/services/organization-attributes-option.service"; import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, UseGuards } from "@nestjs/common"; import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; @@ -30,7 +30,7 @@ import { SUCCESS_STATUS } from "@calcom/platform-constants"; }) @UseGuards(ApiAuthGuard, IsOrgGuard, RolesGuard, PlatformPlanGuard, IsAdminAPIEnabledGuard) @DocsTags("Orgs / Attributes / Options") -export class OrganizationsOptionsAttributesController { +export class OrganizationsAttributesOptionsController { constructor(private readonly organizationsAttributesOptionsService: OrganizationAttributeOptionService) {} @Roles("ORG_ADMIN") diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/options/assign-option-user.output.ts b/apps/api/v2/src/modules/organizations/attributes/options/outputs/assign-option-user.output.ts similarity index 83% rename from apps/api/v2/src/modules/organizations/outputs/attributes/options/assign-option-user.output.ts rename to apps/api/v2/src/modules/organizations/attributes/options/outputs/assign-option-user.output.ts index fdb8fae13d..7c4ecd05f2 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/options/assign-option-user.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/outputs/assign-option-user.output.ts @@ -1,5 +1,5 @@ -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; -import { OptionOutput } from "@/modules/organizations/outputs/attributes/options/option.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; +import { OptionOutput } from "@/modules/organizations/attributes/options/outputs/option.output"; import { ApiProperty } from "@nestjs/swagger"; import { Expose, Type } from "class-transformer"; import { IsString, ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/options/create-option.output.ts b/apps/api/v2/src/modules/organizations/attributes/options/outputs/create-option.output.ts similarity index 56% rename from apps/api/v2/src/modules/organizations/outputs/attributes/options/create-option.output.ts rename to apps/api/v2/src/modules/organizations/attributes/options/outputs/create-option.output.ts index 81f83e67f1..edc8d7d912 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/options/create-option.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/outputs/create-option.output.ts @@ -1,5 +1,5 @@ -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; -import { OptionOutput } from "@/modules/organizations/outputs/attributes/options/option.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; +import { OptionOutput } from "@/modules/organizations/attributes/options/outputs/option.output"; import { Expose, Type } from "class-transformer"; import { ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/options/delete-option.output.ts b/apps/api/v2/src/modules/organizations/attributes/options/outputs/delete-option.output.ts similarity index 56% rename from apps/api/v2/src/modules/organizations/outputs/attributes/options/delete-option.output.ts rename to apps/api/v2/src/modules/organizations/attributes/options/outputs/delete-option.output.ts index 6b6203e8b0..6f6306494c 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/options/delete-option.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/outputs/delete-option.output.ts @@ -1,5 +1,5 @@ -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; -import { OptionOutput } from "@/modules/organizations/outputs/attributes/options/option.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; +import { OptionOutput } from "@/modules/organizations/attributes/options/outputs/option.output"; import { Expose, Type } from "class-transformer"; import { ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/options/get-option-user.output.ts b/apps/api/v2/src/modules/organizations/attributes/options/outputs/get-option-user.output.ts similarity index 90% rename from apps/api/v2/src/modules/organizations/outputs/attributes/options/get-option-user.output.ts rename to apps/api/v2/src/modules/organizations/attributes/options/outputs/get-option-user.output.ts index 6f29020fd3..2e31b64bd6 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/options/get-option-user.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/outputs/get-option-user.output.ts @@ -1,4 +1,4 @@ -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; import { ApiProperty } from "@nestjs/swagger"; import { Expose, Type } from "class-transformer"; import { IsString, ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/options/get-option.output.ts b/apps/api/v2/src/modules/organizations/attributes/options/outputs/get-option.output.ts similarity index 56% rename from apps/api/v2/src/modules/organizations/outputs/attributes/options/get-option.output.ts rename to apps/api/v2/src/modules/organizations/attributes/options/outputs/get-option.output.ts index 11b9cd5066..52a1e8800e 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/options/get-option.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/outputs/get-option.output.ts @@ -1,5 +1,5 @@ -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; -import { OptionOutput } from "@/modules/organizations/outputs/attributes/options/option.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; +import { OptionOutput } from "@/modules/organizations/attributes/options/outputs/option.output"; import { Expose, Type } from "class-transformer"; import { ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/options/option.output.ts b/apps/api/v2/src/modules/organizations/attributes/options/outputs/option.output.ts similarity index 89% rename from apps/api/v2/src/modules/organizations/outputs/attributes/options/option.output.ts rename to apps/api/v2/src/modules/organizations/attributes/options/outputs/option.output.ts index f3c202fc0a..f879806900 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/options/option.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/outputs/option.output.ts @@ -1,4 +1,4 @@ -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; import { ApiProperty } from "@nestjs/swagger"; import { IsString, IsInt, IsEnum, IsBoolean } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/attributes/options/update-option.output.ts b/apps/api/v2/src/modules/organizations/attributes/options/outputs/update-option.output.ts similarity index 56% rename from apps/api/v2/src/modules/organizations/outputs/attributes/options/update-option.output.ts rename to apps/api/v2/src/modules/organizations/attributes/options/outputs/update-option.output.ts index 14b85aa2de..9d1e94bfb9 100644 --- a/apps/api/v2/src/modules/organizations/outputs/attributes/options/update-option.output.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/outputs/update-option.output.ts @@ -1,5 +1,5 @@ -import { BaseOutputDTO } from "@/modules/organizations/outputs/attributes/base.output"; -import { OptionOutput } from "@/modules/organizations/outputs/attributes/options/option.output"; +import { BaseOutputDTO } from "@/modules/organizations/attributes/index/outputs/base.output"; +import { OptionOutput } from "@/modules/organizations/attributes/options/outputs/option.output"; import { Expose, Type } from "class-transformer"; import { ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/services/attributes/organization-attributes-option.service.ts b/apps/api/v2/src/modules/organizations/attributes/options/services/organization-attributes-option.service.ts similarity index 89% rename from apps/api/v2/src/modules/organizations/services/attributes/organization-attributes-option.service.ts rename to apps/api/v2/src/modules/organizations/attributes/options/services/organization-attributes-option.service.ts index c0f73b34b3..000a14c62b 100644 --- a/apps/api/v2/src/modules/organizations/services/attributes/organization-attributes-option.service.ts +++ b/apps/api/v2/src/modules/organizations/attributes/options/services/organization-attributes-option.service.ts @@ -1,9 +1,9 @@ -import { AssignOrganizationAttributeOptionToUserInput } from "@/modules/organizations/inputs/attributes/assign/organizations-attributes-options-assign.input"; -import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/create-organization-attribute-option.input"; -import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/inputs/attributes/options/update-organizaiton-attribute-option.input.ts"; -import { OrganizationAttributeOptionRepository } from "@/modules/organizations/repositories/attributes/organization-attribute-option.repository"; -import { OrganizationAttributesService } from "@/modules/organizations/services/attributes/organization-attributes.service"; -import { OrganizationsMembershipService } from "@/modules/organizations/services/organizations-membership.service"; +import { OrganizationAttributesService } from "@/modules/organizations/attributes/index/services/organization-attributes.service"; +import { CreateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/create-organization-attribute-option.input"; +import { AssignOrganizationAttributeOptionToUserInput } from "@/modules/organizations/attributes/options/inputs/organizations-attributes-options-assign.input"; +import { UpdateOrganizationAttributeOptionInput } from "@/modules/organizations/attributes/options/inputs/update-organizaiton-attribute-option.input.ts"; +import { OrganizationAttributeOptionRepository } from "@/modules/organizations/attributes/options/organization-attribute-options.repository"; +import { OrganizationsMembershipService } from "@/modules/organizations/memberships/services/organizations-membership.service"; import { BadRequestException, Injectable, Logger, NotFoundException } from "@nestjs/common"; const TYPE_SUPPORTS_VALUE = new Set(["TEXT", "NUMBER"]); diff --git a/apps/api/v2/src/modules/organizations/controllers/event-types/organizations-event-types.controller.ts b/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.controller.ts similarity index 96% rename from apps/api/v2/src/modules/organizations/controllers/event-types/organizations-event-types.controller.ts rename to apps/api/v2/src/modules/organizations/event-types/organizations-event-types.controller.ts index 433dcc88df..ab7fec446b 100644 --- a/apps/api/v2/src/modules/organizations/controllers/event-types/organizations-event-types.controller.ts +++ b/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.controller.ts @@ -10,10 +10,10 @@ import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-a import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; import { IsTeamInOrg } from "@/modules/auth/guards/teams/is-team-in-org.guard"; -import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/controllers/pipes/event-types/team-event-types-response.transformer"; -import { InputOrganizationsEventTypesService } from "@/modules/organizations/services/event-types/input.service"; -import { OrganizationsEventTypesService } from "@/modules/organizations/services/event-types/organizations-event-types.service"; -import { DatabaseTeamEventType } from "@/modules/organizations/services/event-types/output.service"; +import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/event-types/pipes/team-event-types-response.transformer"; +import { InputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/input.service"; +import { OrganizationsEventTypesService } from "@/modules/organizations/event-types/services/organizations-event-types.service"; +import { DatabaseTeamEventType } from "@/modules/organizations/event-types/services/output.service"; import { CreateTeamEventTypeOutput } from "@/modules/teams/event-types/outputs/create-team-event-type.output"; import { DeleteTeamEventTypeOutput } from "@/modules/teams/event-types/outputs/delete-team-event-type.output"; import { GetTeamEventTypeOutput } from "@/modules/teams/event-types/outputs/get-team-event-type.output"; diff --git a/apps/api/v2/src/modules/organizations/controllers/event-types/organizations-event-types.e2e-spec.ts b/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.e2e-spec.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/event-types/organizations-event-types.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/event-types/organizations-event-types.e2e-spec.ts diff --git a/apps/api/v2/src/modules/organizations/repositories/organizations-event-types.repository.ts b/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.repository.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/repositories/organizations-event-types.repository.ts rename to apps/api/v2/src/modules/organizations/event-types/organizations-event-types.repository.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/pipes/event-types/team-event-types-response.transformer.ts b/apps/api/v2/src/modules/organizations/event-types/pipes/team-event-types-response.transformer.ts similarity index 90% rename from apps/api/v2/src/modules/organizations/controllers/pipes/event-types/team-event-types-response.transformer.ts rename to apps/api/v2/src/modules/organizations/event-types/pipes/team-event-types-response.transformer.ts index 091bdee2ff..0aa4061ac8 100644 --- a/apps/api/v2/src/modules/organizations/controllers/pipes/event-types/team-event-types-response.transformer.ts +++ b/apps/api/v2/src/modules/organizations/event-types/pipes/team-event-types-response.transformer.ts @@ -1,5 +1,5 @@ -import { OutputOrganizationsEventTypesService } from "@/modules/organizations/services/event-types/output.service"; -import { DatabaseTeamEventType } from "@/modules/organizations/services/event-types/output.service"; +import { OutputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/output.service"; +import { DatabaseTeamEventType } from "@/modules/organizations/event-types/services/output.service"; import { Injectable, PipeTransform } from "@nestjs/common"; import { plainToClass } from "class-transformer"; diff --git a/apps/api/v2/src/modules/organizations/services/event-types/input.service.ts b/apps/api/v2/src/modules/organizations/event-types/services/input.service.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/services/event-types/input.service.ts rename to apps/api/v2/src/modules/organizations/event-types/services/input.service.ts diff --git a/apps/api/v2/src/modules/organizations/services/event-types/organizations-event-types.service.ts b/apps/api/v2/src/modules/organizations/event-types/services/organizations-event-types.service.ts similarity index 95% rename from apps/api/v2/src/modules/organizations/services/event-types/organizations-event-types.service.ts rename to apps/api/v2/src/modules/organizations/event-types/services/organizations-event-types.service.ts index e6af4fa48a..ac8e0cc384 100644 --- a/apps/api/v2/src/modules/organizations/services/event-types/organizations-event-types.service.ts +++ b/apps/api/v2/src/modules/organizations/event-types/services/organizations-event-types.service.ts @@ -1,6 +1,6 @@ import { MembershipsRepository } from "@/modules/memberships/memberships.repository"; -import { OrganizationsEventTypesRepository } from "@/modules/organizations/repositories/organizations-event-types.repository"; -import { DatabaseTeamEventType } from "@/modules/organizations/services/event-types/output.service"; +import { OrganizationsEventTypesRepository } from "@/modules/organizations/event-types/organizations-event-types.repository"; +import { DatabaseTeamEventType } from "@/modules/organizations/event-types/services/output.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { TeamsEventTypesService } from "@/modules/teams/event-types/services/teams-event-types.service"; import { UsersService } from "@/modules/users/services/users.service"; diff --git a/apps/api/v2/src/modules/organizations/services/event-types/output.service.ts b/apps/api/v2/src/modules/organizations/event-types/services/output.service.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/services/event-types/output.service.ts rename to apps/api/v2/src/modules/organizations/event-types/services/output.service.ts diff --git a/apps/api/v2/src/modules/organizations/organizations.repository.ts b/apps/api/v2/src/modules/organizations/index/organizations.repository.ts similarity index 82% rename from apps/api/v2/src/modules/organizations/organizations.repository.ts rename to apps/api/v2/src/modules/organizations/index/organizations.repository.ts index 3d451cef06..7d07fdd2f0 100644 --- a/apps/api/v2/src/modules/organizations/organizations.repository.ts +++ b/apps/api/v2/src/modules/organizations/index/organizations.repository.ts @@ -4,6 +4,8 @@ import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { StripeService } from "@/modules/stripe/stripe.service"; import { Injectable } from "@nestjs/common"; +import { Prisma } from "@calcom/prisma/client"; + @Injectable() export class OrganizationsRepository { constructor( @@ -21,6 +23,17 @@ export class OrganizationsRepository { }); } + async findByIds(organizationIds: number[]) { + return this.dbRead.prisma.team.findMany({ + where: { + id: { + in: organizationIds, + }, + isOrganization: true, + }, + }); + } + async findByIdIncludeBilling(orgId: number) { return this.dbRead.prisma.team.findUnique({ where: { @@ -132,6 +145,25 @@ export class OrganizationsRepository { }); } + async update(organizationId: number, data: Prisma.TeamUpdateInput) { + return this.dbWrite.prisma.team.update({ + where: { + id: organizationId, + isOrganization: true, + }, + data, + }); + } + + async delete(organizationId: number) { + return this.dbWrite.prisma.team.delete({ + where: { + id: organizationId, + isOrganization: true, + }, + }); + } + async findOrgBySlug(slug: string) { return this.dbRead.prisma.team.findFirst({ where: { diff --git a/apps/api/v2/src/modules/organizations/services/organizations.service.ts b/apps/api/v2/src/modules/organizations/index/organizations.service.ts similarity index 92% rename from apps/api/v2/src/modules/organizations/services/organizations.service.ts rename to apps/api/v2/src/modules/organizations/index/organizations.service.ts index a32ed9e38b..07c2205a0d 100644 --- a/apps/api/v2/src/modules/organizations/services/organizations.service.ts +++ b/apps/api/v2/src/modules/organizations/index/organizations.service.ts @@ -1,4 +1,4 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; import { Injectable } from "@nestjs/common"; @Injectable() diff --git a/apps/api/v2/src/modules/organizations/inputs/create-organization-membership.input.ts b/apps/api/v2/src/modules/organizations/memberships/inputs/create-organization-membership.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/create-organization-membership.input.ts rename to apps/api/v2/src/modules/organizations/memberships/inputs/create-organization-membership.input.ts diff --git a/apps/api/v2/src/modules/organizations/inputs/update-organization-membership.input.ts b/apps/api/v2/src/modules/organizations/memberships/inputs/update-organization-membership.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/update-organization-membership.input.ts rename to apps/api/v2/src/modules/organizations/memberships/inputs/update-organization-membership.input.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/memberships/organizations-membership.controller.e2e-spec.ts b/apps/api/v2/src/modules/organizations/memberships/organizations-membership.controller.e2e-spec.ts similarity index 99% rename from apps/api/v2/src/modules/organizations/controllers/memberships/organizations-membership.controller.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/memberships/organizations-membership.controller.e2e-spec.ts index 0de6c14d23..64283ef15e 100644 --- a/apps/api/v2/src/modules/organizations/controllers/memberships/organizations-membership.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/memberships/organizations-membership.controller.e2e-spec.ts @@ -1,7 +1,7 @@ import { bootstrap } from "@/app"; import { AppModule } from "@/app.module"; -import { CreateOrgMembershipDto } from "@/modules/organizations/inputs/create-organization-membership.input"; -import { UpdateOrgMembershipDto } from "@/modules/organizations/inputs/update-organization-membership.input"; +import { CreateOrgMembershipDto } from "@/modules/organizations/memberships/inputs/create-organization-membership.input"; +import { UpdateOrgMembershipDto } from "@/modules/organizations/memberships/inputs/update-organization-membership.input"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { TokensModule } from "@/modules/tokens/tokens.module"; import { UsersModule } from "@/modules/users/users.module"; diff --git a/apps/api/v2/src/modules/organizations/controllers/memberships/organizations-membership.controller.ts b/apps/api/v2/src/modules/organizations/memberships/organizations-membership.controller.ts similarity index 87% rename from apps/api/v2/src/modules/organizations/controllers/memberships/organizations-membership.controller.ts rename to apps/api/v2/src/modules/organizations/memberships/organizations-membership.controller.ts index 058a02a0a9..7417ecfe89 100644 --- a/apps/api/v2/src/modules/organizations/controllers/memberships/organizations-membership.controller.ts +++ b/apps/api/v2/src/modules/organizations/memberships/organizations-membership.controller.ts @@ -7,15 +7,15 @@ import { IsMembershipInOrg } from "@/modules/auth/guards/memberships/is-membersh import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-admin-api-enabled.guard"; import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; -import { CreateOrgMembershipDto } from "@/modules/organizations/inputs/create-organization-membership.input"; -import { UpdateOrgMembershipDto } from "@/modules/organizations/inputs/update-organization-membership.input"; -import { CreateOrgMembershipOutput } from "@/modules/organizations/outputs/organization-membership/create-membership.output"; -import { DeleteOrgMembership } from "@/modules/organizations/outputs/organization-membership/delete-membership.output"; -import { GetAllOrgMemberships } from "@/modules/organizations/outputs/organization-membership/get-all-memberships.output"; -import { GetOrgMembership } from "@/modules/organizations/outputs/organization-membership/get-membership.output"; -import { OrgMembershipOutputDto } from "@/modules/organizations/outputs/organization-membership/membership.output"; -import { UpdateOrgMembership } from "@/modules/organizations/outputs/organization-membership/update-membership.output"; -import { OrganizationsMembershipService } from "@/modules/organizations/services/organizations-membership.service"; +import { CreateOrgMembershipDto } from "@/modules/organizations/memberships/inputs/create-organization-membership.input"; +import { UpdateOrgMembershipDto } from "@/modules/organizations/memberships/inputs/update-organization-membership.input"; +import { CreateOrgMembershipOutput } from "@/modules/organizations/memberships/outputs/create-membership.output"; +import { DeleteOrgMembership } from "@/modules/organizations/memberships/outputs/delete-membership.output"; +import { GetAllOrgMemberships } from "@/modules/organizations/memberships/outputs/get-all-memberships.output"; +import { GetOrgMembership } from "@/modules/organizations/memberships/outputs/get-membership.output"; +import { OrgMembershipOutputDto } from "@/modules/organizations/memberships/outputs/membership.output"; +import { UpdateOrgMembership } from "@/modules/organizations/memberships/outputs/update-membership.output"; +import { OrganizationsMembershipService } from "@/modules/organizations/memberships/services/organizations-membership.service"; import { Controller, UseGuards, diff --git a/apps/api/v2/src/modules/organizations/repositories/organizations-membership.repository.ts b/apps/api/v2/src/modules/organizations/memberships/organizations-membership.repository.ts similarity index 92% rename from apps/api/v2/src/modules/organizations/repositories/organizations-membership.repository.ts rename to apps/api/v2/src/modules/organizations/memberships/organizations-membership.repository.ts index eca3f5afdd..77d0419fe0 100644 --- a/apps/api/v2/src/modules/organizations/repositories/organizations-membership.repository.ts +++ b/apps/api/v2/src/modules/organizations/memberships/organizations-membership.repository.ts @@ -1,9 +1,9 @@ -import { CreateOrgMembershipDto } from "@/modules/organizations/inputs/create-organization-membership.input"; +import { CreateOrgMembershipDto } from "@/modules/organizations/memberships/inputs/create-organization-membership.input"; import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; -import { UpdateOrgMembershipDto } from "../inputs/update-organization-membership.input"; +import { UpdateOrgMembershipDto } from "./inputs/update-organization-membership.input"; @Injectable() export class OrganizationsMembershipRepository { diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-membership/create-membership.output.ts b/apps/api/v2/src/modules/organizations/memberships/outputs/create-membership.output.ts similarity index 93% rename from apps/api/v2/src/modules/organizations/outputs/organization-membership/create-membership.output.ts rename to apps/api/v2/src/modules/organizations/memberships/outputs/create-membership.output.ts index 5a129c9824..c662f75293 100644 --- a/apps/api/v2/src/modules/organizations/outputs/organization-membership/create-membership.output.ts +++ b/apps/api/v2/src/modules/organizations/memberships/outputs/create-membership.output.ts @@ -1,4 +1,4 @@ -import { OrgMembershipOutputDto } from "@/modules/organizations/outputs/organization-membership/membership.output"; +import { OrgMembershipOutputDto } from "@/modules/organizations/memberships/outputs/membership.output"; import { ApiProperty } from "@nestjs/swagger"; import { Type } from "class-transformer"; import { IsEnum, IsNotEmptyObject, ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-membership/delete-membership.output.ts b/apps/api/v2/src/modules/organizations/memberships/outputs/delete-membership.output.ts similarity index 90% rename from apps/api/v2/src/modules/organizations/outputs/organization-membership/delete-membership.output.ts rename to apps/api/v2/src/modules/organizations/memberships/outputs/delete-membership.output.ts index 2f3005ba95..8dd77523f4 100644 --- a/apps/api/v2/src/modules/organizations/outputs/organization-membership/delete-membership.output.ts +++ b/apps/api/v2/src/modules/organizations/memberships/outputs/delete-membership.output.ts @@ -1,4 +1,4 @@ -import { OrgMembershipOutputDto } from "@/modules/organizations/outputs/organization-membership/membership.output"; +import { OrgMembershipOutputDto } from "@/modules/organizations/memberships/outputs/membership.output"; import { ApiProperty } from "@nestjs/swagger"; import { IsEnum } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-membership/get-all-memberships.output.ts b/apps/api/v2/src/modules/organizations/memberships/outputs/get-all-memberships.output.ts similarity index 93% rename from apps/api/v2/src/modules/organizations/outputs/organization-membership/get-all-memberships.output.ts rename to apps/api/v2/src/modules/organizations/memberships/outputs/get-all-memberships.output.ts index 3114c2c899..f29b477869 100644 --- a/apps/api/v2/src/modules/organizations/outputs/organization-membership/get-all-memberships.output.ts +++ b/apps/api/v2/src/modules/organizations/memberships/outputs/get-all-memberships.output.ts @@ -1,4 +1,4 @@ -import { OrgMembershipOutputDto } from "@/modules/organizations/outputs/organization-membership/membership.output"; +import { OrgMembershipOutputDto } from "@/modules/organizations/memberships/outputs/membership.output"; import { ApiProperty } from "@nestjs/swagger"; import { Type } from "class-transformer"; import { IsEnum, IsNotEmptyObject, ValidateNested, IsArray } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-membership/get-membership.output.ts b/apps/api/v2/src/modules/organizations/memberships/outputs/get-membership.output.ts similarity index 92% rename from apps/api/v2/src/modules/organizations/outputs/organization-membership/get-membership.output.ts rename to apps/api/v2/src/modules/organizations/memberships/outputs/get-membership.output.ts index 416a3a6bb4..df4326c3ba 100644 --- a/apps/api/v2/src/modules/organizations/outputs/organization-membership/get-membership.output.ts +++ b/apps/api/v2/src/modules/organizations/memberships/outputs/get-membership.output.ts @@ -1,4 +1,4 @@ -import { OrgMembershipOutputDto } from "@/modules/organizations/outputs/organization-membership/membership.output"; +import { OrgMembershipOutputDto } from "@/modules/organizations/memberships/outputs/membership.output"; import { ApiProperty } from "@nestjs/swagger"; import { Type } from "class-transformer"; import { IsEnum, IsNotEmptyObject, ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-membership/membership.output.ts b/apps/api/v2/src/modules/organizations/memberships/outputs/membership.output.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/outputs/organization-membership/membership.output.ts rename to apps/api/v2/src/modules/organizations/memberships/outputs/membership.output.ts diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-membership/update-membership.output.ts b/apps/api/v2/src/modules/organizations/memberships/outputs/update-membership.output.ts similarity index 93% rename from apps/api/v2/src/modules/organizations/outputs/organization-membership/update-membership.output.ts rename to apps/api/v2/src/modules/organizations/memberships/outputs/update-membership.output.ts index d971822169..66d35f514c 100644 --- a/apps/api/v2/src/modules/organizations/outputs/organization-membership/update-membership.output.ts +++ b/apps/api/v2/src/modules/organizations/memberships/outputs/update-membership.output.ts @@ -1,4 +1,4 @@ -import { OrgMembershipOutputDto } from "@/modules/organizations/outputs/organization-membership/membership.output"; +import { OrgMembershipOutputDto } from "@/modules/organizations/memberships/outputs/membership.output"; import { ApiProperty } from "@nestjs/swagger"; import { Type } from "class-transformer"; import { IsEnum, IsNotEmptyObject, ValidateNested } from "class-validator"; diff --git a/apps/api/v2/src/modules/organizations/services/organizations-membership.service.ts b/apps/api/v2/src/modules/organizations/memberships/services/organizations-membership.service.ts similarity index 94% rename from apps/api/v2/src/modules/organizations/services/organizations-membership.service.ts rename to apps/api/v2/src/modules/organizations/memberships/services/organizations-membership.service.ts index 7ca9490d2a..c7ba08bef1 100644 --- a/apps/api/v2/src/modules/organizations/services/organizations-membership.service.ts +++ b/apps/api/v2/src/modules/organizations/memberships/services/organizations-membership.service.ts @@ -1,5 +1,5 @@ -import { CreateOrgMembershipDto } from "@/modules/organizations/inputs/create-organization-membership.input"; -import { OrganizationsMembershipRepository } from "@/modules/organizations/repositories/organizations-membership.repository"; +import { CreateOrgMembershipDto } from "@/modules/organizations/memberships/inputs/create-organization-membership.input"; +import { OrganizationsMembershipRepository } from "@/modules/organizations/memberships/organizations-membership.repository"; import { Injectable } from "@nestjs/common"; import { UpdateOrgMembershipDto } from "../inputs/update-organization-membership.input"; diff --git a/apps/api/v2/src/modules/organizations/organizations.module.ts b/apps/api/v2/src/modules/organizations/organizations.module.ts index c5a87ebae2..e9326504f2 100644 --- a/apps/api/v2/src/modules/organizations/organizations.module.ts +++ b/apps/api/v2/src/modules/organizations/organizations.module.ts @@ -5,43 +5,44 @@ import { EmailService } from "@/modules/email/email.service"; import { MembershipsRepository } from "@/modules/memberships/memberships.repository"; import { UserOOORepository } from "@/modules/ooo/repositories/ooo.repository"; import { UserOOOService } from "@/modules/ooo/services/ooo.service"; -import { OrganizationsOptionsAttributesController } from "@/modules/organizations/controllers/attributes/organizations-attributes-options.controller"; -import { OrganizationsAttributesController } from "@/modules/organizations/controllers/attributes/organizations-attributes.controller"; -import { OrganizationsEventTypesController } from "@/modules/organizations/controllers/event-types/organizations-event-types.controller"; -import { OrganizationsMembershipsController } from "@/modules/organizations/controllers/memberships/organizations-membership.controller"; -import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/controllers/pipes/event-types/team-event-types-response.transformer"; -import { OrganizationsSchedulesController } from "@/modules/organizations/controllers/schedules/organizations-schedules.controller"; -import { OrganizationsTeamsMembershipsController } from "@/modules/organizations/controllers/teams/memberships/organizations-teams-memberships.controller"; -import { OrganizationsTeamsController } from "@/modules/organizations/controllers/teams/organizations-teams.controller"; -import { OrganizationsTeamsSchedulesController } from "@/modules/organizations/controllers/teams/schedules/organizations-teams-schedules.controller"; -import { OrganizationsUsersOOOController } from "@/modules/organizations/controllers/users/ooo/organizations-users-ooo-controller"; -import { OrgUsersOOORepository } from "@/modules/organizations/controllers/users/ooo/repositories/organizations-users-ooo.repository"; -import { OrgUsersOOOService } from "@/modules/organizations/controllers/users/ooo/services/organization-users-ooo.service"; -import { OrganizationsUsersController } from "@/modules/organizations/controllers/users/organizations-users.controller"; -import { OrganizationsWebhooksController } from "@/modules/organizations/controllers/webhooks/organizations-webhooks.controller"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; -import { OrganizationAttributeOptionRepository } from "@/modules/organizations/repositories/attributes/organization-attribute-option.repository"; -import { OrganizationAttributesRepository } from "@/modules/organizations/repositories/attributes/organization-attribute.repository"; -import { OrganizationsEventTypesRepository } from "@/modules/organizations/repositories/organizations-event-types.repository"; -import { OrganizationsMembershipRepository } from "@/modules/organizations/repositories/organizations-membership.repository"; -import { OrganizationSchedulesRepository } from "@/modules/organizations/repositories/organizations-schedules.repository"; -import { OrganizationsTeamsMembershipsRepository } from "@/modules/organizations/repositories/organizations-teams-memberships.repository"; -import { OrganizationsTeamsRepository } from "@/modules/organizations/repositories/organizations-teams.repository"; -import { OrganizationsUsersRepository } from "@/modules/organizations/repositories/organizations-users.repository"; -import { OrganizationsWebhooksRepository } from "@/modules/organizations/repositories/organizations-webhooks.repository"; -import { OrganizationAttributeOptionService } from "@/modules/organizations/services/attributes/organization-attributes-option.service"; -import { OrganizationAttributesService } from "@/modules/organizations/services/attributes/organization-attributes.service"; -import { InputOrganizationsEventTypesService } from "@/modules/organizations/services/event-types/input.service"; -import { OrganizationsEventTypesService } from "@/modules/organizations/services/event-types/organizations-event-types.service"; -import { OutputOrganizationsEventTypesService } from "@/modules/organizations/services/event-types/output.service"; -import { OrganizationsMembershipService } from "@/modules/organizations/services/organizations-membership.service"; -import { OrganizationsSchedulesService } from "@/modules/organizations/services/organizations-schedules.service"; -import { OrganizationsTeamsMembershipsService } from "@/modules/organizations/services/organizations-teams-memberships.service"; -import { OrganizationsTeamsService } from "@/modules/organizations/services/organizations-teams.service"; -import { OrganizationsUsersService } from "@/modules/organizations/services/organizations-users-service"; -import { OrganizationsWebhooksService } from "@/modules/organizations/services/organizations-webhooks.service"; -import { OrganizationsService } from "@/modules/organizations/services/organizations.service"; +import { OrganizationsAttributesController } from "@/modules/organizations/attributes/index/controllers/organizations-attributes.controller"; +import { OrganizationAttributesRepository } from "@/modules/organizations/attributes/index/organization-attributes.repository"; +import { OrganizationAttributesService } from "@/modules/organizations/attributes/index/services/organization-attributes.service"; +import { OrganizationAttributeOptionRepository } from "@/modules/organizations/attributes/options/organization-attribute-options.repository"; +import { OrganizationsAttributesOptionsController } from "@/modules/organizations/attributes/options/organizations-attributes-options.controller"; +import { OrganizationAttributeOptionService } from "@/modules/organizations/attributes/options/services/organization-attributes-option.service"; +import { OrganizationsEventTypesController } from "@/modules/organizations/event-types/organizations-event-types.controller"; +import { OrganizationsEventTypesRepository } from "@/modules/organizations/event-types/organizations-event-types.repository"; +import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/event-types/pipes/team-event-types-response.transformer"; +import { InputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/input.service"; +import { OrganizationsEventTypesService } from "@/modules/organizations/event-types/services/organizations-event-types.service"; +import { OutputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/output.service"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsService } from "@/modules/organizations/index/organizations.service"; +import { OrganizationsMembershipsController } from "@/modules/organizations/memberships/organizations-membership.controller"; +import { OrganizationsMembershipRepository } from "@/modules/organizations/memberships/organizations-membership.repository"; +import { OrganizationsMembershipService } from "@/modules/organizations/memberships/services/organizations-membership.service"; +import { OrganizationsOrganizationsModule } from "@/modules/organizations/organizations/organizations-organizations.module"; +import { OrganizationsSchedulesController } from "@/modules/organizations/schedules/organizations-schedules.controller"; +import { OrganizationSchedulesRepository } from "@/modules/organizations/schedules/organizations-schedules.repository"; +import { OrganizationsSchedulesService } from "@/modules/organizations/schedules/services/organizations-schedules.service"; +import { OrganizationsTeamsController } from "@/modules/organizations/teams/index/organizations-teams.controller"; +import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository"; +import { OrganizationsTeamsService } from "@/modules/organizations/teams/index/services/organizations-teams.service"; +import { OrganizationsTeamsMembershipsController } from "@/modules/organizations/teams/memberships/organizations-teams-memberships.controller"; +import { OrganizationsTeamsMembershipsRepository } from "@/modules/organizations/teams/memberships/organizations-teams-memberships.repository"; +import { OrganizationsTeamsMembershipsService } from "@/modules/organizations/teams/memberships/services/organizations-teams-memberships.service"; import { OrganizationsTeamsRoutingFormsModule } from "@/modules/organizations/teams/routing-forms/organizations-teams-routing-forms-responses.module"; +import { OrganizationsTeamsSchedulesController } from "@/modules/organizations/teams/schedules/organizations-teams-schedules.controller"; +import { OrganizationsUsersController } from "@/modules/organizations/users/index/controllers/organizations-users.controller"; +import { OrganizationsUsersRepository } from "@/modules/organizations/users/index/organizations-users.repository"; +import { OrganizationsUsersService } from "@/modules/organizations/users/index/services/organizations-users-service"; +import { OrganizationsUsersOOOController } from "@/modules/organizations/users/ooo/controllers/organizations-users-ooo-controller"; +import { OrgUsersOOORepository } from "@/modules/organizations/users/ooo/organizations-users-ooo.repository"; +import { OrgUsersOOOService } from "@/modules/organizations/users/ooo/services/organization-users-ooo.service"; +import { OrganizationsWebhooksController } from "@/modules/organizations/webhooks/controllers/organizations-webhooks.controller"; +import { OrganizationsWebhooksRepository } from "@/modules/organizations/webhooks/organizations-webhooks.repository"; +import { OrganizationsWebhooksService } from "@/modules/organizations/webhooks/services/organizations-webhooks.service"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { RedisModule } from "@/modules/redis/redis.module"; import { StripeModule } from "@/modules/stripe/stripe.module"; @@ -63,6 +64,7 @@ import { Module } from "@nestjs/common"; EventTypesModule_2024_06_14, TeamsEventTypesModule, TeamsModule, + OrganizationsOrganizationsModule, OrganizationsTeamsRoutingFormsModule, ], providers: [ @@ -126,7 +128,7 @@ import { Module } from "@nestjs/common"; OrganizationsEventTypesController, OrganizationsTeamsMembershipsController, OrganizationsAttributesController, - OrganizationsOptionsAttributesController, + OrganizationsAttributesOptionsController, OrganizationsWebhooksController, OrganizationsTeamsSchedulesController, OrganizationsUsersOOOController, diff --git a/apps/api/v2/src/modules/organizations/organizations/inputs/create-managed-organization.input.ts b/apps/api/v2/src/modules/organizations/organizations/inputs/create-managed-organization.input.ts new file mode 100644 index 0000000000..0129261c89 --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/inputs/create-managed-organization.input.ts @@ -0,0 +1,16 @@ +import { RefreshApiKeyInput } from "@/modules/api-keys/inputs/refresh-api-key.input"; +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { Type } from "class-transformer"; +import { IsObject, IsOptional, IsString, Length } from "class-validator"; + +export class CreateOrganizationInput extends RefreshApiKeyInput { + @IsString() + @Length(1) + @ApiProperty({ description: "Name of the organization", example: "CalTeam" }) + readonly name!: string; + + @IsOptional() + @IsObject() + @ApiPropertyOptional({ type: Object }) + readonly metadata?: Record; +} diff --git a/apps/api/v2/src/modules/organizations/organizations/inputs/update-managed-organization.input.ts b/apps/api/v2/src/modules/organizations/organizations/inputs/update-managed-organization.input.ts new file mode 100644 index 0000000000..51210ba6d7 --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/inputs/update-managed-organization.input.ts @@ -0,0 +1,15 @@ +import { ApiPropertyOptional } from "@nestjs/swagger"; +import { IsOptional, IsString, Length } from "class-validator"; + +export class UpdateOrganizationInput { + @IsString() + @IsOptional() + @Length(1) + @ApiPropertyOptional({ description: "Name of the organization", example: "CalTeam" }) + readonly name?: string; + + @IsOptional() + @IsString() + @ApiPropertyOptional() + readonly metadata?: string; +} diff --git a/apps/api/v2/src/modules/organizations/organizations/managed-organizations.repository.ts b/apps/api/v2/src/modules/organizations/organizations/managed-organizations.repository.ts new file mode 100644 index 0000000000..e859dd3cf0 --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/managed-organizations.repository.ts @@ -0,0 +1,44 @@ +import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; +import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; +import { Injectable } from "@nestjs/common"; + +import { Prisma } from "@calcom/prisma/client"; + +@Injectable() +export class ManagedOrganizationsRepository { + constructor(private readonly dbRead: PrismaReadService, private readonly dbWrite: PrismaWriteService) {} + + async createManagedOrganization(managerOrganizationId: number, data: Prisma.TeamCreateInput) { + return this.dbWrite.prisma.team.create({ + data: { + ...data, + managedOrganization: { + create: { + managerOrganization: { + connect: { id: managerOrganizationId }, + }, + }, + }, + }, + }); + } + + async getByManagerManagedIds(managerOrganizationId: number, managedOrganizationId: number) { + return this.dbRead.prisma.managedOrganization.findUnique({ + where: { + managerOrganizationId_managedOrganizationId: { + managerOrganizationId, + managedOrganizationId, + }, + }, + }); + } + + async getByManagerOrganizationId(managerOrganizationId: number) { + return this.dbRead.prisma.managedOrganization.findMany({ + where: { + managerOrganizationId, + }, + }); + } +} diff --git a/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.controller.e2e-spec.ts b/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.controller.e2e-spec.ts new file mode 100644 index 0000000000..4fb7b891cb --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.controller.e2e-spec.ts @@ -0,0 +1,449 @@ +import { bootstrap } from "@/app"; +import { AppModule } from "@/app.module"; +import { getEnv } from "@/env"; +import { hashAPIKey, stripApiKey } from "@/lib/api-key"; +import { RefreshApiKeyOutput } from "@/modules/api-keys/outputs/refresh-api-key.output"; +import { CreateOAuthClientResponseDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/CreateOAuthClientResponse.dto"; +import { GetOAuthClientResponseDto } from "@/modules/oauth-clients/controllers/oauth-clients/responses/GetOAuthClientResponse.dto"; +import { CreateOrganizationInput } from "@/modules/organizations/organizations/inputs/create-managed-organization.input"; +import { UpdateOrganizationInput } from "@/modules/organizations/organizations/inputs/update-managed-organization.input"; +import { + ManagedOrganizationWithApiKeyOutput, + ManagedOrganizationOutput, +} from "@/modules/organizations/organizations/outputs/managed-organization.output"; +import { PrismaModule } from "@/modules/prisma/prisma.module"; +import { TokensModule } from "@/modules/tokens/tokens.module"; +import { UsersModule } from "@/modules/users/users.module"; +import { INestApplication } from "@nestjs/common"; +import { NestExpressApplication } from "@nestjs/platform-express"; +import { Test } from "@nestjs/testing"; +import { PlatformBilling, User } from "@prisma/client"; +import { advanceTo, clear } from "jest-date-mock"; +import { DateTime } from "luxon"; +import * as request from "supertest"; +import { ApiKeysRepositoryFixture } from "test/fixtures/repository/api-keys.repository.fixture"; +import { PlatformBillingRepositoryFixture } from "test/fixtures/repository/billing.repository.fixture"; +import { ManagedOrganizationsRepositoryFixture } from "test/fixtures/repository/managed-organizations.repository.fixture"; +import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture"; +import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture"; +import { OrganizationRepositoryFixture } from "test/fixtures/repository/organization.repository.fixture"; +import { ProfileRepositoryFixture } from "test/fixtures/repository/profiles.repository.fixture"; +import { TeamRepositoryFixture } from "test/fixtures/repository/team.repository.fixture"; +import { UserRepositoryFixture } from "test/fixtures/repository/users.repository.fixture"; +import { randomString } from "test/utils/randomString"; + +import { + APPS_READ, + APPS_WRITE, + BOOKING_READ, + BOOKING_WRITE, + EVENT_TYPE_READ, + EVENT_TYPE_WRITE, + PROFILE_READ, + PROFILE_WRITE, + SCHEDULE_READ, + SCHEDULE_WRITE, + X_CAL_SECRET_KEY, +} from "@calcom/platform-constants"; +import { SUCCESS_STATUS } from "@calcom/platform-constants"; +import { ApiSuccessResponse, CreateOAuthClientInput } from "@calcom/platform-types"; +import { Team } from "@calcom/prisma/client"; + +describe("Organizations Organizations Endpoints", () => { + let app: INestApplication; + + let userRepositoryFixture: UserRepositoryFixture; + let organizationsRepositoryFixture: OrganizationRepositoryFixture; + let teamsRepositoryFixture: TeamRepositoryFixture; + let membershipsRepositoryFixture: MembershipRepositoryFixture; + let platformBillingRepositoryFixture: PlatformBillingRepositoryFixture; + let managedOrganizationsRepositoryFixture: ManagedOrganizationsRepositoryFixture; + let apiKeysRepositoryFixture: ApiKeysRepositoryFixture; + let oAuthClientsRepositoryFixture: OAuthClientRepositoryFixture; + let profilesRepositoryFixture: ProfileRepositoryFixture; + + let managerOrg: Team; + let managedOrg: ManagedOrganizationWithApiKeyOutput; + const managerOrgAdminEmail = `organizations-organizations-admin-${randomString()}@api.com`; + let managerOrgAdmin: User; + let managerOrgAdminApiKey: string; + let managerOrgBilling: PlatformBilling; + + let managedOrgApiKey: string; + let managedOrgOAuthClientId: string; + let managedOrgOAuthClientSecret: string; + const createOAuthClientBody: CreateOAuthClientInput = { + name: "OAuth client for managed organization", + redirectUris: ["http://localhost:4321"], + permissions: ["*"], + }; + + const newDate = new Date(2035, 0, 9, 15, 0, 0); + + beforeAll(async () => { + const moduleRef = await Test.createTestingModule({ + imports: [AppModule, PrismaModule, UsersModule, TokensModule], + }).compile(); + + userRepositoryFixture = new UserRepositoryFixture(moduleRef); + organizationsRepositoryFixture = new OrganizationRepositoryFixture(moduleRef); + teamsRepositoryFixture = new TeamRepositoryFixture(moduleRef); + membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef); + platformBillingRepositoryFixture = new PlatformBillingRepositoryFixture(moduleRef); + managedOrganizationsRepositoryFixture = new ManagedOrganizationsRepositoryFixture(moduleRef); + apiKeysRepositoryFixture = new ApiKeysRepositoryFixture(moduleRef); + oAuthClientsRepositoryFixture = new OAuthClientRepositoryFixture(moduleRef); + profilesRepositoryFixture = new ProfileRepositoryFixture(moduleRef); + + managerOrgAdmin = await userRepositoryFixture.create({ + email: managerOrgAdminEmail, + username: managerOrgAdminEmail, + }); + + managerOrg = await organizationsRepositoryFixture.create({ + name: `organizations-organizations-organization-${randomString()}`, + isOrganization: true, + isPlatform: true, + }); + + await profilesRepositoryFixture.create({ + uid: "asd-asd", + username: managerOrgAdminEmail, + user: { connect: { id: managerOrgAdmin.id } }, + organization: { connect: { id: managerOrg.id } }, + movedFromUser: { connect: { id: managerOrgAdmin.id } }, + }); + + managerOrgBilling = await platformBillingRepositoryFixture.create(managerOrg.id, "SCALE"); + + await membershipsRepositoryFixture.create({ + role: "ADMIN", + user: { connect: { id: managerOrgAdmin.id } }, + team: { connect: { id: managerOrg.id } }, + accepted: true, + }); + + const { keyString } = await apiKeysRepositoryFixture.createApiKey( + managerOrgAdmin.id, + null, + managerOrg.id + ); + managerOrgAdminApiKey = `cal_test_${keyString}`; + + app = moduleRef.createNestApplication(); + bootstrap(app as NestExpressApplication); + + advanceTo(newDate); + + await app.init(); + }); + + afterAll(() => { + clear(); + }); + + it("should create managed organization", async () => { + const suffix = randomString(); + + const body: CreateOrganizationInput = { + name: `organizations organizations org ${suffix}`, + metadata: { key: "value" }, + }; + + return request(app.getHttpServer()) + .post(`/v2/organizations/${managerOrg.id}/organizations`) + .set("Authorization", `Bearer ${managerOrgAdminApiKey}`) + .send(body) + .expect(201) + .then(async (response) => { + const responseBody: ApiSuccessResponse = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + managedOrg = responseBody.data; + expect(managedOrg?.id).toBeDefined(); + expect(managedOrg?.name).toEqual(body.name); + expect(managedOrg?.metadata).toEqual(body.metadata); + expect(managedOrg?.apiKey).toBeDefined(); + + // note(Lauris): check that managed organization is correctly setup in database + const managedOrgInDb = + await managedOrganizationsRepositoryFixture.getOrganizationWithManagedOrganizations(managedOrg.id); + expect(managedOrgInDb).toBeDefined(); + expect(managedOrgInDb?.id).toEqual(managedOrg.id); + expect(managedOrgInDb?.isPlatform).toEqual(true); + expect(managedOrgInDb?.isOrganization).toEqual(true); + expect(managedOrgInDb?.managedOrganization?.managedOrganizationId).toEqual(managedOrg.id); + expect(managedOrgInDb?.managedOrganization?.managerOrganizationId).toEqual(managerOrg.id); + // note(Lauris): check that manager organization is correctly setup in database + const managerOrgInDb = + await managedOrganizationsRepositoryFixture.getOrganizationWithManagedOrganizations(managerOrg.id); + expect(managerOrgInDb).toBeDefined(); + expect(managerOrgInDb?.id).toEqual(managerOrg.id); + expect(managerOrgInDb?.isPlatform).toEqual(true); + expect(managerOrgInDb?.isOrganization).toEqual(true); + expect(managerOrgInDb?.managedOrganization).toEqual(null); + expect(managerOrgInDb?.managedOrganizations?.length).toEqual(1); + expect(managerOrgInDb?.managedOrganizations?.[0]?.managedOrganizationId).toEqual(managedOrg.id); + expect(managerOrgInDb?.managedOrganizations?.[0]?.managerOrganizationId).toEqual(managerOrg.id); + + // note(Lauris): test that auth user who made request to create managed organization is OWNER of it + const membership = await membershipsRepositoryFixture.getUserMembershipByTeamId( + managerOrgAdmin.id, + managedOrg.id + ); + expect(membership?.role ?? "").toEqual("OWNER"); + expect(membership?.accepted).toEqual(true); + // note(Lauris): test that auth user who made request to create managed organization has profile in it + const profile = await profilesRepositoryFixture.findByOrgIdUserId(managedOrg.id, managerOrgAdmin.id); + expect(profile).toBeDefined(); + expect(profile?.id).toBeDefined(); + expect(profile?.username).toEqual(managerOrgAdmin.username); + // note(Lauris): check that platform billing is setup correctly for manager and managed orgs + const managerOrgBilling = await platformBillingRepositoryFixture.get(managerOrg.id); + expect(managerOrgBilling).toBeDefined(); + expect(managerOrgBilling?.id).toBeDefined(); + const customerId = managerOrgBilling?.customerId; + expect(customerId).toBeDefined(); + if (!customerId) { + throw new Error( + "organizations-organizations.controller.e2e-spec.ts: PlatformBilling customerId is not defined" + ); + } + const subscriptionId = managerOrgBilling?.subscriptionId; + expect(subscriptionId).toBeDefined(); + if (!subscriptionId) { + throw new Error( + "organizations-organizations.controller.e2e-spec.ts: PlatformBilling subscriptionId is not defined" + ); + } + const plan = managerOrgBilling?.plan; + expect(plan).toEqual("SCALE"); + + const managedOrgBilling = await platformBillingRepositoryFixture.get(managedOrg.id); + expect(managedOrgBilling).toBeDefined(); + expect(managedOrgBilling?.customerId).toEqual(customerId); + expect(managedOrgBilling?.subscriptionId).toEqual(subscriptionId); + expect(managedOrgBilling?.plan).toEqual(plan); + expect(managedOrgBilling?.managerBillingId).toEqual(managerOrgBilling?.id); + + expect(managerOrgBilling?.managedBillings?.length).toEqual(1); + expect(managerOrgBilling?.managedBillings?.[0]?.id).toEqual(managedOrgBilling?.id); + + const billings = await platformBillingRepositoryFixture.getByCustomerSubscriptionIds( + customerId, + subscriptionId + ); + expect(billings).toBeDefined(); + // note(Lauris): manager and manager organizaitons billings because managed organization client and subscription ids are same as manager organization billing row. + expect(billings?.length).toEqual(2); + + // note(Lauris): check that in database api key is generated for managed org + const managedOrgApiKeys = await apiKeysRepositoryFixture.getTeamApiKeys(managedOrg.id); + expect(managedOrgApiKeys?.length).toEqual(1); + expect(managedOrgApiKeys?.[0]?.id).toBeDefined(); + const apiKeyPrefix = getEnv("API_KEY_PREFIX", "cal_"); + const hashedApiKey = `${hashAPIKey(stripApiKey(managedOrg?.apiKey, apiKeyPrefix))}`; + expect(managedOrgApiKeys?.[0]?.hashedKey).toEqual(hashedApiKey); + const expectedExpiresAt = DateTime.fromJSDate(newDate).setZone("utc").plus({ days: 30 }).toJSDate(); + expect(managedOrgApiKeys?.[0]?.expiresAt).toEqual(expectedExpiresAt); + expect(managedOrgApiKeys?.[0]?.note).toEqual( + `Managed organization API key. ManagerOrgId: ${managerOrg.id}. ManagedOrgId: ${managedOrg.id}` + ); + managedOrgApiKey = managedOrg?.apiKey; + }); + }); + + it("should get managed organization", async () => { + return request(app.getHttpServer()) + .get(`/v2/organizations/${managerOrg.id}/organizations/${managedOrg.id}`) + .set("Authorization", `Bearer ${managerOrgAdminApiKey}`) + .expect(200) + .then(async (response) => { + const responseBody: ApiSuccessResponse = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + const responseManagedOrg = responseBody.data; + expect(responseManagedOrg?.id).toBeDefined(); + expect(responseManagedOrg?.name).toEqual(managedOrg.name); + expect(responseManagedOrg?.metadata).toEqual(managedOrg.metadata); + }); + }); + + it("should get managed organizations", async () => { + return request(app.getHttpServer()) + .get(`/v2/organizations/${managerOrg.id}/organizations`) + .set("Authorization", `Bearer ${managerOrgAdminApiKey}`) + .expect(200) + .then(async (response) => { + const responseBody: ApiSuccessResponse = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + const responseManagedOrgs = responseBody.data; + expect(responseManagedOrgs?.length).toEqual(1); + const responseManagedOrg = responseManagedOrgs[0]; + expect(responseManagedOrg?.id).toBeDefined(); + expect(responseManagedOrg?.name).toEqual(managedOrg.name); + expect(responseManagedOrg?.metadata).toEqual(managedOrg.metadata); + }); + }); + + it("should update managed organization ", async () => { + const suffix = randomString(); + + const newOrgName = `new organizations organizations org ${suffix}`; + + return request(app.getHttpServer()) + .patch(`/v2/organizations/${managerOrg.id}/organizations/${managedOrg.id}`) + .set("Authorization", `Bearer ${managerOrgAdminApiKey}`) + .send({ + name: newOrgName, + } satisfies UpdateOrganizationInput) + .expect(200) + .then(async (response) => { + const responseBody: ApiSuccessResponse = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + const responseManagedOrg = responseBody.data; + expect(responseManagedOrg?.id).toBeDefined(); + expect(responseManagedOrg?.name).toEqual(newOrgName); + + const managedOrgInDb = + await managedOrganizationsRepositoryFixture.getOrganizationWithManagedOrganizations(managedOrg.id); + expect(managedOrgInDb).toBeDefined(); + expect(managedOrgInDb?.name).toEqual(newOrgName); + + managedOrg = { ...managedOrg, name: newOrgName }; + }); + }); + + it("should refresh api key for managed organization with a custom duration", async () => { + return request(app.getHttpServer()) + .post(`/v2/api-keys/refresh`) + .send({ apiKeyDaysValid: 60 }) + .set("Authorization", `Bearer ${managedOrgApiKey}`) + .expect(200) + .then(async (response) => { + const responseBody: RefreshApiKeyOutput = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + const responseData = responseBody.data; + const newApiKey = responseData?.apiKey; + expect(newApiKey).toBeDefined(); + expect(newApiKey).not.toEqual(managedOrgApiKey); + + const managedOrgApiKeys = await apiKeysRepositoryFixture.getTeamApiKeys(managedOrg.id); + expect(managedOrgApiKeys?.length).toEqual(1); + expect(managedOrgApiKeys?.[0]?.id).toBeDefined(); + const apiKeyPrefix = getEnv("API_KEY_PREFIX", "cal_"); + const hashedApiKey = `${hashAPIKey(stripApiKey(newApiKey, apiKeyPrefix))}`; + expect(managedOrgApiKeys?.[0]?.hashedKey).toEqual(hashedApiKey); + const expectedExpiresAt = DateTime.fromJSDate(newDate).setZone("utc").plus({ days: 60 }).toJSDate(); + expect(managedOrgApiKeys?.[0]?.expiresAt).toEqual(expectedExpiresAt); + expect(managedOrgApiKeys?.[0]?.note).toEqual( + `Managed organization API key. ManagerOrgId: ${managerOrg.id}. ManagedOrgId: ${managedOrg.id}` + ); + managedOrgApiKey = newApiKey; + }); + }); + + it("should create OAuth client for managed organization", async () => { + return request(app.getHttpServer()) + .post(`/v2/oauth-clients`) + .send(createOAuthClientBody) + .set("Authorization", `Bearer ${managedOrgApiKey}`) + .expect(201) + .then(async (response) => { + const responseBody: CreateOAuthClientResponseDto = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + const responseData = responseBody.data; + const clientId = responseData?.clientId; + const clientSecret = responseData?.clientSecret; + expect(clientId).toBeDefined(); + expect(clientSecret).toBeDefined(); + + const managedOrgOAuthClients = await oAuthClientsRepositoryFixture.getByOrgId(managedOrg.id); + expect(managedOrgOAuthClients?.length).toEqual(1); + expect(managedOrgOAuthClients?.[0]?.id).toBeDefined(); + expect(managedOrgOAuthClients?.[0]?.id).toEqual(clientId); + expect(managedOrgOAuthClients?.[0]?.secret).toEqual(clientSecret); + expect(managedOrgOAuthClients?.[0]?.name).toEqual(createOAuthClientBody.name); + expect(managedOrgOAuthClients?.[0]?.redirectUris).toEqual(createOAuthClientBody.redirectUris); + expect(managedOrgOAuthClients?.[0]?.permissions).toEqual( + EVENT_TYPE_READ + + EVENT_TYPE_WRITE + + BOOKING_READ + + BOOKING_WRITE + + SCHEDULE_READ + + SCHEDULE_WRITE + + APPS_READ + + APPS_WRITE + + PROFILE_READ + + PROFILE_WRITE + ); + managedOrgOAuthClientId = clientId; + managedOrgOAuthClientSecret = clientSecret; + }); + }); + + it("should fetch OAuth client for managed organization", async () => { + return request(app.getHttpServer()) + .get(`/v2/oauth-clients/${managedOrgOAuthClientId}`) + .set(X_CAL_SECRET_KEY, managedOrgOAuthClientSecret) + .expect(200) + .then(async (response) => { + const responseBody: GetOAuthClientResponseDto = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + const responseData = responseBody.data; + expect(responseData?.id).toEqual(managedOrgOAuthClientId); + expect(responseData?.secret).toEqual(managedOrgOAuthClientSecret); + expect(responseData?.name).toEqual(createOAuthClientBody.name); + expect(responseData?.redirectUris).toEqual(createOAuthClientBody.redirectUris); + expect(responseData?.permissions).toEqual([ + "EVENT_TYPE_READ", + "EVENT_TYPE_WRITE", + "BOOKING_READ", + "BOOKING_WRITE", + "SCHEDULE_READ", + "SCHEDULE_WRITE", + "APPS_READ", + "APPS_WRITE", + "PROFILE_READ", + "PROFILE_WRITE", + ]); + }); + }); + + it("should delete managed organization ", async () => { + return request(app.getHttpServer()) + .delete(`/v2/organizations/${managerOrg.id}/organizations/${managedOrg.id}`) + .set("Authorization", `Bearer ${managerOrgAdminApiKey}`) + .expect(200) + .then(async (response) => { + const responseBody: ApiSuccessResponse = response.body; + expect(responseBody.status).toEqual(SUCCESS_STATUS); + const responseManagedOrg = responseBody.data; + expect(responseManagedOrg?.id).toBeDefined(); + expect(responseManagedOrg?.id).toEqual(managedOrg.id); + expect(responseManagedOrg?.name).toEqual(managedOrg.name); + + const managedOrgInDb = + await managedOrganizationsRepositoryFixture.getOrganizationWithManagedOrganizations(managedOrg.id); + expect(managedOrgInDb).toEqual(null); + + const billings = await platformBillingRepositoryFixture.getByCustomerSubscriptionIds( + managerOrgBilling.customerId, + managerOrgBilling.subscriptionId! + ); + expect(billings).toBeDefined(); + // note(Lauris): only manager billing is left + expect(billings?.length).toEqual(1); + + const managerOrgInDb = + await managedOrganizationsRepositoryFixture.getOrganizationWithManagedOrganizations(managerOrg.id); + expect(managerOrgInDb).toBeDefined(); + expect(managerOrgInDb?.id).toEqual(managerOrg.id); + expect(managerOrgInDb?.managedOrganizations?.length).toEqual(0); + }); + }); + + afterAll(async () => { + await userRepositoryFixture.deleteByEmail(managerOrgAdmin.email); + await organizationsRepositoryFixture.delete(managerOrg.id); + await app.close(); + }); +}); diff --git a/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.controller.ts b/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.controller.ts new file mode 100644 index 0000000000..4a1afc74bd --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.controller.ts @@ -0,0 +1,135 @@ +import { API_VERSIONS_VALUES } from "@/lib/api-versions"; +import { PlatformPlan } from "@/modules/auth/decorators/billing/platform-plan.decorator"; +import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; +import { Roles } from "@/modules/auth/decorators/roles/roles.decorator"; +import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; +import { PlatformPlanGuard } from "@/modules/auth/guards/billing/platform-plan.guard"; +import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-admin-api-enabled.guard"; +import { IsManagedOrgInManagerOrg } from "@/modules/auth/guards/organizations/is-managed-org-in-manager-org.guard"; +import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; +import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; +import { ApiAuthGuardUser } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { CreateOrganizationInput } from "@/modules/organizations/organizations/inputs/create-managed-organization.input"; +import { UpdateOrganizationInput } from "@/modules/organizations/organizations/inputs/update-managed-organization.input"; +import { CreateManagedOrganizationOutput } from "@/modules/organizations/organizations/outputs/create-managed-organization.output"; +import { GetManagedOrganizationOutput } from "@/modules/organizations/organizations/outputs/get-managed-organization.output"; +import { GetManagedOrganizationsOutput } from "@/modules/organizations/organizations/outputs/get-managed-organizations.output"; +import { ManagedOrganizationsService } from "@/modules/organizations/organizations/services/managed-organizations.service"; +import { + Controller, + UseGuards, + Param, + ParseIntPipe, + Post, + Body, + Get, + Patch, + HttpCode, + HttpStatus, + Delete, +} from "@nestjs/common"; +import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; + +import { SUCCESS_STATUS } from "@calcom/platform-constants"; + +const SCALE = "SCALE"; + +@Controller({ + path: "/v2/organizations/:orgId/organizations", + version: API_VERSIONS_VALUES, +}) +@UseGuards(ApiAuthGuard, IsOrgGuard, RolesGuard, PlatformPlanGuard, IsAdminAPIEnabledGuard) +@DocsTags("Orgs / Orgs") +export class OrganizationsOrganizationsController { + constructor(private readonly managedOrganizationsService: ManagedOrganizationsService) {} + + @Post() + @Roles("ORG_ADMIN") + @PlatformPlan(SCALE) + @ApiOperation({ summary: "Create an organization within an organization" }) + async createOrganization( + @Param("orgId", ParseIntPipe) managerOrganizationId: number, + @GetUser() authUser: ApiAuthGuardUser, + @Body() body: CreateOrganizationInput + ): Promise { + const organization = await this.managedOrganizationsService.createManagedOrganization( + authUser, + managerOrganizationId, + body + ); + + return { + status: SUCCESS_STATUS, + data: organization, + }; + } + + @Roles("ORG_ADMIN") + @PlatformPlan(SCALE) + @Get("/:managedOrganizationId") + @ApiOperation({ summary: "Get an organization within an organization" }) + @UseGuards(IsManagedOrgInManagerOrg) + async getOrganization( + @Param("managedOrganizationId", ParseIntPipe) managedOrganizationId: number + ): Promise { + const organization = await this.managedOrganizationsService.getManagedOrganization(managedOrganizationId); + return { + status: SUCCESS_STATUS, + data: organization, + }; + } + + @Roles("ORG_ADMIN") + @PlatformPlan(SCALE) + @Get("/") + @ApiOperation({ summary: "Get all organizations within an organization" }) + async getOrganizations( + @Param("orgId", ParseIntPipe) managerOrganizationId: number + ): Promise { + const organizations = await this.managedOrganizationsService.getManagedOrganizations( + managerOrganizationId + ); + return { + status: SUCCESS_STATUS, + data: organizations, + }; + } + + @Roles("ORG_ADMIN") + @PlatformPlan(SCALE) + @Patch("/:managedOrganizationId") + @ApiOperation({ summary: "Update an organization within an organization" }) + @UseGuards(IsManagedOrgInManagerOrg) + @HttpCode(HttpStatus.OK) + async updateOrganization( + @Param("orgId", ParseIntPipe) managerOrganizationId: number, + @Param("managedOrganizationId", ParseIntPipe) managedOrganizationId: number, + @Body() body: UpdateOrganizationInput + ): Promise { + const organization = await this.managedOrganizationsService.updateManagedOrganization( + managedOrganizationId, + body + ); + return { + status: SUCCESS_STATUS, + data: organization, + }; + } + + @Roles("ORG_ADMIN") + @PlatformPlan(SCALE) + @Delete("/:managedOrganizationId") + @ApiOperation({ summary: "Delete an organization within an organization" }) + @UseGuards(IsManagedOrgInManagerOrg) + async deleteOrganization( + @Param("managedOrganizationId", ParseIntPipe) managedOrganizationId: number + ): Promise { + const organization = await this.managedOrganizationsService.deleteManagedOrganization( + managedOrganizationId + ); + return { + status: SUCCESS_STATUS, + data: organization, + }; + } +} diff --git a/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.module.ts b/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.module.ts new file mode 100644 index 0000000000..153f1e2c91 --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/organizations-organizations.module.ts @@ -0,0 +1,31 @@ +import { ApiKeysModule } from "@/modules/api-keys/api-keys.module"; +import { ManagedOrganizationsBillingService } from "@/modules/billing/services/managed-organizations.billing.service"; +import { MembershipsModule } from "@/modules/memberships/memberships.module"; +import { MembershipsRepository } from "@/modules/memberships/memberships.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsMembershipRepository } from "@/modules/organizations/memberships/organizations-membership.repository"; +import { OrganizationsMembershipService } from "@/modules/organizations/memberships/services/organizations-membership.service"; +import { ManagedOrganizationsRepository } from "@/modules/organizations/organizations/managed-organizations.repository"; +import { OrganizationsOrganizationsController } from "@/modules/organizations/organizations/organizations-organizations.controller"; +import { ManagedOrganizationsOutputService } from "@/modules/organizations/organizations/services/managed-organizations-output.service"; +import { ManagedOrganizationsService } from "@/modules/organizations/organizations/services/managed-organizations.service"; +import { PrismaModule } from "@/modules/prisma/prisma.module"; +import { ProfilesModule } from "@/modules/profiles/profiles.module"; +import { RedisModule } from "@/modules/redis/redis.module"; +import { StripeModule } from "@/modules/stripe/stripe.module"; +import { Module } from "@nestjs/common"; + +@Module({ + imports: [PrismaModule, RedisModule, StripeModule, MembershipsModule, ApiKeysModule, ProfilesModule], + providers: [ + ManagedOrganizationsService, + ManagedOrganizationsRepository, + ManagedOrganizationsBillingService, + OrganizationsRepository, + OrganizationsMembershipService, + OrganizationsMembershipRepository, + ManagedOrganizationsOutputService, + ], + controllers: [OrganizationsOrganizationsController], +}) +export class OrganizationsOrganizationsModule {} diff --git a/apps/api/v2/src/modules/organizations/organizations/outputs/create-managed-organization.output.ts b/apps/api/v2/src/modules/organizations/organizations/outputs/create-managed-organization.output.ts new file mode 100644 index 0000000000..60be617211 --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/outputs/create-managed-organization.output.ts @@ -0,0 +1,18 @@ +import { ManagedOrganizationWithApiKeyOutput } from "@/modules/organizations/organizations/outputs/managed-organization.output"; +import { ApiProperty } from "@nestjs/swagger"; +import { Expose, Type } from "class-transformer"; +import { IsEnum, ValidateNested } from "class-validator"; + +import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants"; + +export class CreateManagedOrganizationOutput { + @ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] }) + @IsEnum([SUCCESS_STATUS, ERROR_STATUS]) + status!: typeof SUCCESS_STATUS | typeof ERROR_STATUS; + + @ApiProperty({ type: ManagedOrganizationWithApiKeyOutput }) + @Expose() + @ValidateNested() + @Type(() => ManagedOrganizationWithApiKeyOutput) + data!: ManagedOrganizationWithApiKeyOutput; +} diff --git a/apps/api/v2/src/modules/organizations/organizations/outputs/get-managed-organization.output.ts b/apps/api/v2/src/modules/organizations/organizations/outputs/get-managed-organization.output.ts new file mode 100644 index 0000000000..651f19c563 --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/outputs/get-managed-organization.output.ts @@ -0,0 +1,18 @@ +import { ManagedOrganizationOutput } from "@/modules/organizations/organizations/outputs/managed-organization.output"; +import { ApiProperty } from "@nestjs/swagger"; +import { Expose, Type } from "class-transformer"; +import { IsEnum, ValidateNested } from "class-validator"; + +import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants"; + +export class GetManagedOrganizationOutput { + @ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] }) + @IsEnum([SUCCESS_STATUS, ERROR_STATUS]) + status!: typeof SUCCESS_STATUS | typeof ERROR_STATUS; + + @ApiProperty({ type: ManagedOrganizationOutput }) + @Expose() + @ValidateNested() + @Type(() => ManagedOrganizationOutput) + data!: ManagedOrganizationOutput; +} diff --git a/apps/api/v2/src/modules/organizations/organizations/outputs/get-managed-organizations.output.ts b/apps/api/v2/src/modules/organizations/organizations/outputs/get-managed-organizations.output.ts new file mode 100644 index 0000000000..e063bcbe5d --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/outputs/get-managed-organizations.output.ts @@ -0,0 +1,20 @@ +import { ManagedOrganizationOutput } from "@/modules/organizations/organizations/outputs/managed-organization.output"; +import { ApiProperty } from "@nestjs/swagger"; +import { Expose, Type } from "class-transformer"; +import { IsEnum, ValidateNested } from "class-validator"; + +import { ERROR_STATUS, SUCCESS_STATUS } from "@calcom/platform-constants"; + +export class GetManagedOrganizationsOutput { + @ApiProperty({ example: SUCCESS_STATUS, enum: [SUCCESS_STATUS, ERROR_STATUS] }) + @IsEnum([SUCCESS_STATUS, ERROR_STATUS]) + status!: typeof SUCCESS_STATUS | typeof ERROR_STATUS; + + @ApiProperty({ + type: [ManagedOrganizationOutput], + }) + @Expose() + @ValidateNested({ each: true }) + @Type(() => ManagedOrganizationOutput) + data!: ManagedOrganizationOutput[]; +} diff --git a/apps/api/v2/src/modules/organizations/organizations/outputs/managed-organization.output.ts b/apps/api/v2/src/modules/organizations/organizations/outputs/managed-organization.output.ts new file mode 100644 index 0000000000..da11e3a0d6 --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/outputs/managed-organization.output.ts @@ -0,0 +1,30 @@ +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { Expose, Type } from "class-transformer"; +import { IsBoolean, IsInt, IsObject, IsOptional, IsString, Length, ValidateNested } from "class-validator"; + +export class ManagedOrganizationOutput { + @IsInt() + @Expose() + @ApiProperty() + readonly id!: number; + + @IsString() + @Length(1) + @Expose() + @ApiProperty() + readonly name!: string; + + @IsOptional() + @IsObject() + @Expose() + @ApiPropertyOptional({ type: Object }) + @Type(() => Object) + readonly metadata?: Record; +} + +export class ManagedOrganizationWithApiKeyOutput extends ManagedOrganizationOutput { + @IsString() + @Expose() + @ApiProperty() + readonly apiKey!: string; +} diff --git a/apps/api/v2/src/modules/organizations/organizations/services/managed-organizations-output.service.ts b/apps/api/v2/src/modules/organizations/organizations/services/managed-organizations-output.service.ts new file mode 100644 index 0000000000..66920f7e8f --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/services/managed-organizations-output.service.ts @@ -0,0 +1,15 @@ +import { ManagedOrganizationOutput } from "@/modules/organizations/organizations/outputs/managed-organization.output"; +import { Injectable } from "@nestjs/common"; + +import { Team } from "@calcom/prisma/client"; + +@Injectable() +export class ManagedOrganizationsOutputService { + getOutputManagedOrganization(managedOrganization: Team): ManagedOrganizationOutput { + return { + id: managedOrganization.id, + name: managedOrganization.name, + metadata: managedOrganization.metadata ? JSON.parse(managedOrganization.metadata as string) : {}, + }; + } +} diff --git a/apps/api/v2/src/modules/organizations/organizations/services/managed-organizations.service.ts b/apps/api/v2/src/modules/organizations/organizations/services/managed-organizations.service.ts new file mode 100644 index 0000000000..fc5ed226ae --- /dev/null +++ b/apps/api/v2/src/modules/organizations/organizations/services/managed-organizations.service.ts @@ -0,0 +1,119 @@ +import { ApiKeysService } from "@/modules/api-keys/services/api-keys.service"; +import { ApiAuthGuardUser } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { ManagedOrganizationsBillingService } from "@/modules/billing/services/managed-organizations.billing.service"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsMembershipService } from "@/modules/organizations/memberships/services/organizations-membership.service"; +import { CreateOrganizationInput } from "@/modules/organizations/organizations/inputs/create-managed-organization.input"; +import { UpdateOrganizationInput } from "@/modules/organizations/organizations/inputs/update-managed-organization.input"; +import { ManagedOrganizationsRepository } from "@/modules/organizations/organizations/managed-organizations.repository"; +import { ManagedOrganizationsOutputService } from "@/modules/organizations/organizations/services/managed-organizations-output.service"; +import { ProfilesRepository } from "@/modules/profiles/profiles.repository"; +import { ForbiddenException, Injectable, NotFoundException } from "@nestjs/common"; + +@Injectable() +export class ManagedOrganizationsService { + constructor( + private readonly managedOrganizationsRepository: ManagedOrganizationsRepository, + private readonly organizationsRepository: OrganizationsRepository, + private readonly managedOrganizationsBillingService: ManagedOrganizationsBillingService, + private readonly organizationsMembershipService: OrganizationsMembershipService, + private readonly apiKeysService: ApiKeysService, + private readonly managedOrganizationsOutputService: ManagedOrganizationsOutputService, + private readonly profilesRepository: ProfilesRepository + ) {} + + async createManagedOrganization( + authUser: ApiAuthGuardUser, + managerOrganizationId: number, + organizationInput: CreateOrganizationInput + ) { + const isManagerOrganizationPlatform = await this.isManagerOrganizationPlatform(managerOrganizationId); + if (!isManagerOrganizationPlatform) { + throw new ForbiddenException( + "Manager organization must be a platform organization. Normal organizations can't create managed organizations yet." + ); + } + + const { apiKeyDaysValid, apiKeyNeverExpires, ...organizationData } = organizationInput; + + const organization = await this.managedOrganizationsRepository.createManagedOrganization( + managerOrganizationId, + { + ...organizationData, + isOrganization: true, + isPlatform: true, + metadata: JSON.stringify(organizationData.metadata || {}), + } + ); + + await this.organizationsMembershipService.createOrgMembership(organization.id, { + userId: authUser.id, + accepted: true, + role: "OWNER", + }); + + const defaultProfileUsername = `${organization.name}-${authUser.id}`; + await this.profilesRepository.createProfile( + organization.id, + authUser.id, + authUser.username || defaultProfileUsername + ); + + await this.managedOrganizationsBillingService.createManagedOrganizationBilling( + managerOrganizationId, + organization.id + ); + + const apiKey = await this.apiKeysService.createApiKey(authUser.id, { + apiKeyDaysValid, + apiKeyNeverExpires, + note: `Managed organization API key. ManagerOrgId: ${managerOrganizationId}. ManagedOrgId: ${organization.id}`, + teamId: organization.id, + }); + + const outputOrganization = + this.managedOrganizationsOutputService.getOutputManagedOrganization(organization); + + return { + ...outputOrganization, + apiKey, + }; + } + + private async isManagerOrganizationPlatform(managerOrganizationId: number) { + const organization = await this.organizationsRepository.findById(managerOrganizationId); + return !!organization?.isPlatform; + } + + async getManagedOrganization(managedOrganizationId: number) { + const organization = await this.organizationsRepository.findById(managedOrganizationId); + if (!organization) { + throw new NotFoundException(`Managed organization with id=${managedOrganizationId} does not exist.`); + } + return this.managedOrganizationsOutputService.getOutputManagedOrganization(organization); + } + + async getManagedOrganizations(managerOrganizationId: number) { + const managedOrganizations = await this.managedOrganizationsRepository.getByManagerOrganizationId( + managerOrganizationId + ); + const managedOrganizationsIds = managedOrganizations.map( + (managedOrganization) => managedOrganization.managedOrganizationId + ); + + const organizations = await this.organizationsRepository.findByIds(managedOrganizationsIds); + return organizations.map((organization) => + this.managedOrganizationsOutputService.getOutputManagedOrganization(organization) + ); + } + + async updateManagedOrganization(managedOrganizationId: number, body: UpdateOrganizationInput) { + const organization = await this.organizationsRepository.update(managedOrganizationId, body); + return this.managedOrganizationsOutputService.getOutputManagedOrganization(organization); + } + + async deleteManagedOrganization(managedOrganizationId: number) { + const organization = await this.organizationsRepository.delete(managedOrganizationId); + return this.managedOrganizationsOutputService.getOutputManagedOrganization(organization); + } +} diff --git a/apps/api/v2/src/modules/organizations/controllers/schedules/organizations-schedules.controller.ts b/apps/api/v2/src/modules/organizations/schedules/organizations-schedules.controller.ts similarity index 98% rename from apps/api/v2/src/modules/organizations/controllers/schedules/organizations-schedules.controller.ts rename to apps/api/v2/src/modules/organizations/schedules/organizations-schedules.controller.ts index e032000849..004f761969 100644 --- a/apps/api/v2/src/modules/organizations/controllers/schedules/organizations-schedules.controller.ts +++ b/apps/api/v2/src/modules/organizations/schedules/organizations-schedules.controller.ts @@ -8,7 +8,7 @@ import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-a import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; import { IsUserInOrg } from "@/modules/auth/guards/users/is-user-in-org.guard"; -import { OrganizationsSchedulesService } from "@/modules/organizations/services/organizations-schedules.service"; +import { OrganizationsSchedulesService } from "@/modules/organizations/schedules/services/organizations-schedules.service"; import { Controller, UseGuards, diff --git a/apps/api/v2/src/modules/organizations/controllers/schedules/organizations-schedules.e2e-spec.ts b/apps/api/v2/src/modules/organizations/schedules/organizations-schedules.e2e-spec.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/schedules/organizations-schedules.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/schedules/organizations-schedules.e2e-spec.ts diff --git a/apps/api/v2/src/modules/organizations/repositories/organizations-schedules.repository.ts b/apps/api/v2/src/modules/organizations/schedules/organizations-schedules.repository.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/repositories/organizations-schedules.repository.ts rename to apps/api/v2/src/modules/organizations/schedules/organizations-schedules.repository.ts diff --git a/apps/api/v2/src/modules/organizations/services/organizations-schedules.service.ts b/apps/api/v2/src/modules/organizations/schedules/services/organizations-schedules.service.ts similarity index 95% rename from apps/api/v2/src/modules/organizations/services/organizations-schedules.service.ts rename to apps/api/v2/src/modules/organizations/schedules/services/organizations-schedules.service.ts index 7dfd39f033..4d5ddb9255 100644 --- a/apps/api/v2/src/modules/organizations/services/organizations-schedules.service.ts +++ b/apps/api/v2/src/modules/organizations/schedules/services/organizations-schedules.service.ts @@ -1,5 +1,5 @@ import { OutputSchedulesService_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/services/output-schedules.service"; -import { OrganizationSchedulesRepository } from "@/modules/organizations/repositories/organizations-schedules.repository"; +import { OrganizationSchedulesRepository } from "@/modules/organizations/schedules/organizations-schedules.repository"; import { UsersRepository } from "@/modules/users/users.repository"; import { Injectable } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/bookings/inputs/get-organizations-teams-bookings.input.ts b/apps/api/v2/src/modules/organizations/teams/bookings/inputs/get-organizations-teams-bookings.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/teams/bookings/inputs/get-organizations-teams-bookings.input.ts rename to apps/api/v2/src/modules/organizations/teams/bookings/inputs/get-organizations-teams-bookings.input.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.controller.e2e-spec.ts b/apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.controller.e2e-spec.ts similarity index 99% rename from apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.controller.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.controller.e2e-spec.ts index 638c590558..590f8c6bdd 100644 --- a/apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.controller.e2e-spec.ts @@ -4,7 +4,7 @@ import { CreateBookingOutput_2024_08_13 } from "@/ee/bookings/2024-08-13/outputs import { CreateScheduleInput_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/inputs/create-schedule.input"; import { SchedulesService_2024_04_15 } from "@/ee/schedules/schedules_2024_04_15/services/schedules.service"; import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard"; -import { OrganizationsTeamsBookingsModule } from "@/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.module"; +import { OrganizationsTeamsBookingsModule } from "@/modules/organizations/teams/bookings/organizations-teams-bookings.module"; import { INestApplication } from "@nestjs/common"; import { NestExpressApplication } from "@nestjs/platform-express"; import { Test } from "@nestjs/testing"; diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.controller.ts b/apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.controller.ts similarity index 96% rename from apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.controller.ts rename to apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.controller.ts index 1a8a5fe717..d503148e1f 100644 --- a/apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.controller.ts +++ b/apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.controller.ts @@ -10,7 +10,7 @@ import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-a import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; import { IsTeamInOrg } from "@/modules/auth/guards/teams/is-team-in-org.guard"; -import { GetOrganizationsTeamsBookingsInput_2024_08_13 } from "@/modules/organizations/controllers/teams/bookings/inputs/get-organizations-teams-bookings.input"; +import { GetOrganizationsTeamsBookingsInput_2024_08_13 } from "@/modules/organizations/teams/bookings/inputs/get-organizations-teams-bookings.input"; import { UserWithProfile } from "@/modules/users/users.repository"; import { Controller, UseGuards, Get, Param, ParseIntPipe, Query, HttpStatus, HttpCode } from "@nestjs/common"; import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.module.ts b/apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.module.ts similarity index 84% rename from apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.module.ts rename to apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.module.ts index 58d88dcbe0..3513e49ee1 100644 --- a/apps/api/v2/src/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.module.ts +++ b/apps/api/v2/src/modules/organizations/teams/bookings/organizations-teams-bookings.module.ts @@ -1,8 +1,8 @@ import { BookingsModule_2024_08_13 } from "@/ee/bookings/2024-08-13/bookings.module"; import { MembershipsModule } from "@/modules/memberships/memberships.module"; -import { OrganizationsTeamsBookingsController } from "@/modules/organizations/controllers/teams/bookings/organizations-teams-bookings.controller"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; -import { OrganizationsTeamsRepository } from "@/modules/organizations/repositories/organizations-teams.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsTeamsBookingsController } from "@/modules/organizations/teams/bookings/organizations-teams-bookings.controller"; +import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { RedisModule } from "@/modules/redis/redis.module"; import { StripeModule } from "@/modules/stripe/stripe.module"; diff --git a/apps/api/v2/src/modules/organizations/inputs/create-organization-team.input.ts b/apps/api/v2/src/modules/organizations/teams/index/inputs/create-organization-team.input.ts similarity index 59% rename from apps/api/v2/src/modules/organizations/inputs/create-organization-team.input.ts rename to apps/api/v2/src/modules/organizations/teams/index/inputs/create-organization-team.input.ts index e72e951138..6837f3b0a7 100644 --- a/apps/api/v2/src/modules/organizations/inputs/create-organization-team.input.ts +++ b/apps/api/v2/src/modules/organizations/teams/index/inputs/create-organization-team.input.ts @@ -1,3 +1,3 @@ import { CreateTeamInput } from "@/modules/teams/teams/inputs/create-team.input"; -export class CreateOrgTeamDto extends CreateTeamInput {} \ No newline at end of file +export class CreateOrgTeamDto extends CreateTeamInput {} diff --git a/apps/api/v2/src/modules/organizations/inputs/update-organization-team.input.ts b/apps/api/v2/src/modules/organizations/teams/index/inputs/update-organization-team.input.ts similarity index 59% rename from apps/api/v2/src/modules/organizations/inputs/update-organization-team.input.ts rename to apps/api/v2/src/modules/organizations/teams/index/inputs/update-organization-team.input.ts index a69070ab97..87d9402cbf 100644 --- a/apps/api/v2/src/modules/organizations/inputs/update-organization-team.input.ts +++ b/apps/api/v2/src/modules/organizations/teams/index/inputs/update-organization-team.input.ts @@ -1,3 +1,3 @@ import { UpdateTeamDto } from "@/modules/teams/teams/inputs/update-team.input"; -export class UpdateOrgTeamDto extends UpdateTeamDto {} \ No newline at end of file +export class UpdateOrgTeamDto extends UpdateTeamDto {} diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/organizations-teams.controller.e2e-spec.ts b/apps/api/v2/src/modules/organizations/teams/index/organizations-teams.controller.e2e-spec.ts similarity index 99% rename from apps/api/v2/src/modules/organizations/controllers/teams/organizations-teams.controller.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/teams/index/organizations-teams.controller.e2e-spec.ts index 74c8f7391b..fc3ef6781e 100644 --- a/apps/api/v2/src/modules/organizations/controllers/teams/organizations-teams.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/teams/index/organizations-teams.controller.e2e-spec.ts @@ -1,7 +1,7 @@ import { bootstrap } from "@/app"; import { AppModule } from "@/app.module"; -import { CreateOrgTeamDto } from "@/modules/organizations/inputs/create-organization-team.input"; -import { OrgMeTeamOutputDto } from "@/modules/organizations/outputs/organization-team.output"; +import { CreateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/create-organization-team.input"; +import { OrgMeTeamOutputDto } from "@/modules/organizations/teams/index/outputs/organization-team.output"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { TokensModule } from "@/modules/tokens/tokens.module"; import { UsersModule } from "@/modules/users/users.module"; diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/organizations-teams.controller.ts b/apps/api/v2/src/modules/organizations/teams/index/organizations-teams.controller.ts similarity index 94% rename from apps/api/v2/src/modules/organizations/controllers/teams/organizations-teams.controller.ts rename to apps/api/v2/src/modules/organizations/teams/index/organizations-teams.controller.ts index e9f9b798ed..49384d7246 100644 --- a/apps/api/v2/src/modules/organizations/controllers/teams/organizations-teams.controller.ts +++ b/apps/api/v2/src/modules/organizations/teams/index/organizations-teams.controller.ts @@ -9,15 +9,15 @@ import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-a import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; import { IsTeamInOrg } from "@/modules/auth/guards/teams/is-team-in-org.guard"; -import { CreateOrgTeamDto } from "@/modules/organizations/inputs/create-organization-team.input"; -import { UpdateOrgTeamDto } from "@/modules/organizations/inputs/update-organization-team.input"; +import { CreateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/create-organization-team.input"; +import { UpdateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/update-organization-team.input"; import { OrgMeTeamOutputDto, OrgMeTeamsOutputResponseDto, OrgTeamOutputResponseDto, OrgTeamsOutputResponseDto, -} from "@/modules/organizations/outputs/organization-team.output"; -import { OrganizationsTeamsService } from "@/modules/organizations/services/organizations-teams.service"; +} from "@/modules/organizations/teams/index/outputs/organization-team.output"; +import { OrganizationsTeamsService } from "@/modules/organizations/teams/index/services/organizations-teams.service"; import { UserWithProfile } from "@/modules/users/users.repository"; import { Controller, diff --git a/apps/api/v2/src/modules/organizations/repositories/organizations-teams.repository.ts b/apps/api/v2/src/modules/organizations/teams/index/organizations-teams.repository.ts similarity index 92% rename from apps/api/v2/src/modules/organizations/repositories/organizations-teams.repository.ts rename to apps/api/v2/src/modules/organizations/teams/index/organizations-teams.repository.ts index b92e056c0a..aec6615b7d 100644 --- a/apps/api/v2/src/modules/organizations/repositories/organizations-teams.repository.ts +++ b/apps/api/v2/src/modules/organizations/teams/index/organizations-teams.repository.ts @@ -1,5 +1,5 @@ -import { CreateOrgTeamDto } from "@/modules/organizations/inputs/create-organization-team.input"; -import { UpdateOrgTeamDto } from "@/modules/organizations/inputs/update-organization-team.input"; +import { CreateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/create-organization-team.input"; +import { UpdateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/update-organization-team.input"; import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-team.output.ts b/apps/api/v2/src/modules/organizations/teams/index/outputs/organization-team.output.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/outputs/organization-team.output.ts rename to apps/api/v2/src/modules/organizations/teams/index/outputs/organization-team.output.ts diff --git a/apps/api/v2/src/modules/organizations/services/organizations-teams.service.ts b/apps/api/v2/src/modules/organizations/teams/index/services/organizations-teams.service.ts similarity index 89% rename from apps/api/v2/src/modules/organizations/services/organizations-teams.service.ts rename to apps/api/v2/src/modules/organizations/teams/index/services/organizations-teams.service.ts index 391163a1c1..f4e3c6ed1f 100644 --- a/apps/api/v2/src/modules/organizations/services/organizations-teams.service.ts +++ b/apps/api/v2/src/modules/organizations/teams/index/services/organizations-teams.service.ts @@ -1,7 +1,7 @@ import { MembershipsRepository } from "@/modules/memberships/memberships.repository"; -import { CreateOrgTeamDto } from "@/modules/organizations/inputs/create-organization-team.input"; -import { UpdateOrgTeamDto } from "@/modules/organizations/inputs/update-organization-team.input"; -import { OrganizationsTeamsRepository } from "@/modules/organizations/repositories/organizations-teams.repository"; +import { CreateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/create-organization-team.input"; +import { UpdateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/update-organization-team.input"; +import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository"; import { UserWithProfile } from "@/modules/users/users.repository"; import { Injectable } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/inputs/create-organization-team-membership.input.ts b/apps/api/v2/src/modules/organizations/teams/memberships/inputs/create-organization-team-membership.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/create-organization-team-membership.input.ts rename to apps/api/v2/src/modules/organizations/teams/memberships/inputs/create-organization-team-membership.input.ts diff --git a/apps/api/v2/src/modules/organizations/inputs/update-organization-team-membership.input.ts b/apps/api/v2/src/modules/organizations/teams/memberships/inputs/update-organization-team-membership.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/update-organization-team-membership.input.ts rename to apps/api/v2/src/modules/organizations/teams/memberships/inputs/update-organization-team-membership.input.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/memberships/organizations-teams-memberships.controller.e2e-spec.ts b/apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.controller.e2e-spec.ts similarity index 98% rename from apps/api/v2/src/modules/organizations/controllers/teams/memberships/organizations-teams-memberships.controller.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.controller.e2e-spec.ts index a376801272..976201ed86 100644 --- a/apps/api/v2/src/modules/organizations/controllers/teams/memberships/organizations-teams-memberships.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.controller.e2e-spec.ts @@ -1,8 +1,8 @@ import { bootstrap } from "@/app"; import { AppModule } from "@/app.module"; -import { CreateOrgTeamMembershipDto } from "@/modules/organizations/inputs/create-organization-team-membership.input"; -import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/inputs/update-organization-team-membership.input"; -import { OrgTeamMembershipOutputDto } from "@/modules/organizations/outputs/organization-teams-memberships.output"; +import { CreateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/create-organization-team-membership.input"; +import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/update-organization-team-membership.input"; +import { OrgTeamMembershipOutputDto } from "@/modules/organizations/teams/memberships/outputs/organization-teams-memberships.output"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { TokensModule } from "@/modules/tokens/tokens.module"; import { UsersModule } from "@/modules/users/users.module"; diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/memberships/organizations-teams-memberships.controller.ts b/apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.controller.ts similarity index 95% rename from apps/api/v2/src/modules/organizations/controllers/teams/memberships/organizations-teams-memberships.controller.ts rename to apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.controller.ts index 523a3b89ed..50c40eead7 100644 --- a/apps/api/v2/src/modules/organizations/controllers/teams/memberships/organizations-teams-memberships.controller.ts +++ b/apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.controller.ts @@ -7,15 +7,15 @@ import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-a import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; import { IsTeamInOrg } from "@/modules/auth/guards/teams/is-team-in-org.guard"; -import { CreateOrgTeamMembershipDto } from "@/modules/organizations/inputs/create-organization-team-membership.input"; -import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/inputs/update-organization-team-membership.input"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { CreateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/create-organization-team-membership.input"; +import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/update-organization-team-membership.input"; import { OrgTeamMembershipOutputDto, OrgTeamMembershipsOutputResponseDto, OrgTeamMembershipOutputResponseDto, -} from "@/modules/organizations/outputs/organization-teams-memberships.output"; -import { OrganizationsTeamsMembershipsService } from "@/modules/organizations/services/organizations-teams-memberships.service"; +} from "@/modules/organizations/teams/memberships/outputs/organization-teams-memberships.output"; +import { OrganizationsTeamsMembershipsService } from "@/modules/organizations/teams/memberships/services/organizations-teams-memberships.service"; import { TeamsEventTypesService } from "@/modules/teams/event-types/services/teams-event-types.service"; import { Controller, diff --git a/apps/api/v2/src/modules/organizations/repositories/organizations-teams-memberships.repository.ts b/apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.repository.ts similarity index 94% rename from apps/api/v2/src/modules/organizations/repositories/organizations-teams-memberships.repository.ts rename to apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.repository.ts index e75b37ac89..c2b42e5f5c 100644 --- a/apps/api/v2/src/modules/organizations/repositories/organizations-teams-memberships.repository.ts +++ b/apps/api/v2/src/modules/organizations/teams/memberships/organizations-teams-memberships.repository.ts @@ -1,5 +1,5 @@ -import { CreateOrgTeamMembershipDto } from "@/modules/organizations/inputs/create-organization-team-membership.input"; -import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/inputs/update-organization-team-membership.input"; +import { CreateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/create-organization-team-membership.input"; +import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/update-organization-team-membership.input"; import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/outputs/organization-teams-memberships.output.ts b/apps/api/v2/src/modules/organizations/teams/memberships/outputs/organization-teams-memberships.output.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/outputs/organization-teams-memberships.output.ts rename to apps/api/v2/src/modules/organizations/teams/memberships/outputs/organization-teams-memberships.output.ts diff --git a/apps/api/v2/src/modules/organizations/services/organizations-teams-memberships.service.ts b/apps/api/v2/src/modules/organizations/teams/memberships/services/organizations-teams-memberships.service.ts similarity index 90% rename from apps/api/v2/src/modules/organizations/services/organizations-teams-memberships.service.ts rename to apps/api/v2/src/modules/organizations/teams/memberships/services/organizations-teams-memberships.service.ts index 8eb65f30cc..08319ec593 100644 --- a/apps/api/v2/src/modules/organizations/services/organizations-teams-memberships.service.ts +++ b/apps/api/v2/src/modules/organizations/teams/memberships/services/organizations-teams-memberships.service.ts @@ -1,6 +1,6 @@ -import { CreateOrgTeamMembershipDto } from "@/modules/organizations/inputs/create-organization-team-membership.input"; -import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/inputs/update-organization-team-membership.input"; -import { OrganizationsTeamsMembershipsRepository } from "@/modules/organizations/repositories/organizations-teams-memberships.repository"; +import { CreateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/create-organization-team-membership.input"; +import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/update-organization-team-membership.input"; +import { OrganizationsTeamsMembershipsRepository } from "@/modules/organizations/teams/memberships/organizations-teams-memberships.repository"; import { Injectable, NotFoundException } from "@nestjs/common"; @Injectable() diff --git a/apps/api/v2/src/modules/organizations/teams/routing-forms/organizations-teams-routing-forms-responses.module.ts b/apps/api/v2/src/modules/organizations/teams/routing-forms/organizations-teams-routing-forms-responses.module.ts index 37ddd54928..d5f16df299 100644 --- a/apps/api/v2/src/modules/organizations/teams/routing-forms/organizations-teams-routing-forms-responses.module.ts +++ b/apps/api/v2/src/modules/organizations/teams/routing-forms/organizations-teams-routing-forms-responses.module.ts @@ -1,5 +1,5 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; -import { OrganizationsTeamsRepository } from "@/modules/organizations/repositories/organizations-teams.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { RedisModule } from "@/modules/redis/redis.module"; import { RoutingFormsResponsesModule } from "@/modules/routing-forms-responses/routing-forms-responses.module"; diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/schedules/organizations-teams-schedules.controller.ts b/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.controller.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/teams/schedules/organizations-teams-schedules.controller.ts rename to apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.controller.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/teams/schedules/organizations-teams-schedules.e2e-spec.ts b/apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.e2e-spec.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/teams/schedules/organizations-teams-schedules.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/teams/schedules/organizations-teams-schedules.e2e-spec.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/users/organizations-users.controller.ts b/apps/api/v2/src/modules/organizations/users/index/controllers/organizations-users.controller.ts similarity index 93% rename from apps/api/v2/src/modules/organizations/controllers/users/organizations-users.controller.ts rename to apps/api/v2/src/modules/organizations/users/index/controllers/organizations-users.controller.ts index ebabb65aa9..1df354df09 100644 --- a/apps/api/v2/src/modules/organizations/controllers/users/organizations-users.controller.ts +++ b/apps/api/v2/src/modules/organizations/users/index/controllers/organizations-users.controller.ts @@ -9,15 +9,15 @@ import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-a import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; import { IsUserInOrg } from "@/modules/auth/guards/users/is-user-in-org.guard"; -import { CreateOrganizationUserInput } from "@/modules/organizations/inputs/create-organization-user.input"; -import { GetOrganizationsUsersInput } from "@/modules/organizations/inputs/get-organization-users.input"; -import { UpdateOrganizationUserInput } from "@/modules/organizations/inputs/update-organization-user.input"; +import { CreateOrganizationUserInput } from "@/modules/organizations/users/index/inputs/create-organization-user.input"; +import { GetOrganizationsUsersInput } from "@/modules/organizations/users/index/inputs/get-organization-users.input"; +import { UpdateOrganizationUserInput } from "@/modules/organizations/users/index/inputs/update-organization-user.input"; import { GetOrganizationUsersResponseDTO, GetOrgUsersWithProfileOutput, -} from "@/modules/organizations/outputs/get-organization-users.output"; -import { GetOrganizationUserOutput } from "@/modules/organizations/outputs/get-organization-users.output"; -import { OrganizationsUsersService } from "@/modules/organizations/services/organizations-users-service"; +} from "@/modules/organizations/users/index/outputs/get-organization-users.output"; +import { GetOrganizationUserOutput } from "@/modules/organizations/users/index/outputs/get-organization-users.output"; +import { OrganizationsUsersService } from "@/modules/organizations/users/index/services/organizations-users-service"; import { UserWithProfile } from "@/modules/users/users.repository"; import { Controller, diff --git a/apps/api/v2/src/modules/organizations/controllers/users/organizations-users.e2e-spec.ts b/apps/api/v2/src/modules/organizations/users/index/controllers/organizations-users.e2e-spec.ts similarity index 99% rename from apps/api/v2/src/modules/organizations/controllers/users/organizations-users.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/users/index/controllers/organizations-users.e2e-spec.ts index 3ed330655e..e2cbd64b3d 100644 --- a/apps/api/v2/src/modules/organizations/controllers/users/organizations-users.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/users/index/controllers/organizations-users.e2e-spec.ts @@ -1,7 +1,7 @@ import { bootstrap } from "@/app"; import { AppModule } from "@/app.module"; import { EmailService } from "@/modules/email/email.service"; -import { GetOrgUsersWithProfileOutput } from "@/modules/organizations/outputs/get-organization-users.output"; +import { GetOrgUsersWithProfileOutput } from "@/modules/organizations/users/index/outputs/get-organization-users.output"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { TokensModule } from "@/modules/tokens/tokens.module"; import { UsersModule } from "@/modules/users/users.module"; diff --git a/apps/api/v2/src/modules/organizations/inputs/create-organization-user.input.ts b/apps/api/v2/src/modules/organizations/users/index/inputs/create-organization-user.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/create-organization-user.input.ts rename to apps/api/v2/src/modules/organizations/users/index/inputs/create-organization-user.input.ts diff --git a/apps/api/v2/src/modules/organizations/inputs/get-organization-users.input.ts b/apps/api/v2/src/modules/organizations/users/index/inputs/get-organization-users.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/get-organization-users.input.ts rename to apps/api/v2/src/modules/organizations/users/index/inputs/get-organization-users.input.ts diff --git a/apps/api/v2/src/modules/organizations/inputs/update-organization-user.input.ts b/apps/api/v2/src/modules/organizations/users/index/inputs/update-organization-user.input.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/inputs/update-organization-user.input.ts rename to apps/api/v2/src/modules/organizations/users/index/inputs/update-organization-user.input.ts diff --git a/apps/api/v2/src/modules/organizations/repositories/organizations-users.repository.ts b/apps/api/v2/src/modules/organizations/users/index/organizations-users.repository.ts similarity index 96% rename from apps/api/v2/src/modules/organizations/repositories/organizations-users.repository.ts rename to apps/api/v2/src/modules/organizations/users/index/organizations-users.repository.ts index 0816b9a0d5..7727fc77d6 100644 --- a/apps/api/v2/src/modules/organizations/repositories/organizations-users.repository.ts +++ b/apps/api/v2/src/modules/organizations/users/index/organizations-users.repository.ts @@ -1,5 +1,5 @@ -import { CreateOrganizationUserInput } from "@/modules/organizations/inputs/create-organization-user.input"; -import { UpdateOrganizationUserInput } from "@/modules/organizations/inputs/update-organization-user.input"; +import { CreateOrganizationUserInput } from "@/modules/organizations/users/index/inputs/create-organization-user.input"; +import { UpdateOrganizationUserInput } from "@/modules/organizations/users/index/inputs/update-organization-user.input"; import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { Injectable } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/outputs/get-organization-users.output.ts b/apps/api/v2/src/modules/organizations/users/index/outputs/get-organization-users.output.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/outputs/get-organization-users.output.ts rename to apps/api/v2/src/modules/organizations/users/index/outputs/get-organization-users.output.ts diff --git a/apps/api/v2/src/modules/organizations/services/organizations-users-service.ts b/apps/api/v2/src/modules/organizations/users/index/services/organizations-users-service.ts similarity index 94% rename from apps/api/v2/src/modules/organizations/services/organizations-users-service.ts rename to apps/api/v2/src/modules/organizations/users/index/services/organizations-users-service.ts index 0fe739eb82..4c4e9c7afa 100644 --- a/apps/api/v2/src/modules/organizations/services/organizations-users-service.ts +++ b/apps/api/v2/src/modules/organizations/users/index/services/organizations-users-service.ts @@ -1,8 +1,8 @@ import { EmailService } from "@/modules/email/email.service"; -import { CreateOrganizationUserInput } from "@/modules/organizations/inputs/create-organization-user.input"; -import { UpdateOrganizationUserInput } from "@/modules/organizations/inputs/update-organization-user.input"; -import { OrganizationsUsersRepository } from "@/modules/organizations/repositories/organizations-users.repository"; -import { OrganizationsTeamsService } from "@/modules/organizations/services/organizations-teams.service"; +import { OrganizationsTeamsService } from "@/modules/organizations/teams/index/services/organizations-teams.service"; +import { CreateOrganizationUserInput } from "@/modules/organizations/users/index/inputs/create-organization-user.input"; +import { UpdateOrganizationUserInput } from "@/modules/organizations/users/index/inputs/update-organization-user.input"; +import { OrganizationsUsersRepository } from "@/modules/organizations/users/index/organizations-users.repository"; import { CreateUserInput } from "@/modules/users/inputs/create-user.input"; import { Injectable, ConflictException } from "@nestjs/common"; import { Team, CreationSource } from "@prisma/client"; diff --git a/apps/api/v2/src/modules/organizations/controllers/users/ooo/organizations-users-ooo-controller.ts b/apps/api/v2/src/modules/organizations/users/ooo/controllers/organizations-users-ooo-controller.ts similarity index 97% rename from apps/api/v2/src/modules/organizations/controllers/users/ooo/organizations-users-ooo-controller.ts rename to apps/api/v2/src/modules/organizations/users/ooo/controllers/organizations-users-ooo-controller.ts index d44c5d3954..a6659d256d 100644 --- a/apps/api/v2/src/modules/organizations/controllers/users/ooo/organizations-users-ooo-controller.ts +++ b/apps/api/v2/src/modules/organizations/users/ooo/controllers/organizations-users-ooo-controller.ts @@ -20,7 +20,7 @@ import { UserOoosOutputResponseDto, } from "@/modules/ooo/outputs/ooo.output"; import { UserOOOService } from "@/modules/ooo/services/ooo.service"; -import { OrgUsersOOOService } from "@/modules/organizations/controllers/users/ooo/services/organization-users-ooo.service"; +import { OrgUsersOOOService } from "@/modules/organizations/users/ooo/services/organization-users-ooo.service"; import { Controller, UseGuards, diff --git a/apps/api/v2/src/modules/organizations/controllers/users/ooo/organizations-users-ooo.e2e-spec.ts b/apps/api/v2/src/modules/organizations/users/ooo/controllers/organizations-users-ooo.e2e-spec.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/users/ooo/organizations-users-ooo.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/users/ooo/controllers/organizations-users-ooo.e2e-spec.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/users/ooo/repositories/organizations-users-ooo.repository.ts b/apps/api/v2/src/modules/organizations/users/ooo/organizations-users-ooo.repository.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/users/ooo/repositories/organizations-users-ooo.repository.ts rename to apps/api/v2/src/modules/organizations/users/ooo/organizations-users-ooo.repository.ts diff --git a/apps/api/v2/src/modules/organizations/controllers/users/ooo/services/organization-users-ooo.service.ts b/apps/api/v2/src/modules/organizations/users/ooo/services/organization-users-ooo.service.ts similarity index 87% rename from apps/api/v2/src/modules/organizations/controllers/users/ooo/services/organization-users-ooo.service.ts rename to apps/api/v2/src/modules/organizations/users/ooo/services/organization-users-ooo.service.ts index ccf3e7c4d2..08afa61293 100644 --- a/apps/api/v2/src/modules/organizations/controllers/users/ooo/services/organization-users-ooo.service.ts +++ b/apps/api/v2/src/modules/organizations/users/ooo/services/organization-users-ooo.service.ts @@ -1,6 +1,6 @@ import { UserOOORepository } from "@/modules/ooo/repositories/ooo.repository"; import { UserOOOService } from "@/modules/ooo/services/ooo.service"; -import { OrgUsersOOORepository } from "@/modules/organizations/controllers/users/ooo/repositories/organizations-users-ooo.repository"; +import { OrgUsersOOORepository } from "@/modules/organizations/users/ooo/organizations-users-ooo.repository"; import { UsersRepository } from "@/modules/users/users.repository"; import { Injectable } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/organizations/controllers/webhooks/organizations-webhooks.controller.ts b/apps/api/v2/src/modules/organizations/webhooks/controllers/organizations-webhooks.controller.ts similarity index 98% rename from apps/api/v2/src/modules/organizations/controllers/webhooks/organizations-webhooks.controller.ts rename to apps/api/v2/src/modules/organizations/webhooks/controllers/organizations-webhooks.controller.ts index 2875379d54..be7f392c97 100644 --- a/apps/api/v2/src/modules/organizations/controllers/webhooks/organizations-webhooks.controller.ts +++ b/apps/api/v2/src/modules/organizations/webhooks/controllers/organizations-webhooks.controller.ts @@ -7,7 +7,7 @@ import { IsAdminAPIEnabledGuard } from "@/modules/auth/guards/organizations/is-a import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard"; import { IsWebhookInOrg } from "@/modules/auth/guards/organizations/is-webhook-in-org.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; -import { OrganizationsWebhooksService } from "@/modules/organizations/services/organizations-webhooks.service"; +import { OrganizationsWebhooksService } from "@/modules/organizations/webhooks/services/organizations-webhooks.service"; import { CreateWebhookInputDto } from "@/modules/webhooks/inputs/webhook.input"; import { UpdateWebhookInputDto } from "@/modules/webhooks/inputs/webhook.input"; import { diff --git a/apps/api/v2/src/modules/organizations/controllers/webhooks/organizations-webhooks.e2e-spec.ts b/apps/api/v2/src/modules/organizations/webhooks/controllers/organizations-webhooks.e2e-spec.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/controllers/webhooks/organizations-webhooks.e2e-spec.ts rename to apps/api/v2/src/modules/organizations/webhooks/controllers/organizations-webhooks.e2e-spec.ts diff --git a/apps/api/v2/src/modules/organizations/repositories/organizations-webhooks.repository.ts b/apps/api/v2/src/modules/organizations/webhooks/organizations-webhooks.repository.ts similarity index 100% rename from apps/api/v2/src/modules/organizations/repositories/organizations-webhooks.repository.ts rename to apps/api/v2/src/modules/organizations/webhooks/organizations-webhooks.repository.ts diff --git a/apps/api/v2/src/modules/organizations/services/organizations-webhooks.service.ts b/apps/api/v2/src/modules/organizations/webhooks/services/organizations-webhooks.service.ts similarity index 96% rename from apps/api/v2/src/modules/organizations/services/organizations-webhooks.service.ts rename to apps/api/v2/src/modules/organizations/webhooks/services/organizations-webhooks.service.ts index 574ada6ae3..492b3ab135 100644 --- a/apps/api/v2/src/modules/organizations/services/organizations-webhooks.service.ts +++ b/apps/api/v2/src/modules/organizations/webhooks/services/organizations-webhooks.service.ts @@ -1,4 +1,4 @@ -import { OrganizationsWebhooksRepository } from "@/modules/organizations/repositories/organizations-webhooks.repository"; +import { OrganizationsWebhooksRepository } from "@/modules/organizations/webhooks/organizations-webhooks.repository"; import { UpdateWebhookInputDto } from "@/modules/webhooks/inputs/webhook.input"; import { PipedInputWebhookType } from "@/modules/webhooks/pipes/WebhookInputPipe"; import { WebhooksRepository } from "@/modules/webhooks/webhooks.repository"; diff --git a/apps/api/v2/src/modules/profiles/profiles.repository.ts b/apps/api/v2/src/modules/profiles/profiles.repository.ts index c3ba8fc150..beed9d43c5 100644 --- a/apps/api/v2/src/modules/profiles/profiles.repository.ts +++ b/apps/api/v2/src/modules/profiles/profiles.repository.ts @@ -1,5 +1,6 @@ import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { Injectable } from "@nestjs/common"; +import { v4 as uuidv4 } from "uuid"; @Injectable() export class ProfilesRepository { @@ -17,4 +18,15 @@ export class ProfilesRepository { return profile?.userId; } + + async createProfile(orgId: number, userId: number, userOrgUsername: string) { + await this.dbRead.prisma.profile.create({ + data: { + uid: uuidv4(), + organizationId: orgId, + userId, + username: userOrgUsername, + }, + }); + } } diff --git a/apps/api/v2/src/modules/routing-forms-responses/routing-forms-responses.module.ts b/apps/api/v2/src/modules/routing-forms-responses/routing-forms-responses.module.ts index 093cdada29..5f1a3ee792 100644 --- a/apps/api/v2/src/modules/routing-forms-responses/routing-forms-responses.module.ts +++ b/apps/api/v2/src/modules/routing-forms-responses/routing-forms-responses.module.ts @@ -1,4 +1,3 @@ -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { RoutingFormsResponsesRepository } from "@/modules/routing-forms-responses/routing-forms-responses.repository"; import { RoutingFormsResponsesOutputService } from "@/modules/routing-forms-responses/services/routing-forms-responses-output.service"; diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/services/slots-input.service.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/services/slots-input.service.ts index bc4999785c..8e9cf2ad72 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/services/slots-input.service.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/services/slots-input.service.ts @@ -1,6 +1,6 @@ import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; -import { OrganizationsUsersRepository } from "@/modules/organizations/repositories/organizations-users.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsUsersRepository } from "@/modules/organizations/users/index/organizations-users.repository"; import { UsersRepository } from "@/modules/users/users.repository"; import { Injectable, NotFoundException } from "@nestjs/common"; import { DateTime } from "luxon"; diff --git a/apps/api/v2/src/modules/slots/slots-2024-09-04/slots.module.ts b/apps/api/v2/src/modules/slots/slots-2024-09-04/slots.module.ts index 50e9e09450..9d022a8014 100644 --- a/apps/api/v2/src/modules/slots/slots-2024-09-04/slots.module.ts +++ b/apps/api/v2/src/modules/slots/slots-2024-09-04/slots.module.ts @@ -1,7 +1,7 @@ import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; import { MembershipsModule } from "@/modules/memberships/memberships.module"; -import { OrganizationsRepository } from "@/modules/organizations/organizations.repository"; -import { OrganizationsUsersRepository } from "@/modules/organizations/repositories/organizations-users.repository"; +import { OrganizationsRepository } from "@/modules/organizations/index/organizations.repository"; +import { OrganizationsUsersRepository } from "@/modules/organizations/users/index/organizations-users.repository"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { SlotsController_2024_09_04 } from "@/modules/slots/slots-2024-09-04/controllers/slots.controller"; import { SlotsInputService_2024_09_04 } from "@/modules/slots/slots-2024-09-04/services/slots-input.service"; diff --git a/apps/api/v2/src/modules/stripe/stripe.service.ts b/apps/api/v2/src/modules/stripe/stripe.service.ts index 24127678d3..e814797464 100644 --- a/apps/api/v2/src/modules/stripe/stripe.service.ts +++ b/apps/api/v2/src/modules/stripe/stripe.service.ts @@ -277,4 +277,8 @@ export class StripeService { return customerId; } + + async getSubscription(subscriptionId: string) { + return await this.stripe.subscriptions.retrieve(subscriptionId); + } } diff --git a/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.ts b/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.ts index 49d6e00146..74d8983750 100644 --- a/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.ts +++ b/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.ts @@ -6,9 +6,9 @@ import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; import { Roles } from "@/modules/auth/decorators/roles/roles.decorator"; import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; -import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/controllers/pipes/event-types/team-event-types-response.transformer"; -import { InputOrganizationsEventTypesService } from "@/modules/organizations/services/event-types/input.service"; -import { DatabaseTeamEventType } from "@/modules/organizations/services/event-types/output.service"; +import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/event-types/pipes/team-event-types-response.transformer"; +import { InputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/input.service"; +import { DatabaseTeamEventType } from "@/modules/organizations/event-types/services/output.service"; import { CreateTeamEventTypeOutput } from "@/modules/teams/event-types/outputs/create-team-event-type.output"; import { DeleteTeamEventTypeOutput } from "@/modules/teams/event-types/outputs/delete-team-event-type.output"; import { GetTeamEventTypeOutput } from "@/modules/teams/event-types/outputs/get-team-event-type.output"; diff --git a/apps/api/v2/src/modules/teams/event-types/services/teams-event-types.service.ts b/apps/api/v2/src/modules/teams/event-types/services/teams-event-types.service.ts index 41158b1357..bb9c5992c0 100644 --- a/apps/api/v2/src/modules/teams/event-types/services/teams-event-types.service.ts +++ b/apps/api/v2/src/modules/teams/event-types/services/teams-event-types.service.ts @@ -1,6 +1,6 @@ import { EventTypesRepository_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.repository"; import { EventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/event-types.service"; -import { DatabaseTeamEventType } from "@/modules/organizations/services/event-types/output.service"; +import { DatabaseTeamEventType } from "@/modules/organizations/event-types/services/output.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { TeamsEventTypesRepository } from "@/modules/teams/event-types/teams-event-types.repository"; import { UsersService } from "@/modules/users/services/users.service"; diff --git a/apps/api/v2/src/modules/teams/event-types/teams-event-types.module.ts b/apps/api/v2/src/modules/teams/event-types/teams-event-types.module.ts index 10e5556a7c..f6fcac1211 100644 --- a/apps/api/v2/src/modules/teams/event-types/teams-event-types.module.ts +++ b/apps/api/v2/src/modules/teams/event-types/teams-event-types.module.ts @@ -1,9 +1,9 @@ import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; import { MembershipsModule } from "@/modules/memberships/memberships.module"; -import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/controllers/pipes/event-types/team-event-types-response.transformer"; -import { OrganizationsTeamsRepository } from "@/modules/organizations/repositories/organizations-teams.repository"; -import { InputOrganizationsEventTypesService } from "@/modules/organizations/services/event-types/input.service"; -import { OutputOrganizationsEventTypesService } from "@/modules/organizations/services/event-types/output.service"; +import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/event-types/pipes/team-event-types-response.transformer"; +import { InputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/input.service"; +import { OutputOrganizationsEventTypesService } from "@/modules/organizations/event-types/services/output.service"; +import { OrganizationsTeamsRepository } from "@/modules/organizations/teams/index/organizations-teams.repository"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { RedisModule } from "@/modules/redis/redis.module"; import { TeamsEventTypesController } from "@/modules/teams/event-types/controllers/teams-event-types.controller"; diff --git a/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.e2e-spec.ts b/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.e2e-spec.ts index 4934e643d3..a180ff20c7 100644 --- a/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/teams/memberships/controllers/teams-memberships.controller.e2e-spec.ts @@ -1,8 +1,8 @@ import { bootstrap } from "@/app"; import { AppModule } from "@/app.module"; -import { CreateOrgTeamMembershipDto } from "@/modules/organizations/inputs/create-organization-team-membership.input"; -import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/inputs/update-organization-team-membership.input"; -import { OrgTeamMembershipOutputDto } from "@/modules/organizations/outputs/organization-teams-memberships.output"; +import { CreateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/create-organization-team-membership.input"; +import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/teams/memberships/inputs/update-organization-team-membership.input"; +import { OrgTeamMembershipOutputDto } from "@/modules/organizations/teams/memberships/outputs/organization-teams-memberships.output"; import { PrismaModule } from "@/modules/prisma/prisma.module"; import { CreateTeamMembershipInput } from "@/modules/teams/memberships/inputs/create-team-membership.input"; import { UpdateTeamMembershipInput } from "@/modules/teams/memberships/inputs/update-team-membership.input"; diff --git a/apps/api/v2/src/modules/teams/teams/controllers/teams.controller.ts b/apps/api/v2/src/modules/teams/teams/controllers/teams.controller.ts index 9947214c85..a9ac3af2a1 100644 --- a/apps/api/v2/src/modules/teams/teams/controllers/teams.controller.ts +++ b/apps/api/v2/src/modules/teams/teams/controllers/teams.controller.ts @@ -3,8 +3,8 @@ import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; import { Roles } from "@/modules/auth/decorators/roles/roles.decorator"; import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard"; -import { UpdateOrgTeamDto } from "@/modules/organizations/inputs/update-organization-team.input"; -import { OrgTeamOutputResponseDto } from "@/modules/organizations/outputs/organization-team.output"; +import { UpdateOrgTeamDto } from "@/modules/organizations/teams/index/inputs/update-organization-team.input"; +import { OrgTeamOutputResponseDto } from "@/modules/organizations/teams/index/outputs/organization-team.output"; import { CreateTeamInput } from "@/modules/teams/teams/inputs/create-team.input"; import { CreateTeamOutput } from "@/modules/teams/teams/outputs/teams/create-team.output"; import { GetTeamOutput } from "@/modules/teams/teams/outputs/teams/get-team.output"; diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 639e220a65..127447be79 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -772,7 +772,7 @@ }, "/v2/organizations/{orgId}/attributes/{attributeId}/options": { "post": { - "operationId": "OrganizationsOptionsAttributesController_createOrganizationAttributeOption", + "operationId": "OrganizationsAttributesOptionsController_createOrganizationAttributeOption", "summary": "Create an attribute option", "parameters": [ { @@ -819,7 +819,7 @@ ] }, "get": { - "operationId": "OrganizationsOptionsAttributesController_getOrganizationAttributeOptions", + "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptions", "summary": "Get all attribute options", "parameters": [ { @@ -858,7 +858,7 @@ }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/{optionId}": { "delete": { - "operationId": "OrganizationsOptionsAttributesController_deleteOrganizationAttributeOption", + "operationId": "OrganizationsAttributesOptionsController_deleteOrganizationAttributeOption", "summary": "Delete an attribute option", "parameters": [ { @@ -903,7 +903,7 @@ ] }, "patch": { - "operationId": "OrganizationsOptionsAttributesController_updateOrganizationAttributeOption", + "operationId": "OrganizationsAttributesOptionsController_updateOrganizationAttributeOption", "summary": "Update an attribute option", "parameters": [ { @@ -960,7 +960,7 @@ }, "/v2/organizations/{orgId}/attributes/options/{userId}": { "post": { - "operationId": "OrganizationsOptionsAttributesController_assignOrganizationAttributeOptionToUser", + "operationId": "OrganizationsAttributesOptionsController_assignOrganizationAttributeOptionToUser", "summary": "Assign an attribute to a user", "parameters": [ { @@ -1007,7 +1007,7 @@ ] }, "get": { - "operationId": "OrganizationsOptionsAttributesController_getOrganizationAttributeOptionsForUser", + "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptionsForUser", "summary": "Get all attribute options for a user", "parameters": [ { @@ -1046,7 +1046,7 @@ }, "/v2/organizations/{orgId}/attributes/options/{userId}/{attributeOptionId}": { "delete": { - "operationId": "OrganizationsOptionsAttributesController_unassignOrganizationAttributeOptionFromUser", + "operationId": "OrganizationsAttributesOptionsController_unassignOrganizationAttributeOptionFromUser", "summary": "Unassign an attribute from a user", "parameters": [ { @@ -1623,6 +1623,183 @@ ] } }, + "/v2/organizations/{orgId}/organizations": { + "post": { + "operationId": "OrganizationsOrganizationsController_createOrganization", + "summary": "Create an organization within an organization", + "parameters": [ + { + "name": "orgId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOrganizationInput" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateManagedOrganizationOutput" + } + } + } + } + }, + "tags": [ + "Orgs / Orgs" + ] + }, + "get": { + "operationId": "OrganizationsOrganizationsController_getOrganizations", + "summary": "Get all organizations within an organization", + "parameters": [ + { + "name": "orgId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationsOutput" + } + } + } + } + }, + "tags": [ + "Orgs / Orgs" + ] + } + }, + "/v2/organizations/{orgId}/organizations/{managedOrganizationId}": { + "get": { + "operationId": "OrganizationsOrganizationsController_getOrganization", + "summary": "Get an organization within an organization", + "parameters": [ + { + "name": "managedOrganizationId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationOutput" + } + } + } + } + }, + "tags": [ + "Orgs / Orgs" + ] + }, + "patch": { + "operationId": "OrganizationsOrganizationsController_updateOrganization", + "summary": "Update an organization within an organization", + "parameters": [ + { + "name": "orgId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "managedOrganizationId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrganizationInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationOutput" + } + } + } + } + }, + "tags": [ + "Orgs / Orgs" + ] + }, + "delete": { + "operationId": "OrganizationsOrganizationsController_deleteOrganization", + "summary": "Delete an organization within an organization", + "parameters": [ + { + "name": "managedOrganizationId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationOutput" + } + } + } + } + }, + "tags": [ + "Orgs / Orgs" + ] + } + }, "/v2/organizations/{orgId}/schedules": { "get": { "operationId": "OrganizationsSchedulesController_getOrganizationSchedules", @@ -2557,13 +2734,13 @@ ] } }, - "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routing}-formId/responses": { + "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses": { "get": { "operationId": "OrganizationsTeamsRoutingFormsResponsesController_getRoutingFormResponses", "summary": "Get routing form responses", "parameters": [ { - "name": "routing-formId", + "name": "routingFormId", "required": true, "in": "path", "schema": { @@ -3250,6 +3427,49 @@ ] } }, + "/v2/api-keys/refresh": { + "post": { + "operationId": "ApiKeysController_refresh", + "summary": "Refresh API Key", + "description": "Generate a new API key and delete the current one. Provide API key to refresh as a Bearer token in the Authorization header (e.g. \"Authorization: Bearer \").", + "parameters": [ + { + "name": "Authorization", + "in": "header", + "description": "Bearer ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshApiKeyInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshApiKeyOutput" + } + } + } + } + }, + "tags": [ + "Api Keys" + ] + } + }, "/v2/bookings": { "post": { "operationId": "BookingsController_2024_08_13_createBooking", @@ -5082,6 +5302,204 @@ ] } }, + "/v2/oauth-clients": { + "post": { + "operationId": "OAuthClientsController_createOAuthClient", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOAuthClientInput" + } + } + } + }, + "responses": { + "201": { + "description": "Create an OAuth client", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOAuthClientResponseDto" + } + } + } + } + }, + "tags": [ + "OAuth Clients" + ] + }, + "get": { + "operationId": "OAuthClientsController_getOAuthClients", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientsResponseDto" + } + } + } + } + }, + "tags": [ + "OAuth Clients" + ] + } + }, + "/v2/oauth-clients/{clientId}": { + "get": { + "operationId": "OAuthClientsController_getOAuthClientById", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientResponseDto" + } + } + } + } + }, + "tags": [ + "OAuth Clients" + ] + }, + "patch": { + "operationId": "OAuthClientsController_updateOAuthClient", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOAuthClientInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientResponseDto" + } + } + } + } + }, + "tags": [ + "OAuth Clients" + ] + }, + "delete": { + "operationId": "OAuthClientsController_deleteOAuthClient", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientResponseDto" + } + } + } + } + }, + "tags": [ + "OAuth Clients" + ] + } + }, + "/v2/oauth-clients/{clientId}/managed-users": { + "get": { + "operationId": "OAuthClientsController_getOAuthClientManagedUsersById", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "The number of items to return", + "example": 10, + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedUsersOutput" + } + } + } + } + }, + "tags": [ + "OAuth Clients" + ] + } + }, "/v2/schedules": { "post": { "operationId": "SchedulesController_2024_06_11_createSchedule", @@ -7187,7 +7605,24 @@ } }, "permissions": { - "type": "number" + "type": "array", + "description": "Array of permission keys like [\"BOOKING_READ\", \"BOOKING_WRITE\"]. Use [\"*\"] to grant all permissions.", + "items": { + "type": "string", + "enum": [ + "EVENT_TYPE_READ", + "EVENT_TYPE_WRITE", + "BOOKING_READ", + "BOOKING_WRITE", + "SCHEDULE_READ", + "SCHEDULE_WRITE", + "APPS_READ", + "APPS_WRITE", + "PROFILE_READ", + "PROFILE_WRITE", + "*" + ] + } }, "bookingRedirectUri": { "type": "string" @@ -7269,12 +7704,30 @@ "example": "secretValue" }, "permissions": { - "type": "number", - "example": 3 + "type": "array", + "description": "Array of permission keys like [\"BOOKING_READ\", \"BOOKING_WRITE\"]", + "items": { + "type": "string", + "enum": [ + "EVENT_TYPE_READ", + "EVENT_TYPE_WRITE", + "BOOKING_READ", + "BOOKING_WRITE", + "SCHEDULE_READ", + "SCHEDULE_WRITE", + "APPS_READ", + "APPS_WRITE", + "PROFILE_READ", + "PROFILE_WRITE" + ] + }, + "example": [ + "BOOKING_READ", + "BOOKING_WRITE" + ] }, "logo": { - "type": "string", - "nullable": true, + "type": "object", "example": "https://example.com/logo.png" }, "redirectUris": { @@ -7294,6 +7747,22 @@ "format": "date-time", "type": "string", "example": "2024-03-23T08:33:21.851Z" + }, + "bookingRedirectUri": { + "type": "string", + "example": "https://example.com/booking-redirect" + }, + "bookingCancelRedirectUri": { + "type": "string", + "example": "https://example.com/booking-cancel" + }, + "bookingRescheduleRedirectUri": { + "type": "string", + "example": "https://example.com/booking-reschedule" + }, + "areEmailsEnabled": { + "type": "boolean", + "example": false } }, "required": [ @@ -7390,6 +7859,54 @@ "refreshToken" ] }, + "RefreshApiKeyInput": { + "type": "object", + "properties": { + "apiKeyDaysValid": { + "type": "number", + "minimum": 1, + "description": "For how many days is managed organization api key valid. Defaults to 30 days.", + "example": 60, + "default": 30 + }, + "apiKeyNeverExpires": { + "type": "boolean", + "description": "If true, organization api key never expires.", + "example": true + } + } + }, + "ApiKeyOutput": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + } + }, + "required": [ + "apiKey" + ] + }, + "RefreshApiKeyOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": [ + "success", + "error" + ] + }, + "data": { + "$ref": "#/components/schemas/ApiKeyOutput" + } + }, + "required": [ + "status", + "data" + ] + }, "InputAddressLocation_2024_06_14": { "type": "object", "properties": { @@ -14354,6 +14871,154 @@ "data" ] }, + "CreateOrganizationInput": { + "type": "object", + "properties": { + "apiKeyDaysValid": { + "type": "number", + "minimum": 1, + "description": "For how many days is managed organization api key valid. Defaults to 30 days.", + "example": 60, + "default": 30 + }, + "apiKeyNeverExpires": { + "type": "boolean", + "description": "If true, organization api key never expires.", + "example": true + }, + "name": { + "type": "string", + "minLength": 1, + "description": "Name of the organization", + "example": "CalTeam" + }, + "metadata": { + "type": "object" + } + }, + "required": [ + "name" + ] + }, + "ManagedOrganizationWithApiKeyOutput": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "metadata": { + "type": "object" + }, + "apiKey": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "apiKey" + ] + }, + "CreateManagedOrganizationOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": [ + "success", + "error" + ] + }, + "data": { + "$ref": "#/components/schemas/ManagedOrganizationWithApiKeyOutput" + } + }, + "required": [ + "status", + "data" + ] + }, + "ManagedOrganizationOutput": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "metadata": { + "type": "object" + } + }, + "required": [ + "id", + "name" + ] + }, + "GetManagedOrganizationOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": [ + "success", + "error" + ] + }, + "data": { + "$ref": "#/components/schemas/ManagedOrganizationOutput" + } + }, + "required": [ + "status", + "data" + ] + }, + "GetManagedOrganizationsOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": [ + "success", + "error" + ] + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ManagedOrganizationOutput" + } + } + }, + "required": [ + "status", + "data" + ] + }, + "UpdateOrganizationInput": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Name of the organization", + "example": "CalTeam" + }, + "metadata": { + "type": "string" + } + } + }, "RoutingFormResponseOutput": { "type": "object", "properties": { diff --git a/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts index ddf1132905..117fa0aeb6 100644 --- a/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/api-keys.repository.fixture.ts @@ -25,4 +25,12 @@ export class ApiKeysRepositoryFixture { return { apiKey, keyString }; } + + async getTeamApiKeys(teamId: number) { + return await this.prismaReadClient.apiKey.findMany({ + where: { + teamId, + }, + }); + } } diff --git a/apps/api/v2/test/fixtures/repository/billing.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/billing.repository.fixture.ts index 4056539921..e53709519c 100644 --- a/apps/api/v2/test/fixtures/repository/billing.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/billing.repository.fixture.ts @@ -11,14 +11,14 @@ export class PlatformBillingRepositoryFixture { this.prismaWriteClient = module.get(PrismaWriteService).prisma; } - async create(orgId: number) { + async create(orgId: number, plan?: string) { const randomString = Date.now().toString(36); return this.prismaWriteClient.platformBilling.create({ data: { id: orgId, customerId: `cus_123_${randomString}`, subscriptionId: `sub_123_${randomString}`, - plan: "STARTER", + plan: plan || "STARTER", }, }); } @@ -28,6 +28,19 @@ export class PlatformBillingRepositoryFixture { where: { id: orgId, }, + include: { + managerBilling: true, + managedBillings: true, + }, + }); + } + + async getByCustomerSubscriptionIds(customerId: string, subscriptionId: string) { + return this.prismaWriteClient.platformBilling.findMany({ + where: { + customerId, + subscriptionId, + }, }); } diff --git a/apps/api/v2/test/fixtures/repository/managed-organizations.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/managed-organizations.repository.fixture.ts new file mode 100644 index 0000000000..3e5cd86821 --- /dev/null +++ b/apps/api/v2/test/fixtures/repository/managed-organizations.repository.fixture.ts @@ -0,0 +1,37 @@ +import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; +import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; +import { TestingModule } from "@nestjs/testing"; + +export class ManagedOrganizationsRepositoryFixture { + private prismaReadClient: PrismaReadService["prisma"]; + private prismaWriteClient: PrismaWriteService["prisma"]; + + constructor(private readonly module: TestingModule) { + this.prismaReadClient = module.get(PrismaReadService).prisma; + this.prismaWriteClient = module.get(PrismaWriteService).prisma; + } + + async getOrganizationWithManagedOrganizations(organizationId: number) { + return this.prismaReadClient.team.findUnique({ + where: { + id: organizationId, + isOrganization: true, + }, + include: { + managedOrganization: true, + managedOrganizations: true, + }, + }); + } + + async getManagedOrganization(managerOrganizationId: number, managedOrganizationId: number) { + return this.prismaReadClient.managedOrganization.findUnique({ + where: { + managerOrganizationId_managedOrganizationId: { + managerOrganizationId, + managedOrganizationId, + }, + }, + }); + } +} diff --git a/apps/api/v2/test/fixtures/repository/oauth-client.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/oauth-client.repository.fixture.ts index 4aeb2868b0..c76acc2f2f 100644 --- a/apps/api/v2/test/fixtures/repository/oauth-client.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/oauth-client.repository.fixture.ts @@ -1,7 +1,7 @@ import { PrismaReadService } from "@/modules/prisma/prisma-read.service"; import { PrismaWriteService } from "@/modules/prisma/prisma-write.service"; import { TestingModule } from "@nestjs/testing"; -import { PlatformOAuthClient } from "@prisma/client"; +import { PlatformOAuthClient, Prisma } from "@prisma/client"; import { CreateOAuthClientInput } from "@calcom/platform-types"; @@ -18,6 +18,10 @@ export class OAuthClientRepositoryFixture { return this.prismaReadClient.platformOAuthClient.findFirst({ where: { id: clientId } }); } + async getByOrgId(orgId: PlatformOAuthClient["organizationId"]) { + return this.prismaReadClient.platformOAuthClient.findMany({ where: { organizationId: orgId } }); + } + async getUsers(clientId: PlatformOAuthClient["id"]) { const response = await this.prismaReadClient.platformOAuthClient.findFirst({ where: { id: clientId }, @@ -29,7 +33,11 @@ export class OAuthClientRepositoryFixture { return response?.users; } - async create(organizationId: number, data: CreateOAuthClientInput, secret: string) { + async create( + organizationId: number, + data: Omit, + secret: string + ) { return this.prismaWriteClient.platformOAuthClient.create({ data: { ...data, diff --git a/apps/api/v2/test/fixtures/repository/profiles.repository.fixture.ts b/apps/api/v2/test/fixtures/repository/profiles.repository.fixture.ts index fbaf918b13..6aa16be9c9 100644 --- a/apps/api/v2/test/fixtures/repository/profiles.repository.fixture.ts +++ b/apps/api/v2/test/fixtures/repository/profiles.repository.fixture.ts @@ -16,6 +16,10 @@ export class ProfileRepositoryFixture { return this.prismaReadClient.profile.findFirst({ where: { id: profileId } }); } + async findByOrgIdUserId(orgId: number, userId: number) { + return this.prismaReadClient.profile.findFirst({ where: { userId, organizationId: orgId } }); + } + async create(data: Prisma.ProfileCreateInput) { return this.prismaWriteClient.profile.create({ data }); } diff --git a/apps/api/v2/test/mocks/api-auth-mock.strategy.ts b/apps/api/v2/test/mocks/api-auth-mock.strategy.ts index 9a7e760740..d00596d713 100644 --- a/apps/api/v2/test/mocks/api-auth-mock.strategy.ts +++ b/apps/api/v2/test/mocks/api-auth-mock.strategy.ts @@ -1,21 +1,30 @@ import { BaseStrategy } from "@/lib/passport/strategies/types"; +import { ApiAuthGuardRequest } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { UsersService } from "@/modules/users/services/users.service"; import { UsersRepository } from "@/modules/users/users.repository"; import { Injectable } from "@nestjs/common"; import { PassportStrategy } from "@nestjs/passport"; @Injectable() export class ApiAuthMockStrategy extends PassportStrategy(BaseStrategy, "api-auth") { - constructor(private readonly email: string, private readonly usersRepository: UsersRepository) { + constructor( + private readonly email: string, + private readonly usersRepository: UsersRepository, + private readonly usersService: UsersService + ) { super(); } - async authenticate() { + async authenticate(request: ApiAuthGuardRequest) { try { const user = await this.usersRepository.findByEmailWithProfile(this.email); if (!user) { throw new Error("User with the provided ID not found"); } + const organizationId = this.usersService.getUserMainOrgId(user) as number; + request.organizationId = organizationId; + return this.success(user); } catch (error) { console.error(error); diff --git a/apps/api/v2/test/utils/withApiAuth.ts b/apps/api/v2/test/utils/withApiAuth.ts index bc5a4904b8..ee05908587 100644 --- a/apps/api/v2/test/utils/withApiAuth.ts +++ b/apps/api/v2/test/utils/withApiAuth.ts @@ -1,10 +1,12 @@ import { ApiAuthStrategy } from "@/modules/auth/strategies/api-auth/api-auth.strategy"; +import { UsersService } from "@/modules/users/services/users.service"; import { UsersRepository } from "@/modules/users/users.repository"; import { TestingModuleBuilder } from "@nestjs/testing"; import { ApiAuthMockStrategy } from "test/mocks/api-auth-mock.strategy"; export const withApiAuth = (email: string, module: TestingModuleBuilder) => module.overrideProvider(ApiAuthStrategy).useFactory({ - factory: (usersRepository: UsersRepository) => new ApiAuthMockStrategy(email, usersRepository), - inject: [UsersRepository], + factory: (usersRepository: UsersRepository, usersService: UsersService) => + new ApiAuthMockStrategy(email, usersRepository, usersService), + inject: [UsersRepository, UsersService], }); diff --git a/apps/web/components/settings/platform/dashboard/oauth-clients-list/index.tsx b/apps/web/components/settings/platform/dashboard/oauth-clients-list/index.tsx index e8b5a9bba7..52c2bc0225 100644 --- a/apps/web/components/settings/platform/dashboard/oauth-clients-list/index.tsx +++ b/apps/web/components/settings/platform/dashboard/oauth-clients-list/index.tsx @@ -1,12 +1,12 @@ import { useRouter } from "next/navigation"; -import type { PlatformOAuthClient } from "@calcom/prisma/client"; +import type { PlatformOAuthClientDto } from "@calcom/platform-types"; import { EmptyScreen, Button } from "@calcom/ui"; import { OAuthClientCard } from "@components/settings/platform/oauth-clients/OAuthClientCard"; type OAuthClientsListProps = { - oauthClients: PlatformOAuthClient[]; + oauthClients: PlatformOAuthClientDto[]; isDeleting: boolean; handleDelete: (id: string) => Promise; }; diff --git a/apps/web/components/settings/platform/oauth-clients/OAuthClientCard.tsx b/apps/web/components/settings/platform/oauth-clients/OAuthClientCard.tsx index 2d04420c20..56daa78b27 100644 --- a/apps/web/components/settings/platform/oauth-clients/OAuthClientCard.tsx +++ b/apps/web/components/settings/platform/oauth-clients/OAuthClientCard.tsx @@ -2,21 +2,20 @@ import { useRouter } from "next/navigation"; import React from "react"; import { classNames } from "@calcom/lib"; +import type { PERMISSION_MAP } from "@calcom/platform-constants"; import { PERMISSIONS_GROUPED_MAP } from "@calcom/platform-constants"; import type { Avatar } from "@calcom/prisma/client"; import { Button, Icon, showToast } from "@calcom/ui"; -import { hasPermission } from "../../../../../../packages/platform/utils/permissions"; - type OAuthClientCardProps = { name: string; logo?: Avatar; redirectUris: string[]; - bookingRedirectUri: string | null; - bookingCancelRedirectUri: string | null; - bookingRescheduleRedirectUri: string | null; - areEmailsEnabled: boolean; - permissions: number; + bookingRedirectUri: string | null | undefined; + bookingCancelRedirectUri: string | null | undefined; + bookingRescheduleRedirectUri: string | null | undefined; + areEmailsEnabled: boolean | undefined; + permissions: Array; lastItem: boolean; id: string; secret: string; @@ -43,26 +42,36 @@ export const OAuthClientCard = ({ }: OAuthClientCardProps) => { const router = useRouter(); - const clientPermissions = Object.values(PERMISSIONS_GROUPED_MAP).map((value, index) => { - let permissionsMessage = ""; - const hasReadPermission = hasPermission(permissions, value.read); - const hasWritePermission = hasPermission(permissions, value.write); + const groupedPermissions = permissions.reduce>( + (acc, permission) => { + const [resource] = permission.split("_READ") as [string] | [string, string]; + const isRead = permission.endsWith("_READ"); + const isWrite = permission.endsWith("_WRITE"); + const key = resource.replace("_WRITE", ""); - if (hasReadPermission || hasWritePermission) { - permissionsMessage = hasReadPermission ? "read" : "write"; - } + if (!acc[key]) acc[key] = { read: false, write: false }; + if (isRead) acc[key].read = true; + if (isWrite) acc[key].write = true; - if (hasReadPermission && hasWritePermission) { - permissionsMessage = "read/write"; - } + return acc; + }, + {} + ); + + const clientPermissions = Object.entries(groupedPermissions).map(([resource, { read, write }], index) => { + const permissionTypes = []; + if (read) permissionTypes.push("read"); + if (write) permissionTypes.push("write"); + + const permissionsMessage = permissionTypes.join("/"); + const groupedPermission = PERMISSIONS_GROUPED_MAP[resource as keyof typeof PERMISSIONS_GROUPED_MAP]; + const isLastItem = index === Object.keys(groupedPermissions).length - 1; return ( - !!permissionsMessage && ( -
-  {permissionsMessage} {`${value.label}s`.toLocaleLowerCase()} - {Object.values(PERMISSIONS_GROUPED_MAP).length === index + 1 ? " " : ", "} -
- ) +
+  {permissionsMessage} {groupedPermission?.label.toLowerCase()} + {!isLastItem && ", "} +
); }); diff --git a/apps/web/lib/hooks/settings/platform/oauth-clients/useOAuthClients.ts b/apps/web/lib/hooks/settings/platform/oauth-clients/useOAuthClients.ts index 5201e9d051..13ea78c120 100644 --- a/apps/web/lib/hooks/settings/platform/oauth-clients/useOAuthClients.ts +++ b/apps/web/lib/hooks/settings/platform/oauth-clients/useOAuthClients.ts @@ -1,7 +1,6 @@ import { useQuery } from "@tanstack/react-query"; -import type { ApiSuccessResponse } from "@calcom/platform-types"; -import type { PlatformOAuthClient } from "@calcom/prisma/client"; +import type { ApiSuccessResponse, PlatformOAuthClientDto } from "@calcom/platform-types"; export type ManagedUser = { id: number; @@ -15,7 +14,7 @@ export type ManagedUser = { }; export const useOAuthClients = () => { - const query = useQuery>({ + const query = useQuery>({ queryKey: ["oauth-clients"], queryFn: () => { return fetch("/api/v2/oauth-clients", { @@ -39,7 +38,7 @@ export const useOAuthClient = (clientId?: string) => { isSuccess, isFetchedAfterMount, refetch, - } = useQuery>({ + } = useQuery>({ queryKey: ["oauth-client", clientId], queryFn: () => { return fetch(`/api/v2/oauth-clients/${clientId}`, { diff --git a/apps/web/lib/hooks/settings/platform/oauth-clients/usePersistOAuthClient.ts b/apps/web/lib/hooks/settings/platform/oauth-clients/usePersistOAuthClient.ts index d22f64b8f1..caf29cd434 100644 --- a/apps/web/lib/hooks/settings/platform/oauth-clients/usePersistOAuthClient.ts +++ b/apps/web/lib/hooks/settings/platform/oauth-clients/usePersistOAuthClient.ts @@ -5,9 +5,9 @@ import type { ApiResponse, CreateOAuthClientInput, DeleteOAuthClientInput, + PlatformOAuthClientDto, SubscribeTeamInput, } from "@calcom/platform-types"; -import type { OAuthClient } from "@calcom/prisma/client"; interface IPersistOAuthClient { onSuccess?: () => void; @@ -96,7 +96,7 @@ export const useDeleteOAuthClient = ( }, } ) => { - const mutation = useMutation, unknown, DeleteOAuthClientInput>({ + const mutation = useMutation, unknown, DeleteOAuthClientInput>({ mutationFn: (data) => { const { id } = data; return fetch(`/api/v2/oauth-clients/${id}`, { diff --git a/apps/web/modules/settings/platform/oauth-clients/[clientId]/edit/edit-view.tsx b/apps/web/modules/settings/platform/oauth-clients/[clientId]/edit/edit-view.tsx index 9ba0282f28..d88f7faadd 100644 --- a/apps/web/modules/settings/platform/oauth-clients/[clientId]/edit/edit-view.tsx +++ b/apps/web/modules/settings/platform/oauth-clients/[clientId]/edit/edit-view.tsx @@ -17,19 +17,6 @@ import { useGetUserAttributes } from "@components/settings/platform/hooks/useGet import type { FormValues } from "@components/settings/platform/oauth-clients/oauth-client-form"; import { OAuthClientForm as EditOAuthClientForm } from "@components/settings/platform/oauth-clients/oauth-client-form"; -import { - hasAppsReadPermission, - hasAppsWritePermission, - hasBookingReadPermission, - hasBookingWritePermission, - hasEventTypeReadPermission, - hasEventTypeWritePermission, - hasProfileReadPermission, - hasProfileWritePermission, - hasScheduleReadPermission, - hasScheduleWritePermission, -} from "../../../../../../../../packages/platform/utils/permissions"; - export default function EditOAuthClient() { const { t } = useLocale(); const router = useRouter(); @@ -102,16 +89,16 @@ export default function EditOAuthClient() { bookingRedirectUri: data?.bookingRedirectUri ?? "", bookingCancelRedirectUri: data?.bookingCancelRedirectUri ?? "", bookingRescheduleRedirectUri: data?.bookingRescheduleRedirectUri ?? "", - appsRead: hasAppsReadPermission(data?.permissions), - appsWrite: hasAppsWritePermission(data?.permissions), - bookingRead: hasBookingReadPermission(data?.permissions), - bookingWrite: hasBookingWritePermission(data?.permissions), - eventTypeRead: hasEventTypeReadPermission(data?.permissions), - eventTypeWrite: hasEventTypeWritePermission(data?.permissions), - profileRead: hasProfileReadPermission(data?.permissions), - profileWrite: hasProfileWritePermission(data?.permissions), - scheduleRead: hasScheduleReadPermission(data?.permissions), - scheduleWrite: hasScheduleWritePermission(data?.permissions), + appsRead: data?.permissions.includes("APPS_READ"), + appsWrite: data?.permissions.includes("APPS_WRITE"), + bookingRead: data?.permissions.includes("BOOKING_READ"), + bookingWrite: data?.permissions.includes("BOOKING_WRITE"), + eventTypeRead: data?.permissions.includes("EVENT_TYPE_READ"), + eventTypeWrite: data?.permissions.includes("EVENT_TYPE_WRITE"), + profileRead: data?.permissions.includes("PROFILE_READ"), + profileWrite: data?.permissions.includes("PROFILE_WRITE"), + scheduleRead: data?.permissions.includes("SCHEDULE_READ"), + scheduleWrite: data?.permissions.includes("SCHEDULE_WRITE"), }} onSubmit={onSubmit} isPending={isUpdating} diff --git a/apps/web/modules/settings/platform/oauth-clients/create-new-view.tsx b/apps/web/modules/settings/platform/oauth-clients/create-new-view.tsx index 40865a2bad..c08abade80 100644 --- a/apps/web/modules/settings/platform/oauth-clients/create-new-view.tsx +++ b/apps/web/modules/settings/platform/oauth-clients/create-new-view.tsx @@ -6,6 +6,7 @@ import Shell from "@calcom/features/shell/Shell"; import { ErrorCode } from "@calcom/lib/errorCodes"; import { useCompatSearchParams } from "@calcom/lib/hooks/useCompatSearchParams"; import { useLocale } from "@calcom/lib/hooks/useLocale"; +import type { PERMISSION_MAP } from "@calcom/platform-constants"; import { PERMISSIONS_GROUPED_MAP } from "@calcom/platform-constants/permissions"; import { showToast } from "@calcom/ui"; @@ -35,22 +36,20 @@ export default function CreateOAuthClient() { }); const onSubmit = (data: FormValues) => { - let userPermissions = 0; + const userPermissions: Array = []; const userRedirectUris = data.redirectUris.map((uri) => uri.uri).filter((uri) => !!uri); Object.keys(PERMISSIONS_GROUPED_MAP).forEach((key) => { const entity = key as keyof typeof PERMISSIONS_GROUPED_MAP; const entityKey = PERMISSIONS_GROUPED_MAP[entity].key; - const read = PERMISSIONS_GROUPED_MAP[entity].read; - const write = PERMISSIONS_GROUPED_MAP[entity].write; - if (data[`${entityKey}Read`]) userPermissions |= read; - if (data[`${entityKey}Write`]) userPermissions |= write; + + if (data[`${entityKey}Read`]) userPermissions.push(`${entity}_READ`); + if (data[`${entityKey}Write`]) userPermissions.push(`${entity}_WRITE`); }); save({ name: data.name, permissions: userPermissions, - // logo: data.logo, redirectUris: userRedirectUris, bookingRedirectUri: data.bookingRedirectUri, bookingCancelRedirectUri: data.bookingCancelRedirectUri, diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index a7ce9b5bf8..e5b1905581 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -732,7 +732,7 @@ }, "/v2/organizations/{orgId}/attributes/{attributeId}/options": { "post": { - "operationId": "OrganizationsOptionsAttributesController_createOrganizationAttributeOption", + "operationId": "OrganizationsAttributesOptionsController_createOrganizationAttributeOption", "summary": "Create an attribute option", "parameters": [ { @@ -777,7 +777,7 @@ "tags": ["Orgs / Attributes / Options"] }, "get": { - "operationId": "OrganizationsOptionsAttributesController_getOrganizationAttributeOptions", + "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptions", "summary": "Get all attribute options", "parameters": [ { @@ -814,7 +814,7 @@ }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/{optionId}": { "delete": { - "operationId": "OrganizationsOptionsAttributesController_deleteOrganizationAttributeOption", + "operationId": "OrganizationsAttributesOptionsController_deleteOrganizationAttributeOption", "summary": "Delete an attribute option", "parameters": [ { @@ -857,7 +857,7 @@ "tags": ["Orgs / Attributes / Options"] }, "patch": { - "operationId": "OrganizationsOptionsAttributesController_updateOrganizationAttributeOption", + "operationId": "OrganizationsAttributesOptionsController_updateOrganizationAttributeOption", "summary": "Update an attribute option", "parameters": [ { @@ -912,7 +912,7 @@ }, "/v2/organizations/{orgId}/attributes/options/{userId}": { "post": { - "operationId": "OrganizationsOptionsAttributesController_assignOrganizationAttributeOptionToUser", + "operationId": "OrganizationsAttributesOptionsController_assignOrganizationAttributeOptionToUser", "summary": "Assign an attribute to a user", "parameters": [ { @@ -957,7 +957,7 @@ "tags": ["Orgs / Attributes / Options"] }, "get": { - "operationId": "OrganizationsOptionsAttributesController_getOrganizationAttributeOptionsForUser", + "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptionsForUser", "summary": "Get all attribute options for a user", "parameters": [ { @@ -994,7 +994,7 @@ }, "/v2/organizations/{orgId}/attributes/options/{userId}/{attributeOptionId}": { "delete": { - "operationId": "OrganizationsOptionsAttributesController_unassignOrganizationAttributeOptionFromUser", + "operationId": "OrganizationsAttributesOptionsController_unassignOrganizationAttributeOptionFromUser", "summary": "Unassign an attribute from a user", "parameters": [ { @@ -1545,6 +1545,173 @@ "tags": ["Orgs / Memberships"] } }, + "/v2/organizations/{orgId}/organizations": { + "post": { + "operationId": "OrganizationsOrganizationsController_createOrganization", + "summary": "Create an organization within an organization", + "parameters": [ + { + "name": "orgId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOrganizationInput" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateManagedOrganizationOutput" + } + } + } + } + }, + "tags": ["Orgs / Orgs"] + }, + "get": { + "operationId": "OrganizationsOrganizationsController_getOrganizations", + "summary": "Get all organizations within an organization", + "parameters": [ + { + "name": "orgId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationsOutput" + } + } + } + } + }, + "tags": ["Orgs / Orgs"] + } + }, + "/v2/organizations/{orgId}/organizations/{managedOrganizationId}": { + "get": { + "operationId": "OrganizationsOrganizationsController_getOrganization", + "summary": "Get an organization within an organization", + "parameters": [ + { + "name": "managedOrganizationId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationOutput" + } + } + } + } + }, + "tags": ["Orgs / Orgs"] + }, + "patch": { + "operationId": "OrganizationsOrganizationsController_updateOrganization", + "summary": "Update an organization within an organization", + "parameters": [ + { + "name": "orgId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + }, + { + "name": "managedOrganizationId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOrganizationInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationOutput" + } + } + } + } + }, + "tags": ["Orgs / Orgs"] + }, + "delete": { + "operationId": "OrganizationsOrganizationsController_deleteOrganization", + "summary": "Delete an organization within an organization", + "parameters": [ + { + "name": "managedOrganizationId", + "required": true, + "in": "path", + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedOrganizationOutput" + } + } + } + } + }, + "tags": ["Orgs / Orgs"] + } + }, "/v2/organizations/{orgId}/schedules": { "get": { "operationId": "OrganizationsSchedulesController_getOrganizationSchedules", @@ -2422,13 +2589,13 @@ "tags": ["Orgs / Teams / Memberships"] } }, - "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routing}-formId/responses": { + "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses": { "get": { "operationId": "OrganizationsTeamsRoutingFormsResponsesController_getRoutingFormResponses", "summary": "Get routing form responses", "parameters": [ { - "name": "routing-formId", + "name": "routingFormId", "required": true, "in": "path", "schema": { @@ -3070,6 +3237,47 @@ "tags": ["Orgs / Webhooks"] } }, + "/v2/api-keys/refresh": { + "post": { + "operationId": "ApiKeysController_refresh", + "summary": "Refresh API Key", + "description": "Generate a new API key and delete the current one. Provide API key to refresh as a Bearer token in the Authorization header (e.g. \"Authorization: Bearer \").", + "parameters": [ + { + "name": "Authorization", + "in": "header", + "description": "Bearer ", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshApiKeyInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshApiKeyOutput" + } + } + } + } + }, + "tags": ["Api Keys"] + } + }, "/v2/bookings": { "post": { "operationId": "BookingsController_2024_08_13_createBooking", @@ -4788,6 +4996,192 @@ "tags": ["Me"] } }, + "/v2/oauth-clients": { + "post": { + "operationId": "OAuthClientsController_createOAuthClient", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOAuthClientInput" + } + } + } + }, + "responses": { + "201": { + "description": "Create an OAuth client", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateOAuthClientResponseDto" + } + } + } + } + }, + "tags": ["OAuth Clients"] + }, + "get": { + "operationId": "OAuthClientsController_getOAuthClients", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientsResponseDto" + } + } + } + } + }, + "tags": ["OAuth Clients"] + } + }, + "/v2/oauth-clients/{clientId}": { + "get": { + "operationId": "OAuthClientsController_getOAuthClientById", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientResponseDto" + } + } + } + } + }, + "tags": ["OAuth Clients"] + }, + "patch": { + "operationId": "OAuthClientsController_updateOAuthClient", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateOAuthClientInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientResponseDto" + } + } + } + } + }, + "tags": ["OAuth Clients"] + }, + "delete": { + "operationId": "OAuthClientsController_deleteOAuthClient", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOAuthClientResponseDto" + } + } + } + } + }, + "tags": ["OAuth Clients"] + } + }, + "/v2/oauth-clients/{clientId}/managed-users": { + "get": { + "operationId": "OAuthClientsController_getOAuthClientManagedUsersById", + "summary": "", + "description": "⚠️ First, this endpoint requires `Cookie: next-auth.session-token=eyJhbGciOiJ` header. Log into Cal web app using owner of organization that was created after visiting `/settings/organizations/new`, refresh swagger docs, and the cookie will be added to requests automatically to pass the NextAuthGuard.\nSecond, make sure that the logged in user has organizationId set to pass the OrganizationRolesGuard guard.", + "parameters": [ + { + "name": "clientId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "The number of items to return", + "example": 10, + "schema": { + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetManagedUsersOutput" + } + } + } + } + }, + "tags": ["OAuth Clients"] + } + }, "/v2/schedules": { "post": { "operationId": "SchedulesController_2024_06_11_createSchedule", @@ -6757,7 +7151,24 @@ } }, "permissions": { - "type": "number" + "type": "array", + "description": "Array of permission keys like [\"BOOKING_READ\", \"BOOKING_WRITE\"]. Use [\"*\"] to grant all permissions.", + "items": { + "type": "string", + "enum": [ + "EVENT_TYPE_READ", + "EVENT_TYPE_WRITE", + "BOOKING_READ", + "BOOKING_WRITE", + "SCHEDULE_READ", + "SCHEDULE_WRITE", + "APPS_READ", + "APPS_WRITE", + "PROFILE_READ", + "PROFILE_WRITE", + "*" + ] + } }, "bookingRedirectUri": { "type": "string" @@ -6826,12 +7237,27 @@ "example": "secretValue" }, "permissions": { - "type": "number", - "example": 3 + "type": "array", + "description": "Array of permission keys like [\"BOOKING_READ\", \"BOOKING_WRITE\"]", + "items": { + "type": "string", + "enum": [ + "EVENT_TYPE_READ", + "EVENT_TYPE_WRITE", + "BOOKING_READ", + "BOOKING_WRITE", + "SCHEDULE_READ", + "SCHEDULE_WRITE", + "APPS_READ", + "APPS_WRITE", + "PROFILE_READ", + "PROFILE_WRITE" + ] + }, + "example": ["BOOKING_READ", "BOOKING_WRITE"] }, "logo": { - "type": "string", - "nullable": true, + "type": "object", "example": "https://example.com/logo.png" }, "redirectUris": { @@ -6849,6 +7275,22 @@ "format": "date-time", "type": "string", "example": "2024-03-23T08:33:21.851Z" + }, + "bookingRedirectUri": { + "type": "string", + "example": "https://example.com/booking-redirect" + }, + "bookingCancelRedirectUri": { + "type": "string", + "example": "https://example.com/booking-cancel" + }, + "bookingRescheduleRedirectUri": { + "type": "string", + "example": "https://example.com/booking-reschedule" + }, + "areEmailsEnabled": { + "type": "boolean", + "example": false } }, "required": ["id", "name", "secret", "permissions", "redirectUris", "organizationId", "createdAt"] @@ -6923,6 +7365,46 @@ }, "required": ["refreshToken"] }, + "RefreshApiKeyInput": { + "type": "object", + "properties": { + "apiKeyDaysValid": { + "type": "number", + "minimum": 1, + "description": "For how many days is managed organization api key valid. Defaults to 30 days.", + "example": 60, + "default": 30 + }, + "apiKeyNeverExpires": { + "type": "boolean", + "description": "If true, organization api key never expires.", + "example": true + } + } + }, + "ApiKeyOutput": { + "type": "object", + "properties": { + "apiKey": { + "type": "string" + } + }, + "required": ["apiKey"] + }, + "RefreshApiKeyOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": ["success", "error"] + }, + "data": { + "$ref": "#/components/schemas/ApiKeyOutput" + } + }, + "required": ["status", "data"] + }, "InputAddressLocation_2024_06_14": { "type": "object", "properties": { @@ -12946,6 +13428,127 @@ }, "required": ["status", "data"] }, + "CreateOrganizationInput": { + "type": "object", + "properties": { + "apiKeyDaysValid": { + "type": "number", + "minimum": 1, + "description": "For how many days is managed organization api key valid. Defaults to 30 days.", + "example": 60, + "default": 30 + }, + "apiKeyNeverExpires": { + "type": "boolean", + "description": "If true, organization api key never expires.", + "example": true + }, + "name": { + "type": "string", + "minLength": 1, + "description": "Name of the organization", + "example": "CalTeam" + }, + "metadata": { + "type": "object" + } + }, + "required": ["name"] + }, + "ManagedOrganizationWithApiKeyOutput": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "metadata": { + "type": "object" + }, + "apiKey": { + "type": "string" + } + }, + "required": ["id", "name", "apiKey"] + }, + "CreateManagedOrganizationOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": ["success", "error"] + }, + "data": { + "$ref": "#/components/schemas/ManagedOrganizationWithApiKeyOutput" + } + }, + "required": ["status", "data"] + }, + "ManagedOrganizationOutput": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "metadata": { + "type": "object" + } + }, + "required": ["id", "name"] + }, + "GetManagedOrganizationOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": ["success", "error"] + }, + "data": { + "$ref": "#/components/schemas/ManagedOrganizationOutput" + } + }, + "required": ["status", "data"] + }, + "GetManagedOrganizationsOutput": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "success", + "enum": ["success", "error"] + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ManagedOrganizationOutput" + } + } + }, + "required": ["status", "data"] + }, + "UpdateOrganizationInput": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Name of the organization", + "example": "CalTeam" + }, + "metadata": { + "type": "string" + } + } + }, "RoutingFormResponseOutput": { "type": "object", "properties": { diff --git a/packages/app-store/intercom/api/initialize.ts b/packages/app-store/intercom/api/initialize.ts index 600a4095ec..525e6fada1 100644 --- a/packages/app-store/intercom/api/initialize.ts +++ b/packages/app-store/intercom/api/initialize.ts @@ -1,5 +1,7 @@ import type { NextApiRequest, NextApiResponse } from "next"; + import { WEBAPP_URL } from "@calcom/lib/constants"; + import type { NewCanvas } from "../lib"; export default async function handler(req: NextApiRequest, res: NextApiResponse) { diff --git a/packages/platform/libraries/index.ts b/packages/platform/libraries/index.ts index 2439a78343..febacb1669 100644 --- a/packages/platform/libraries/index.ts +++ b/packages/platform/libraries/index.ts @@ -239,3 +239,5 @@ export { getBookingFieldsWithSystemFields }; export { getRoutedUrl }; export { getTeamMemberEmailForResponseOrContactUsingUrlQuery }; + +export { createHandler as createApiKeyHandler } from "@calcom/trpc/server/routers/viewer/apiKeys/create.handler"; diff --git a/packages/platform/types/index.ts b/packages/platform/types/index.ts index aa7b0290eb..de15a562f5 100644 --- a/packages/platform/types/index.ts +++ b/packages/platform/types/index.ts @@ -11,3 +11,4 @@ export * from "./organizations"; export * from "./teams"; export * from "./embed"; export * from "./routing-forms"; +export * from "./me"; diff --git a/packages/platform/types/me.ts b/packages/platform/types/me.ts new file mode 100644 index 0000000000..e500ed0aab --- /dev/null +++ b/packages/platform/types/me.ts @@ -0,0 +1,15 @@ +import { z } from "zod"; + +export const userSchemaResponse = z.object({ + id: z.number().int(), + email: z.string(), + timeFormat: z.number().int().default(12), + defaultScheduleId: z.number().int().nullable(), + weekStart: z.string(), + timeZone: z.string().default("Europe/London"), + username: z.string(), + organizationId: z.number().nullable(), + organization: z.object({ isPlatform: z.boolean(), id: z.number() }).optional(), +}); + +export type UserResponse = z.infer; diff --git a/packages/platform/types/oauth-clients.ts b/packages/platform/types/oauth-clients.ts deleted file mode 100644 index 98efa17b0b..0000000000 --- a/packages/platform/types/oauth-clients.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; -import { IsArray, IsNumber, IsOptional, IsBoolean, IsString } from "class-validator"; -import { z } from "zod"; - -export class CreateOAuthClientInput { - @IsOptional() - @IsString() - @ApiPropertyOptional() - logo?: string; - - @IsString() - @ApiProperty() - name!: string; - - @IsArray() - @IsString({ each: true }) - @ApiProperty({ type: [String] }) - redirectUris!: string[]; - - @IsNumber() - @ApiProperty() - permissions!: number; - - @IsOptional() - @IsString() - @ApiPropertyOptional() - bookingRedirectUri?: string; - - @IsOptional() - @IsString() - @ApiPropertyOptional() - bookingCancelRedirectUri?: string; - - @IsOptional() - @IsString() - @ApiPropertyOptional() - bookingRescheduleRedirectUri?: string; - - @IsOptional() - @IsBoolean() - @ApiPropertyOptional() - areEmailsEnabled?: boolean; -} - -export class DeleteOAuthClientInput { - @IsString() - @ApiProperty() - id!: string; -} - -export const userSchemaResponse = z.object({ - id: z.number().int(), - email: z.string(), - timeFormat: z.number().int().default(12), - defaultScheduleId: z.number().int().nullable(), - weekStart: z.string(), - timeZone: z.string().default("Europe/London"), - username: z.string(), - organizationId: z.number().nullable(), - organization: z.object({ isPlatform: z.boolean(), id: z.number() }).optional(), -}); - -export type UserResponse = z.infer; diff --git a/packages/platform/types/oauth-clients/index.ts b/packages/platform/types/oauth-clients/index.ts new file mode 100644 index 0000000000..775f90ba48 --- /dev/null +++ b/packages/platform/types/oauth-clients/index.ts @@ -0,0 +1,2 @@ +export * from "./inputs"; +export * from "./outputs"; diff --git a/packages/platform/types/oauth-clients/inputs/create-oauth-client.input.ts b/packages/platform/types/oauth-clients/inputs/create-oauth-client.input.ts new file mode 100644 index 0000000000..87819d9b4f --- /dev/null +++ b/packages/platform/types/oauth-clients/inputs/create-oauth-client.input.ts @@ -0,0 +1,50 @@ +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { IsArray, IsEnum, IsOptional, IsBoolean, IsString } from "class-validator"; + +import { PERMISSION_MAP } from "@calcom/platform-constants"; + +export class CreateOAuthClientInput { + @IsOptional() + @IsString() + @ApiPropertyOptional() + logo?: string; + + @IsString() + @ApiProperty() + name!: string; + + @IsArray() + @IsString({ each: true }) + @ApiProperty({ type: [String] }) + redirectUris!: string[]; + + @IsArray() + @IsEnum([...Object.keys(PERMISSION_MAP), "*"], { each: true }) + @ApiProperty({ + type: [String], + description: + 'Array of permission keys like ["BOOKING_READ", "BOOKING_WRITE"]. Use ["*"] to grant all permissions.', + enum: [...Object.keys(PERMISSION_MAP), "*"], + }) + permissions!: Array; + + @IsOptional() + @IsString() + @ApiPropertyOptional() + bookingRedirectUri?: string; + + @IsOptional() + @IsString() + @ApiPropertyOptional() + bookingCancelRedirectUri?: string; + + @IsOptional() + @IsString() + @ApiPropertyOptional() + bookingRescheduleRedirectUri?: string; + + @IsOptional() + @IsBoolean() + @ApiPropertyOptional() + areEmailsEnabled?: boolean; +} diff --git a/packages/platform/types/oauth-clients/inputs/delete-oauth-client.input.ts b/packages/platform/types/oauth-clients/inputs/delete-oauth-client.input.ts new file mode 100644 index 0000000000..9dffc1da60 --- /dev/null +++ b/packages/platform/types/oauth-clients/inputs/delete-oauth-client.input.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from "@nestjs/swagger"; +import { IsString } from "class-validator"; + +export class DeleteOAuthClientInput { + @IsString() + @ApiProperty() + id!: string; +} diff --git a/packages/platform/types/oauth-clients/inputs/index.ts b/packages/platform/types/oauth-clients/inputs/index.ts new file mode 100644 index 0000000000..dc25516dee --- /dev/null +++ b/packages/platform/types/oauth-clients/inputs/index.ts @@ -0,0 +1,3 @@ +export * from "./create-oauth-client.input"; +export * from "./delete-oauth-client.input"; +export * from "./update-oauth-client.input"; diff --git a/apps/api/v2/src/modules/oauth-clients/inputs/update-oauth-client.input.ts b/packages/platform/types/oauth-clients/inputs/update-oauth-client.input.ts similarity index 100% rename from apps/api/v2/src/modules/oauth-clients/inputs/update-oauth-client.input.ts rename to packages/platform/types/oauth-clients/inputs/update-oauth-client.input.ts diff --git a/packages/platform/types/oauth-clients/outputs/index.ts b/packages/platform/types/oauth-clients/outputs/index.ts new file mode 100644 index 0000000000..146ddc4e13 --- /dev/null +++ b/packages/platform/types/oauth-clients/outputs/index.ts @@ -0,0 +1 @@ +export * from "./oauth-client.output"; diff --git a/packages/platform/types/oauth-clients/outputs/oauth-client.output.ts b/packages/platform/types/oauth-clients/outputs/oauth-client.output.ts new file mode 100644 index 0000000000..070d513624 --- /dev/null +++ b/packages/platform/types/oauth-clients/outputs/oauth-client.output.ts @@ -0,0 +1,66 @@ +import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; +import { IsArray, IsEnum, IsString, IsNumber, IsOptional, IsDate, IsBoolean, IsUrl } from "class-validator"; + +import { PERMISSION_MAP } from "@calcom/platform-constants"; + +export class PlatformOAuthClientDto { + @ApiProperty({ example: "clsx38nbl0001vkhlwin9fmt0" }) + @IsString() + id!: string; + + @ApiProperty({ example: "MyClient" }) + @IsString() + name!: string; + + @ApiProperty({ example: "secretValue" }) + @IsString() + secret!: string; + + @ApiProperty({ example: ["BOOKING_READ", "BOOKING_WRITE"] }) + @IsArray() + @IsEnum(PERMISSION_MAP, { each: true }) + @ApiProperty({ + type: [String], + description: 'Array of permission keys like ["BOOKING_READ", "BOOKING_WRITE"]', + enum: Object.keys(PERMISSION_MAP), + }) + permissions!: Array; + + @ApiPropertyOptional({ example: "https://example.com/logo.png" }) + @IsOptional() + @IsString() + logo!: string | null; + + @ApiProperty({ example: ["https://example.com/callback"] }) + @IsArray() + @IsString({ each: true }) + redirectUris!: string[]; + + @ApiProperty({ example: 1 }) + @IsNumber() + organizationId!: number; + + @ApiProperty({ example: "2024-03-23T08:33:21.851Z", type: Date }) + @IsDate() + createdAt!: Date; + + @ApiPropertyOptional({ example: "https://example.com/booking-redirect" }) + @IsOptional() + @IsUrl() + bookingRedirectUri?: string; + + @ApiPropertyOptional({ example: "https://example.com/booking-cancel" }) + @IsOptional() + @IsUrl() + bookingCancelRedirectUri?: string; + + @ApiPropertyOptional({ example: "https://example.com/booking-reschedule" }) + @IsOptional() + @IsUrl() + bookingRescheduleRedirectUri?: string; + + @ApiPropertyOptional({ example: false }) + @IsOptional() + @IsBoolean() + areEmailsEnabled?: boolean; +} diff --git a/packages/prisma/migrations/20250213092458_allow_non_unique_platform_billing_customer_id/migration.sql b/packages/prisma/migrations/20250213092458_allow_non_unique_platform_billing_customer_id/migration.sql new file mode 100644 index 0000000000..d95753081a --- /dev/null +++ b/packages/prisma/migrations/20250213092458_allow_non_unique_platform_billing_customer_id/migration.sql @@ -0,0 +1,2 @@ +-- DropIndex +DROP INDEX "PlatformBilling_customerId_key"; diff --git a/packages/prisma/migrations/20250213092715_add_platform_billing_managed_organizations_fields/migration.sql b/packages/prisma/migrations/20250213092715_add_platform_billing_managed_organizations_fields/migration.sql new file mode 100644 index 0000000000..c3536daa85 --- /dev/null +++ b/packages/prisma/migrations/20250213092715_add_platform_billing_managed_organizations_fields/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "PlatformBilling" ADD COLUMN "managerBillingId" INTEGER; + +-- AddForeignKey +ALTER TABLE "PlatformBilling" ADD CONSTRAINT "PlatformBilling_managerBillingId_fkey" FOREIGN KEY ("managerBillingId") REFERENCES "PlatformBilling"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/packages/prisma/migrations/20250213093931_create_managed_organization_table/migration.sql b/packages/prisma/migrations/20250213093931_create_managed_organization_table/migration.sql new file mode 100644 index 0000000000..ab3b476160 --- /dev/null +++ b/packages/prisma/migrations/20250213093931_create_managed_organization_table/migration.sql @@ -0,0 +1,18 @@ +-- CreateTable +CREATE TABLE "ManagedOrganization" ( + "managedOrganizationId" INTEGER NOT NULL, + "managerOrganizationId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- CreateIndex +CREATE UNIQUE INDEX "ManagedOrganization_managedOrganizationId_key" ON "ManagedOrganization"("managedOrganizationId"); + +-- CreateIndex +CREATE INDEX "ManagedOrganization_managerOrganizationId_idx" ON "ManagedOrganization"("managerOrganizationId"); + +-- AddForeignKey +ALTER TABLE "ManagedOrganization" ADD CONSTRAINT "ManagedOrganization_managedOrganizationId_fkey" FOREIGN KEY ("managedOrganizationId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ManagedOrganization" ADD CONSTRAINT "ManagedOrganization_managerOrganizationId_fkey" FOREIGN KEY ("managerOrganizationId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/migrations/20250213144302_add_managed_organizations_unique_constraint/migration.sql b/packages/prisma/migrations/20250213144302_add_managed_organizations_unique_constraint/migration.sql new file mode 100644 index 0000000000..308754f6b7 --- /dev/null +++ b/packages/prisma/migrations/20250213144302_add_managed_organizations_unique_constraint/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[managerOrganizationId,managedOrganizationId]` on the table `ManagedOrganization` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "ManagedOrganization_managerOrganizationId_managedOrganizati_key" ON "ManagedOrganization"("managerOrganizationId", "managedOrganizationId"); diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index b7d6ab4652..7d0eb8ff17 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -488,6 +488,11 @@ model Team { includeManagedEventsInLimits Boolean @default(false) internalNotePresets InternalNotePreset[] + // note(Lauris): if a Team has parentId it is a team, if parentId is null it is an organization, but if parentId is null and managedOrganization is set, + // it means that it is an organization managed by another organization. + managedOrganization ManagedOrganization? @relation("ManagedOrganization") + managedOrganizations ManagedOrganization[] @relation("ManagerOrganization") + @@unique([slug, parentId]) @@index([parentId]) } @@ -1624,10 +1629,23 @@ enum SMSLockState { REVIEW_NEEDED } +model ManagedOrganization { + managedOrganizationId Int @unique + managedOrganization Team @relation("ManagedOrganization", fields: [managedOrganizationId], references: [id], onDelete: Cascade) + + managerOrganizationId Int + managerOrganization Team @relation("ManagerOrganization", fields: [managerOrganizationId], references: [id], onDelete: Cascade) + + createdAt DateTime @default(now()) + + @@unique([managerOrganizationId, managedOrganizationId]) + @@index([managerOrganizationId]) +} + model PlatformBilling { id Int @id @unique // team id - customerId String @unique + customerId String subscriptionId String? plan String @default("none") @@ -1635,6 +1653,12 @@ model PlatformBilling { billingCycleEnd Int? overdue Boolean? @default(false) + // note(Lauris): in case of a platform managed organization's billing record this field points to the manager organization's billing record. + managerBillingId Int? + managerBilling PlatformBilling? @relation("PlatformManagedBilling", fields: [managerBillingId], references: [id]) + // note(Lauris): in case of a manager organization's billing record this field points to billing records of its platform managed organizations. + managedBillings PlatformBilling[] @relation("PlatformManagedBilling") + team Team @relation(fields: [id], references: [id], onDelete: Cascade) } diff --git a/yarn.lock b/yarn.lock index 2b62eec04b..17bf4435bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,46 @@ __metadata: version: 6 cacheKey: 8 +"@0no-co/graphql.web@npm:^1.0.1": + version: 1.1.1 + resolution: "@0no-co/graphql.web@npm:1.1.1" + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + checksum: 42af588a80ce4526c09b664b614ce61a5a5f45f56a2fa177ba851d028bb95676bcfc8a3ad04dfeaaeda801de6af414b049a8a1e31c2dc809dca1db4ccf7cce90 + languageName: node + linkType: hard + +"@47ng/cloak@npm:^1.2.0": + version: 1.2.0 + resolution: "@47ng/cloak@npm:1.2.0" + dependencies: + "@47ng/codec": ^1.0.1 + "@stablelib/base64": ^1.0.1 + "@stablelib/hex": ^1.0.1 + "@stablelib/utf8": ^1.0.1 + chalk: ^4.1.2 + commander: ^8.3.0 + dotenv: ^10.0.0 + s-ago: ^2.2.0 + bin: + cloak: dist/cli.js + checksum: bb023a28a4c8ecd112ec19679cfa23cfbc279bb995180187cb1dedee39468810590c6dc5f57f786e4137b884d1f407a85fb93194c82f75109515d7cbd73ee341 + languageName: node + linkType: hard + +"@47ng/codec@npm:^1.0.1": + version: 1.1.0 + resolution: "@47ng/codec@npm:1.1.0" + dependencies: + "@stablelib/base64": ^1.0.1 + "@stablelib/hex": ^1.0.1 + checksum: 4f780c4413fe78bbedbaff4135340c0e5f5a30df88f5cffbec51349eb0a1c909728e6c2bbda52506ff8c12653bf39b78c67b78bbe9501b0b9741da0cdaeec6ff + languageName: node + linkType: hard + "@adobe/css-tools@npm:^4.0.1": version: 4.2.0 resolution: "@adobe/css-tools@npm:4.2.0" @@ -12,6 +52,17 @@ __metadata: languageName: node linkType: hard +"@algora/sdk@npm:^0.1.2": + version: 0.1.3 + resolution: "@algora/sdk@npm:0.1.3" + dependencies: + "@trpc/client": ^10.0.0 + "@trpc/server": ^10.0.0 + superjson: ^1.9.1 + checksum: 1b99e0f155181beefe12b625969166f4ecfa42d334706224d0a9a4e9ad72e2cda7335712c47290df7aeeeb003a9773ff5babce7cbee8fb8d1c5ded4ad81c80c1 + languageName: node + linkType: hard + "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -141,6 +192,28 @@ __metadata: languageName: node linkType: hard +"@ardatan/relay-compiler@npm:^12.0.1": + version: 12.0.2 + resolution: "@ardatan/relay-compiler@npm:12.0.2" + dependencies: + "@babel/generator": ^7.14.0 + "@babel/parser": ^7.14.0 + "@babel/runtime": ^7.0.0 + chalk: ^4.0.0 + fb-watchman: ^2.0.0 + immutable: ~3.7.6 + invariant: ^2.2.4 + nullthrows: ^1.1.1 + relay-runtime: 12.0.0 + signedsource: ^1.0.0 + peerDependencies: + graphql: "*" + bin: + relay-compiler: bin/relay-compiler + checksum: 30e3759cd725221daf0d10ad2bce5e5ee8e45374281ab17e7ed973d55e0a8f344dbbfc1ce984ffaa66bf37301ad0e13c0eab3f16cb84e3a605f9e025dd4443b3 + languageName: node + linkType: hard + "@aw-web-design/x-default-browser@npm:1.4.126": version: 1.4.126 resolution: "@aw-web-design/x-default-browser@npm:1.4.126" @@ -1075,6 +1148,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": ^7.25.9 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: db13f5c42d54b76c1480916485e6900748bbcb0014a8aca87f50a091f70ff4e0d0a6db63cade75eb41fcc3d2b6ba0a7f89e343def4f96f00269b41b8ab8dd7b8 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9": version: 7.22.9 resolution: "@babel/compat-data@npm:7.22.9" @@ -1096,6 +1180,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.26.5": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 1bb04c6860c8c9555b933cb9c3caf5ef1dac331a37a351efb67956fc679f695d487aea76e792dd43823702c1300f7906f2a298e50b4a8d7ec199ada9c340c365 + languageName: node + linkType: hard + "@babel/core@npm:^7.11.6, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2": version: 7.23.5 resolution: "@babel/core@npm:7.23.5" @@ -1165,6 +1256,30 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.22.9": + version: 7.26.8 + resolution: "@babel/core@npm:7.26.8" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.26.2 + "@babel/generator": ^7.26.8 + "@babel/helper-compilation-targets": ^7.26.5 + "@babel/helper-module-transforms": ^7.26.0 + "@babel/helpers": ^7.26.7 + "@babel/parser": ^7.26.8 + "@babel/template": ^7.26.8 + "@babel/traverse": ^7.26.8 + "@babel/types": ^7.26.8 + "@types/gensync": ^1.0.0 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 9d83fb7ad33467fc5ed841d24158d01b7c486ad399d7988232ab9edc6d9f92cd4d60b598ca717aeeb136feb48f7e289c247663c6a28e85dee92a39b2e97cc2e1 + languageName: node + linkType: hard + "@babel/core@npm:^7.23.5, @babel/core@npm:^7.23.9": version: 7.24.0 resolution: "@babel/core@npm:7.24.0" @@ -1199,6 +1314,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/generator@npm:7.26.8" + dependencies: + "@babel/parser": ^7.26.8 + "@babel/types": ^7.26.8 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^3.0.2 + checksum: 15ef65699a556f1c75edba52109e65a597a3e16da2faf117d617e67b667983d5e3cd11399a1d6ff9ff1b0029f8e7c9513975884704b6c2d13bba3d780456823d + languageName: node + linkType: hard + "@babel/generator@npm:^7.17.3, @babel/generator@npm:^7.22.10": version: 7.22.10 resolution: "@babel/generator@npm:7.22.10" @@ -1259,6 +1387,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" + dependencies: + "@babel/types": ^7.25.9 + checksum: 41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -1329,6 +1466,36 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" + dependencies: + "@babel/compat-data": ^7.26.5 + "@babel/helper-validator-option": ^7.25.9 + browserslist: ^4.24.0 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: 6bc0107613bf1d4d21913606e8e517194e5099a24db2a8374568e56ef4626e8140f9b8f8a4aabc35479f5904459a0aead2a91ee0dc63aae110ccbc2bc4b4fda1 + languageName: node + linkType: hard + +"@babel/helper-create-class-features-plugin@npm:^7.21.0": + version: 7.25.9 + resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9" + dependencies: + "@babel/helper-annotate-as-pure": ^7.25.9 + "@babel/helper-member-expression-to-functions": ^7.25.9 + "@babel/helper-optimise-call-expression": ^7.25.9 + "@babel/helper-replace-supers": ^7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 + "@babel/traverse": ^7.25.9 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 91dd5f203ed04568c70b052e2f26dfaac7c146447196c00b8ecbb6d3d2f3b517abadb985d3321a19d143adaed6fe17f7f79f8f50e0c20e9d8ad83e1027b42424 + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-create-class-features-plugin@npm:7.23.5" @@ -1497,6 +1664,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" + dependencies: + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 8e2f1979b6d596ac2a8cbf17f2cf709180fefc274ac3331408b48203fe19134ed87800774ef18838d0275c3965130bae22980d90caed756b7493631d4b2cf961 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-module-imports@npm:7.22.5" @@ -1525,6 +1702,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: 1b411ce4ca825422ef7065dffae7d8acef52023e51ad096351e3e2c05837e9bf9fca2af9ca7f28dc26d596a588863d0fedd40711a88e350b736c619a80e704e6 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.22.9": version: 7.22.9 resolution: "@babel/helper-module-transforms@npm:7.22.9" @@ -1570,6 +1757,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + "@babel/traverse": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 942eee3adf2b387443c247a2c190c17c4fd45ba92a23087abab4c804f40541790d51ad5277e4b5b1ed8d5ba5b62de73857446b7742f835c18ebd350384e63917 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" @@ -1579,6 +1779,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" + dependencies: + "@babel/types": ^7.25.9 + checksum: f09d0ad60c0715b9a60c31841b3246b47d67650c512ce85bbe24a3124f1a4d66377df793af393273bc6e1015b0a9c799626c48e53747581c1582b99167cc65dc + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.22.5 resolution: "@babel/helper-plugin-utils@npm:7.22.5" @@ -1586,6 +1795,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.25.9": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 4771fbb1711c624c62d12deabc2ed7435a6e6994b6ce09d5ede1bc1bf19be59c3775461a1e693bdd596af865685e87bb2abc778f62ceadc1b2095a8e2aa74180 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" @@ -1625,6 +1841,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.25.9": + version: 7.26.5 + resolution: "@babel/helper-replace-supers@npm:7.26.5" + dependencies: + "@babel/helper-member-expression-to-functions": ^7.25.9 + "@babel/helper-optimise-call-expression": ^7.25.9 + "@babel/traverse": ^7.26.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: c5ab31b29c7cc09e30278f8860ecdb873ce6c84b5c08bc5239c369c7c4fe9f0a63cda61b55b7bbd20edb4e5dc32e73087cc3c57d85264834bd191551d1499185 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-simple-access@npm:7.22.5" @@ -1653,6 +1882,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" + dependencies: + "@babel/traverse": ^7.25.9 + "@babel/types": ^7.25.9 + checksum: fdbb5248932198bc26daa6abf0d2ac42cab9c2dbb75b7e9f40d425c8f28f09620b886d40e7f9e4e08ffc7aaa2cefe6fc2c44be7c20e81f7526634702fb615bdc + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.16.7, @babel/helper-split-export-declaration@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-split-export-declaration@npm:7.22.6" @@ -1692,6 +1931,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 6435ee0849e101681c1849868278b5aee82686ba2c1e27280e5e8aca6233af6810d39f8e4e693d2f2a44a3728a6ccfd66f72d71826a94105b86b731697cdfa99 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-validator-identifier@npm:7.22.5" @@ -1713,6 +1959,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-validator-option@npm:7.22.15" @@ -1741,6 +1994,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-wrap-function@npm:7.22.20" @@ -1795,6 +2055,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.26.7": + version: 7.26.7 + resolution: "@babel/helpers@npm:7.26.7" + dependencies: + "@babel/template": ^7.25.9 + "@babel/types": ^7.26.7 + checksum: 1c93604c7fd6dbd7aa6f3eb2f9fa56369f9ad02bac8b3afb902de6cd4264beb443cc8589bede3790ca28d7477d4c07801fe6f4943f9833ac5956b72708bbd7ac + languageName: node + linkType: hard + "@babel/highlight@npm:^7.22.13": version: 7.22.13 resolution: "@babel/highlight@npm:7.22.13" @@ -1838,6 +2108,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.14.0, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/parser@npm:7.26.8" + dependencies: + "@babel/types": ^7.26.8 + bin: + parser: ./bin/babel-parser.js + checksum: 2ede62d2451eaf37f524f2048ca41994466c81bda1f5acec36fbd8931fe77bf365e2b2060972735165e40aec305e04af76dd4d8fa895bc08a250215b32356577 + languageName: node + linkType: hard + "@babel/parser@npm:^7.14.7, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.22.11, @babel/parser@npm:^7.22.5": version: 7.22.14 resolution: "@babel/parser@npm:7.22.14" @@ -1919,6 +2200,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-proposal-private-property-in-object@npm:^7.21.11": + version: 7.21.11 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.11" + dependencies: + "@babel/helper-annotate-as-pure": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.21.0 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1b880543bc5f525b360b53d97dd30807302bb82615cd42bf931968f59003cac75629563d6b104868db50abd22235b3271fdf679fea5db59a267181a99cc0c265 + languageName: node + linkType: hard + "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -1996,6 +2291,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.20.0": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": ^7.25.9 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b58f2306df4a690ca90b763d832ec05202c50af787158ff8b50cdf3354359710bce2e1eb2b5135fcabf284756ac8eadf09ca74764aa7e76d12a5cac5f6b21e67 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-assertions@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-syntax-import-assertions@npm:7.22.5" @@ -3162,6 +3468,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.21.0": + version: 7.26.7 + resolution: "@babel/runtime@npm:7.26.7" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: a1664a08f3f4854b895b540cca2f5f5c6c1993b5fb788c9615d70fc201e16bb254df8e0550c83eaf2749a14d87775e11a7c9ded6161203e9da7a4a323d546925 + languageName: node + linkType: hard + "@babel/runtime@npm:^7.23.2": version: 7.23.5 resolution: "@babel/runtime@npm:7.23.5" @@ -3171,6 +3486,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.25.9, @babel/template@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/template@npm:7.26.8" + dependencies: + "@babel/code-frame": ^7.26.2 + "@babel/parser": ^7.26.8 + "@babel/types": ^7.26.8 + checksum: dfa79b33d49b89b2466a660bf299a545dd5fd6680fbf9828d2deca9bd826eb861041a9f5a25a4a0dddf6e4905e6fafac18a6885bf2aeecac6f39407a221e630f + languageName: node + linkType: hard + "@babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -3233,6 +3559,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/traverse@npm:7.26.8" + dependencies: + "@babel/code-frame": ^7.26.2 + "@babel/generator": ^7.26.8 + "@babel/parser": ^7.26.8 + "@babel/template": ^7.26.8 + "@babel/types": ^7.26.8 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: f8b2f4d9945932ac6b0a359c322628327514a3e1d356555923dc143f3376d3e01f8f7a56cccb717223fa7420426e077809701175b717d946c622d826a6df7c60 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.5": version: 7.23.5 resolution: "@babel/traverse@npm:7.23.5" @@ -3326,6 +3667,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.7, @babel/types@npm:^7.26.8": + version: 7.26.8 + resolution: "@babel/types@npm:7.26.8" + dependencies: + "@babel/helper-string-parser": ^7.25.9 + "@babel/helper-validator-identifier": ^7.25.9 + checksum: 8f0f3bac37cc93d4658df460dc24156c6f1466abca63ef111c9f03128df6c247c672ed89e779ababb41250627c78d8bfcfba616eecb01b6e4ddcfd8ded718996 + languageName: node + linkType: hard + "@babel/types@npm:^7.17.0, @babel/types@npm:^7.22.10, @babel/types@npm:^7.22.11, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.22.11 resolution: "@babel/types@npm:7.22.11" @@ -3526,7 +3877,7 @@ __metadata: "@axiomhq/winston": ^1.2.0 "@calcom/platform-constants": "*" "@calcom/platform-enums": "*" - "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.99" + "@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.110" "@calcom/platform-libraries-0.0.2": "npm:@calcom/platform-libraries@0.0.2" "@calcom/platform-types": "*" "@calcom/platform-utils": "*" @@ -3574,6 +3925,7 @@ __metadata: luxon: ^3.4.4 nest-winston: ^1.9.4 next-auth: ^4.22.1 + node-mocks-http: ^1.16.2 passport: ^0.7.0 passport-jwt: ^4.0.1 prettier: ^2.8.6 @@ -3887,6 +4239,43 @@ __metadata: languageName: unknown linkType: soft +"@calcom/console@workspace:apps/console": + version: 0.0.0-use.local + resolution: "@calcom/console@workspace:apps/console" + dependencies: + "@calcom/dayjs": "*" + "@calcom/features": "*" + "@calcom/lib": "*" + "@calcom/tsconfig": "*" + "@calcom/ui": "*" + "@headlessui/react": ^1.5.0 + "@heroicons/react": ^1.0.6 + "@prisma/client": ^5.4.2 + "@tailwindcss/forms": ^0.5.2 + "@types/node": 16.9.1 + "@types/react": 18.0.26 + autoprefixer: ^10.4.12 + chart.js: ^3.7.1 + client-only: ^0.0.1 + eslint: ^8.34.0 + next: ^13.5.4 + next-auth: ^4.22.1 + next-i18next: ^13.2.2 + postcss: ^8.4.18 + prisma: ^5.4.2 + prisma-field-encryption: ^1.4.0 + react: ^18.2.0 + react-chartjs-2: ^4.0.1 + react-dom: ^18.2.0 + react-hook-form: ^7.43.3 + react-live-chat-loader: ^2.8.1 + swr: ^1.2.2 + tailwindcss: ^3.3.3 + typescript: ^4.9.4 + zod: ^3.22.4 + languageName: unknown + linkType: soft + "@calcom/core@*, @calcom/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@calcom/core@workspace:packages/core" @@ -4037,7 +4426,7 @@ __metadata: languageName: unknown linkType: soft -"@calcom/embed-react@workspace:*, @calcom/embed-react@workspace:packages/embeds/embed-react": +"@calcom/embed-react@workspace:*, @calcom/embed-react@workspace:^, @calcom/embed-react@workspace:packages/embeds/embed-react": version: 0.0.0-use.local resolution: "@calcom/embed-react@workspace:packages/embeds/embed-react" dependencies: @@ -4582,14 +4971,14 @@ __metadata: languageName: node linkType: hard -"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.99": - version: 0.0.99 - resolution: "@calcom/platform-libraries@npm:0.0.99" +"@calcom/platform-libraries@npm:@calcom/platform-libraries@0.0.110": + version: 0.0.110 + resolution: "@calcom/platform-libraries@npm:0.0.110" dependencies: "@calcom/core": "*" "@calcom/features": "*" "@calcom/lib": "*" - checksum: 7c3e2c9ff7cfacb3049df8fc05b592fe347c2445f75b0546e782bbde05505876bdaa50600d94f7215ab9924ac577106908c82a4c37654ed32a3aa71c859494d9 + checksum: 35ec690ae6c426a88b056ae32b51fd83e624189904bc722743a3b19ced3936f7052bcaa688a6bb37982986687307bdb794a7df8181c9ba994425ffd8c3837607 languageName: node linkType: hard @@ -5257,6 +5646,118 @@ __metadata: languageName: unknown linkType: soft +"@calcom/website@workspace:apps/website": + version: 0.0.0-use.local + resolution: "@calcom/website@workspace:apps/website" + dependencies: + "@algora/sdk": ^0.1.2 + "@calcom/app-store": "*" + "@calcom/config": "*" + "@calcom/dayjs": "*" + "@calcom/embed-react": "workspace:^" + "@calcom/features": "*" + "@calcom/lib": "*" + "@calcom/prisma": "*" + "@calcom/tsconfig": "*" + "@calcom/ui": "*" + "@datocms/cma-client-node": ^2.0.0 + "@floating-ui/react-dom": ^1.0.0 + "@flodlc/nebula": ^1.0.56 + "@graphql-codegen/cli": ^5.0.0 + "@graphql-codegen/typed-document-node": ^5.0.1 + "@graphql-codegen/typescript": ^4.0.1 + "@graphql-codegen/typescript-operations": ^4.0.1 + "@graphql-typed-document-node/core": ^3.2.0 + "@headlessui/react": ^1.5.0 + "@heroicons/react": ^1.0.6 + "@hookform/resolvers": ^2.9.7 + "@juggle/resize-observer": ^3.4.0 + "@next/bundle-analyzer": ^13.1.6 + "@radix-ui/react-accordion": ^1.0.0 + "@radix-ui/react-avatar": ^1.0.4 + "@radix-ui/react-dropdown-menu": ^2.0.5 + "@radix-ui/react-navigation-menu": ^1.0.0 + "@radix-ui/react-portal": ^1.0.0 + "@radix-ui/react-slider": ^1.0.0 + "@radix-ui/react-tabs": ^1.0.0 + "@radix-ui/react-tooltip": ^1.0.0 + "@stripe/stripe-js": ^1.35.0 + "@tanstack/react-query": ^4.3.9 + "@typeform/embed-react": ^1.2.4 + "@types/bcryptjs": ^2.4.2 + "@types/debounce": ^1.2.1 + "@types/gtag.js": ^0.0.10 + "@types/micro": 7.3.7 + "@types/node": 16.9.1 + "@types/react": 18.0.26 + "@types/react-gtm-module": ^2.0.1 + "@types/xml2js": ^0.4.11 + "@vercel/analytics": ^0.1.6 + "@vercel/edge-functions-ui": ^0.2.1 + "@vercel/og": ^0.5.0 + autoprefixer: ^10.4.12 + bcryptjs: ^2.4.3 + clsx: ^1.2.1 + cobe: ^0.4.1 + concurrently: ^7.6.0 + cross-env: ^7.0.3 + datocms-structured-text-to-plain-text: ^2.0.4 + datocms-structured-text-utils: ^2.0.4 + debounce: ^1.2.1 + dotenv: ^16.3.1 + enquirer: ^2.4.1 + env-cmd: ^10.1.0 + eslint: ^8.34.0 + fathom-client: ^3.5.0 + globby: ^13.1.3 + graphql: ^16.8.0 + graphql-codegen: ^0.4.0 + graphql-request: ^6.1.0 + gray-matter: ^4.0.3 + gsap: ^3.11.0 + i18n-unused: ^0.13.0 + iframe-resizer-react: ^1.1.0 + keen-slider: ^6.8.0 + lucide-react: ^0.171.0 + micro: ^10.0.1 + next: ^14.1.3 + next-auth: ^4.22.1 + next-axiom: ^0.17.0 + next-i18next: ^13.2.2 + next-seo: ^6.0.0 + playwright-core: ^1.38.1 + postcss: ^8.4.18 + prism-react-renderer: ^1.3.5 + react: ^18.2.0 + react-confetti: ^6.0.1 + react-datocms: ^3.1.0 + react-device-detect: ^2.2.2 + react-dom: ^18.2.0 + react-fast-marquee: ^1.6.4 + react-github-btn: ^1.4.0 + react-hook-form: ^7.43.3 + react-hot-toast: ^2.3.0 + react-live-chat-loader: ^2.8.1 + react-markdown: ^9.0.1 + react-merge-refs: 1.1.0 + react-resize-detector: ^9.1.0 + react-twemoji: ^0.3.0 + react-use-measure: ^2.1.1 + react-wrap-balancer: ^1.0.0 + remark: ^14.0.2 + remark-html: ^14.0.1 + remeda: ^1.24.1 + stripe: ^9.16.0 + tailwind-merge: ^1.13.2 + tailwindcss: ^3.3.3 + ts-node: ^10.9.1 + typescript: ^4.9.4 + wait-on: ^7.0.1 + xml2js: ^0.6.0 + zod: ^3.22.2 + languageName: unknown + linkType: soft + "@calcom/whatsapp@workspace:packages/app-store/whatsapp": version: 0.0.0-use.local resolution: "@calcom/whatsapp@workspace:packages/app-store/whatsapp" @@ -5683,6 +6184,38 @@ __metadata: languageName: node linkType: hard +"@datocms/cma-client-node@npm:^2.0.0": + version: 2.2.6 + resolution: "@datocms/cma-client-node@npm:2.2.6" + dependencies: + "@datocms/cma-client": ^2.2.6 + "@datocms/rest-client-utils": ^1.3.3 + got: ^11.8.5 + mime-types: ^2.1.35 + tmp-promise: ^3.0.3 + checksum: d18b568f5a4538abbd824091722f7df95c99cb5e550560bcae701654924e7933559b27d176fc7772056afe214516c99e8bb383319d4e492b053d20d3732df929 + languageName: node + linkType: hard + +"@datocms/cma-client@npm:^2.2.6": + version: 2.2.6 + resolution: "@datocms/cma-client@npm:2.2.6" + dependencies: + "@datocms/rest-client-utils": ^1.3.3 + checksum: 52e65ab5cdc6b09859f6b07f87a5e8700ba2b2f0579894b7f3c6735c1360f83e41941783dfab78bd18d3f9e12bbd50436b953663a332c50fbcd12b167c567ed6 + languageName: node + linkType: hard + +"@datocms/rest-client-utils@npm:^1.3.3": + version: 1.3.3 + resolution: "@datocms/rest-client-utils@npm:1.3.3" + dependencies: + "@whatwg-node/fetch": ^0.5.3 + async-scheduler: ^1.4.4 + checksum: eb746ce41b0c38b0ebef42238046ce8ff2734330580b7198cc11bf7182de394af9de4df021e967419592eb62729feae533c7126d5629ec97e7cc8b3aa30e9eb2 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:^0.5.3": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -5850,6 +6383,25 @@ __metadata: languageName: node linkType: hard +"@envelop/core@npm:^5.0.2": + version: 5.0.3 + resolution: "@envelop/core@npm:5.0.3" + dependencies: + "@envelop/types": 5.0.0 + tslib: ^2.5.0 + checksum: 5a5987b57fea6fcae3a0665adb9f11c0d25ecf99f235759e5c9601c464a2b99d8f20aca69437225dd8df6dc97d6fb0d3882979158dff53f9c81cde0a6c27893c + languageName: node + linkType: hard + +"@envelop/types@npm:5.0.0": + version: 5.0.0 + resolution: "@envelop/types@npm:5.0.0" + dependencies: + tslib: ^2.5.0 + checksum: 1098f821981d2b59a453f5f21ac3b2ea9fcf6bd253a564f0317f67b7469ff17e53921ea99a3b528cb5c95e0671460d68b55150836ce635788576500317a8ad9b + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/aix-ppc64@npm:0.21.5" @@ -6450,7 +7002,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react-dom@npm:^1.3.0": +"@floating-ui/react-dom@npm:^1.0.0, @floating-ui/react-dom@npm:^1.3.0": version: 1.3.0 resolution: "@floating-ui/react-dom@npm:1.3.0" dependencies: @@ -6488,6 +7040,13 @@ __metadata: languageName: node linkType: hard +"@flodlc/nebula@npm:^1.0.56": + version: 1.0.56 + resolution: "@flodlc/nebula@npm:1.0.56" + checksum: 044058423bc8a2c6ea60a0636400593a0912c142fbb6f50cc03288c702ae9c2029f84eb4fbac7e701a7ee1c2a5e33cc1af1b8d94af419c1197f74066b7867d21 + languageName: node + linkType: hard + "@formatjs/ecma402-abstract@npm:1.11.4": version: 1.11.4 resolution: "@formatjs/ecma402-abstract@npm:1.11.4" @@ -6673,6 +7232,607 @@ __metadata: languageName: node linkType: hard +"@graphql-codegen/add@npm:^5.0.3": + version: 5.0.3 + resolution: "@graphql-codegen/add@npm:5.0.3" + 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 + checksum: 5196b6c64907f03dc1adc0ac4f98ed5fe69abe0eb87027a55dfc14b178cc1fee2bc47f68c8f5a68ce7aa4bc5a4f970f983d1d85b6d7a20489e50657baccd2ad0 + languageName: node + linkType: hard + +"@graphql-codegen/cli@npm:^5.0.0": + version: 5.0.5 + resolution: "@graphql-codegen/cli@npm:5.0.5" + dependencies: + "@babel/generator": ^7.18.13 + "@babel/template": ^7.18.10 + "@babel/types": ^7.18.13 + "@graphql-codegen/client-preset": ^4.6.0 + "@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.10.0 + chalk: ^4.1.0 + cosmiconfig: ^8.1.3 + debounce: ^1.2.0 + detect-indent: ^6.0.0 + graphql-config: ^5.1.1 + 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 + 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 + bin: + gql-gen: cjs/bin.js + graphql-code-generator: cjs/bin.js + graphql-codegen: cjs/bin.js + graphql-codegen-esm: esm/bin.js + checksum: f3ff651b52878da37ff131605600391ff09ff5614b2c17dace14d4c36c16de0e9331b3acbae3631ff97f038483a224f3ba9f4c1631e27d02e9dc01f26960926b + languageName: node + linkType: hard + +"@graphql-codegen/client-preset@npm:^4.6.0": + version: 4.6.2 + resolution: "@graphql-codegen/client-preset@npm:4.6.2" + dependencies: + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/template": ^7.20.7 + "@graphql-codegen/add": ^5.0.3 + "@graphql-codegen/gql-tag-operations": 4.0.14 + "@graphql-codegen/plugin-helpers": ^5.1.0 + "@graphql-codegen/typed-document-node": ^5.0.13 + "@graphql-codegen/typescript": ^4.1.3 + "@graphql-codegen/typescript-operations": ^4.4.1 + "@graphql-codegen/visitor-plugin-common": ^5.6.1 + "@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 + checksum: a8f13d1bb5924c98d8e34ddc6c6a3cd9c9c6015a93ec85043db2939da7b872165615d549c346fdc804842c19cce79dd75f289508bde4156207ab380d65ac59ce + languageName: node + linkType: hard + +"@graphql-codegen/core@npm:^4.0.2": + version: 4.0.2 + resolution: "@graphql-codegen/core@npm:4.0.2" + 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 + checksum: 5fda4e843174aacd4a481b73b4d259fa2df7ffe4200bd06e95ecd4b3f43aa5969deeaeb51f6cf15a542e99ee5756c3e02a29d9d2ff9891af40e234a8f68ead4d + languageName: node + linkType: hard + +"@graphql-codegen/gql-tag-operations@npm:4.0.14": + version: 4.0.14 + resolution: "@graphql-codegen/gql-tag-operations@npm:4.0.14" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.1.0 + "@graphql-codegen/visitor-plugin-common": 5.6.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 + checksum: 0d3814904dc02aadb45e149d1839e014374b15b46d3cb0f66b2f806bc676c0cb97a868ce4d2bbda7e4a9c607835f23109f6359624bb1a52be600f2f336c0de32 + languageName: node + linkType: hard + +"@graphql-codegen/plugin-helpers@npm:^5.0.3, @graphql-codegen/plugin-helpers@npm:^5.1.0": + version: 5.1.0 + resolution: "@graphql-codegen/plugin-helpers@npm:5.1.0" + 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 + checksum: 235762e2e7a55898e71fb1d52ef3093c26787c16e7eb5a3df6e06a7b2003da641b9a9c96833091e9fb11f9cf72da9e7c5f19ce124074d5d7d33a419117d050a9 + languageName: node + linkType: hard + +"@graphql-codegen/schema-ast@npm:^4.0.2": + version: 4.1.0 + resolution: "@graphql-codegen/schema-ast@npm:4.1.0" + 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 + checksum: cddec7723d708990ac8e33eb8935e72545b60ed7b772452ba45b60e577af950d23503de83f0919d1730f7d52dcb970900d3587d9a54202032164ba3c246d4c10 + languageName: node + linkType: hard + +"@graphql-codegen/typed-document-node@npm:^5.0.1, @graphql-codegen/typed-document-node@npm:^5.0.13": + version: 5.0.13 + resolution: "@graphql-codegen/typed-document-node@npm:5.0.13" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.1.0 + "@graphql-codegen/visitor-plugin-common": 5.6.1 + 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 + checksum: 9a10d8b76ef6c102442a490658e89ebd9e529f81322836b4f2e4ce97b83defba93c022499143c7643c2010b0188842921696dd6223e365a7cb6395e5364db775 + languageName: node + linkType: hard + +"@graphql-codegen/typescript-operations@npm:^4.0.1, @graphql-codegen/typescript-operations@npm:^4.4.1": + version: 4.4.1 + resolution: "@graphql-codegen/typescript-operations@npm:4.4.1" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.1.0 + "@graphql-codegen/typescript": ^4.1.3 + "@graphql-codegen/visitor-plugin-common": 5.6.1 + 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 + checksum: 855de09757dd5b4531afada448f05fe34f59481dba1e4795915de4e2b03f9abd1840e7c3a86b074725359b847d6b09ec94c0580fe2c67214649ed044c9cb75ab + languageName: node + linkType: hard + +"@graphql-codegen/typescript@npm:^4.0.1, @graphql-codegen/typescript@npm:^4.1.3": + version: 4.1.3 + resolution: "@graphql-codegen/typescript@npm:4.1.3" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.1.0 + "@graphql-codegen/schema-ast": ^4.0.2 + "@graphql-codegen/visitor-plugin-common": 5.6.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 + checksum: 218de994c6c702b96aa40ff7ac4ea14d0ca078e60149207967794f4b28fb02c5a5173646ce9a1d0b2feb9181081135e7f9f0d3a9e634730e79c04e50451287ee + languageName: node + linkType: hard + +"@graphql-codegen/visitor-plugin-common@npm:5.6.1, @graphql-codegen/visitor-plugin-common@npm:^5.6.1": + version: 5.6.1 + resolution: "@graphql-codegen/visitor-plugin-common@npm:5.6.1" + dependencies: + "@graphql-codegen/plugin-helpers": ^5.1.0 + "@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 + checksum: eff9ee6ed97976b8e4fb5d3b77d3905e98477b55624c17e13e39622f9dadc977084df36406983455d13f10878108826b725d8a6f0c705d3226852ff097821fb9 + languageName: node + linkType: hard + +"@graphql-tools/apollo-engine-loader@npm:^8.0.0": + version: 8.0.15 + resolution: "@graphql-tools/apollo-engine-loader@npm:8.0.15" + dependencies: + "@graphql-tools/utils": ^10.8.1 + "@whatwg-node/fetch": ^0.10.0 + sync-fetch: 0.6.0-2 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 6acf60c6eba895e92c265327ba9fdc818984b38585639ffac57960b4c4235e19b0a22679f588f2d8b26845e8c00cdf8660d5d5c32b4b2fb8498089a169bc83ab + languageName: node + linkType: hard + +"@graphql-tools/batch-execute@npm:^9.0.12": + version: 9.0.12 + resolution: "@graphql-tools/batch-execute@npm:9.0.12" + dependencies: + "@graphql-tools/utils": ^10.8.1 + dataloader: ^2.2.3 + tslib: ^2.8.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 49146231f1ba33959feda6a55cb44b022c1c464841c6f6d8a929796fc8a6728fad6c0f8175a75970369cc86b7c871b5b919b3179f48744f480c4e536c811063e + languageName: node + linkType: hard + +"@graphql-tools/code-file-loader@npm:^8.0.0": + version: 8.1.15 + resolution: "@graphql-tools/code-file-loader@npm:8.1.15" + dependencies: + "@graphql-tools/graphql-tag-pluck": 8.3.14 + "@graphql-tools/utils": ^10.8.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 + checksum: 429ae84c1e5be50f6a2d4dc406d8a86282117666ab211e53981cbd71bf368c26326728ecdf219770f3acb89f78d6fca4e2957f2fb5b9e45efef77aace4189e67 + languageName: node + linkType: hard + +"@graphql-tools/delegate@npm:^10.2.13": + version: 10.2.13 + resolution: "@graphql-tools/delegate@npm:10.2.13" + dependencies: + "@graphql-tools/batch-execute": ^9.0.12 + "@graphql-tools/executor": ^1.3.10 + "@graphql-tools/schema": ^10.0.11 + "@graphql-tools/utils": ^10.8.1 + "@repeaterjs/repeater": ^3.0.6 + dataloader: ^2.2.3 + dset: ^3.1.2 + tslib: ^2.8.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 79c0edc5d0420e1eb6033aac06ba882b3256cd33766e7bd8c562e9ba76489929e7884230abc0ceea91262e22291fa6d76bcee5e8552c193c4b5d861af8b640ec + languageName: node + linkType: hard + +"@graphql-tools/documents@npm:^1.0.0": + version: 1.0.1 + resolution: "@graphql-tools/documents@npm:1.0.1" + dependencies: + lodash.sortby: ^4.7.0 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: c6ff859d2673dbf884f19d6319735afacc6bff2df6f8ea3dbf56839d01568f61210f256f0905156f123428cc24962ada26b37903263699fc8cd7efb8849a6508 + languageName: node + linkType: hard + +"@graphql-tools/executor-common@npm:^0.0.2": + version: 0.0.2 + resolution: "@graphql-tools/executor-common@npm:0.0.2" + dependencies: + "@envelop/core": ^5.0.2 + "@graphql-tools/utils": ^10.8.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 5dc1ccd8fb7e091e390038fa6ab1e4a929cecf2608dd6c1ec39b322ba11885dac2462fe1224b8b4451a8d7c1ed50d2903a88785aaddfbcc7f2e11a8237ef468b + languageName: node + linkType: hard + +"@graphql-tools/executor-graphql-ws@npm:^2.0.1": + version: 2.0.2 + resolution: "@graphql-tools/executor-graphql-ws@npm:2.0.2" + dependencies: + "@graphql-tools/executor-common": ^0.0.2 + "@graphql-tools/utils": ^10.8.1 + "@whatwg-node/disposablestack": ^0.0.5 + graphql-ws: ^6.0.3 + isomorphic-ws: ^5.0.0 + tslib: ^2.8.1 + ws: ^8.17.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 69b84e843d9c8b93bc5eaef5d6bab81aabcda6326fdd09158586a698c81ba37889f3c5b2a042e826f9500ebd201c77eb921f99abe1e2076eba3fbeab78041457 + languageName: node + linkType: hard + +"@graphql-tools/executor-http@npm:^1.1.9": + version: 1.2.7 + resolution: "@graphql-tools/executor-http@npm:1.2.7" + dependencies: + "@graphql-tools/executor-common": ^0.0.2 + "@graphql-tools/utils": ^10.8.1 + "@repeaterjs/repeater": ^3.0.4 + "@whatwg-node/disposablestack": ^0.0.5 + "@whatwg-node/fetch": ^0.10.1 + extract-files: ^11.0.0 + meros: ^1.2.1 + tslib: ^2.8.1 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 3e3544df9ae60c8d0205d062b2581c8391e5edc0f34f006b6df9d3241e13edf13a562978c15cb00ec29eb7a8a4f363ccfdf52dec7162a7d1ab54c4b41547d414 + languageName: node + linkType: hard + +"@graphql-tools/executor-legacy-ws@npm:^1.1.12": + version: 1.1.12 + resolution: "@graphql-tools/executor-legacy-ws@npm:1.1.12" + dependencies: + "@graphql-tools/utils": ^10.8.1 + "@types/ws": ^8.0.0 + isomorphic-ws: ^5.0.0 + tslib: ^2.4.0 + ws: ^8.17.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 6e00e16e03faefb1da6ec1b83ba9dc48b3a0314d5733dcff4495f483a43aa73ec175aee45ddcced193411264a151e892107571bea19e710352ffa38b2e055463 + languageName: node + linkType: hard + +"@graphql-tools/executor@npm:^1.3.10": + version: 1.3.14 + resolution: "@graphql-tools/executor@npm:1.3.14" + dependencies: + "@graphql-tools/utils": ^10.8.1 + "@graphql-typed-document-node/core": ^3.2.0 + "@repeaterjs/repeater": ^3.0.4 + "@whatwg-node/disposablestack": ^0.0.5 + tslib: ^2.4.0 + value-or-promise: ^1.0.12 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 5df270811896e8c6a6f2f7917c9748d5a74c2a5ef45e713f8c5d45ce6411ad266a6f1814922b053be366a49f7b41d08c42df75efe1b8e76a9336f873b107741d + languageName: node + linkType: hard + +"@graphql-tools/git-loader@npm:^8.0.0": + version: 8.0.19 + resolution: "@graphql-tools/git-loader@npm:8.0.19" + dependencies: + "@graphql-tools/graphql-tag-pluck": 8.3.14 + "@graphql-tools/utils": ^10.8.1 + is-glob: 4.0.3 + micromatch: ^4.0.8 + tslib: ^2.4.0 + unixify: ^1.0.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 0105a27a0427ae5019c62340174028ef5c9dbea6601c478bcf7f54129ee0ab6c7a67bc963afd7dddf687e477d7f725caf852670bd1a9895f28a854ce51e186b0 + languageName: node + linkType: hard + +"@graphql-tools/github-loader@npm:^8.0.0": + version: 8.0.15 + resolution: "@graphql-tools/github-loader@npm:8.0.15" + dependencies: + "@graphql-tools/executor-http": ^1.1.9 + "@graphql-tools/graphql-tag-pluck": ^8.3.14 + "@graphql-tools/utils": ^10.8.1 + "@whatwg-node/fetch": ^0.10.0 + sync-fetch: 0.6.0-2 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: d264a6b740cb3099a767796fac39696e1672831731b5bbf7939ade5bc11c6be9db4af8f305a413742a00654fd84823aa5a816512d30198047c8ab7d0980f2169 + languageName: node + linkType: hard + +"@graphql-tools/graphql-file-loader@npm:^8.0.0": + version: 8.0.14 + resolution: "@graphql-tools/graphql-file-loader@npm:8.0.14" + dependencies: + "@graphql-tools/import": 7.0.13 + "@graphql-tools/utils": ^10.8.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 + checksum: 38510ec3046e2055f850678ae5acfc63c9767fd92fa0d8896eae403119dc42aa3c13addcf0b8f736e7193e3e82ddca6a767bcb2b80c5fdda894114f6b150dff7 + languageName: node + linkType: hard + +"@graphql-tools/graphql-tag-pluck@npm:8.3.14, @graphql-tools/graphql-tag-pluck@npm:^8.3.14": + version: 8.3.14 + resolution: "@graphql-tools/graphql-tag-pluck@npm:8.3.14" + 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.8.1 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: d5dc0c1f29b6964487b1cf7c9c4e214da7d39a2cb10eb151347082e73243851aa275075e04170fb39f55e657c1051b30d68b726192543bd8e1861e1b437bc727 + languageName: node + linkType: hard + +"@graphql-tools/import@npm:7.0.13": + version: 7.0.13 + resolution: "@graphql-tools/import@npm:7.0.13" + dependencies: + "@graphql-tools/utils": ^10.8.1 + resolve-from: 5.0.0 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 1a0be36415dab0f6b33c89bf499ed260de94a54e331f0f512c83b4bab1ac417bd7cbe5bd247fbef0301b9dbe329cf7ced642d5d2a06b83ec71aa42a8c7794a74 + languageName: node + linkType: hard + +"@graphql-tools/json-file-loader@npm:^8.0.0": + version: 8.0.13 + resolution: "@graphql-tools/json-file-loader@npm:8.0.13" + dependencies: + "@graphql-tools/utils": ^10.8.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 + checksum: f9683ac092b881da9e3fa64b7a4e502e51603f49c4335bcaba8bc9896ebd6d919941f37f92d51b45edcaf54dfbf6cd637ae3f57a0ab73ae0abe1b4818ff1a9d4 + languageName: node + linkType: hard + +"@graphql-tools/load@npm:^8.0.0": + version: 8.0.14 + resolution: "@graphql-tools/load@npm:8.0.14" + dependencies: + "@graphql-tools/schema": ^10.0.18 + "@graphql-tools/utils": ^10.8.1 + p-limit: 3.1.0 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: d9d8c96fba5bf4ec8b879d6c66c1ccbbdf1ad6b87c9dd3d45be5ddf77cd88cf4e365249bcd24833069c6b30de07ccaf7e4d413376a81ff93a9edad9cfa0fee1d + languageName: node + linkType: hard + +"@graphql-tools/merge@npm:^9.0.0, @graphql-tools/merge@npm:^9.0.19": + version: 9.0.19 + resolution: "@graphql-tools/merge@npm:9.0.19" + dependencies: + "@graphql-tools/utils": ^10.8.1 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: dfae329da0ca683d7672d8e08b11161e2299bf78224c61f3673a2ca69c73c0590b67da390c8555c8caf61ee106f2038339da8c7f35555b941ba9b1aefb52e808 + languageName: node + linkType: hard + +"@graphql-tools/optimize@npm:^2.0.0": + version: 2.0.0 + resolution: "@graphql-tools/optimize@npm:2.0.0" + dependencies: + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 7f79c0e1852abc571308e887d27d613da5b797256c8c6eb6c5fe7ca77f09e61524778ae281cebc0b698c51d4fe1074e2b8e0d0627b8e2dcf505aa6ed09b49a2f + languageName: node + linkType: hard + +"@graphql-tools/prisma-loader@npm:^8.0.0": + version: 8.0.17 + resolution: "@graphql-tools/prisma-loader@npm:8.0.17" + dependencies: + "@graphql-tools/url-loader": ^8.0.15 + "@graphql-tools/utils": ^10.5.6 + "@types/js-yaml": ^4.0.0 + "@whatwg-node/fetch": ^0.10.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 + lodash: ^4.17.20 + scuid: ^1.1.0 + tslib: ^2.4.0 + yaml-ast-parser: ^0.0.43 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: e05be13e5dd152cb5f88acba90ab23982bdea3ed623647956d399196dd6c73a75e47a5c594f9d5a2ef1fc19db178a5a956c9d9cecf75ab0f77609b07808e0b35 + languageName: node + linkType: hard + +"@graphql-tools/relay-operation-optimizer@npm:^7.0.0": + version: 7.0.14 + resolution: "@graphql-tools/relay-operation-optimizer@npm:7.0.14" + dependencies: + "@ardatan/relay-compiler": ^12.0.1 + "@graphql-tools/utils": ^10.8.1 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 9c792a905f5df60438231028271b9d3a1edaa3bcc88864177e331fbd8daceda7994412fc9312642f0cc04040edf1e54751522710b879cb5e08af6ba380d668f7 + languageName: node + linkType: hard + +"@graphql-tools/schema@npm:^10.0.0, @graphql-tools/schema@npm:^10.0.11, @graphql-tools/schema@npm:^10.0.18": + version: 10.0.18 + resolution: "@graphql-tools/schema@npm:10.0.18" + dependencies: + "@graphql-tools/merge": ^9.0.19 + "@graphql-tools/utils": ^10.8.1 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 620faa9524c8acf3bac7ca7792ad8b4ac38533fd1f35b1eab53de3c8bdb9c81f9095f977e431a6bbcec14a58454db1449ff3826ff9a23225902f44f1c2a66936 + languageName: node + linkType: hard + +"@graphql-tools/url-loader@npm:^8.0.0, @graphql-tools/url-loader@npm:^8.0.15": + version: 8.0.26 + resolution: "@graphql-tools/url-loader@npm:8.0.26" + dependencies: + "@graphql-tools/executor-graphql-ws": ^2.0.1 + "@graphql-tools/executor-http": ^1.1.9 + "@graphql-tools/executor-legacy-ws": ^1.1.12 + "@graphql-tools/utils": ^10.8.1 + "@graphql-tools/wrap": ^10.0.16 + "@types/ws": ^8.0.0 + "@whatwg-node/fetch": ^0.10.0 + isomorphic-ws: ^5.0.0 + sync-fetch: 0.6.0-2 + tslib: ^2.4.0 + ws: ^8.17.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: dae26f48d8635a31c02fe41342a315afd1b28618b880ca63fee712987c6ca3fd2257690f69d145b394bc630cc024a78fb8b7b000e2e4d9ac58783bc73714c7bc + languageName: node + linkType: hard + +"@graphql-tools/utils@npm:^10.0.0, @graphql-tools/utils@npm:^10.5.6, @graphql-tools/utils@npm:^10.8.1": + version: 10.8.1 + resolution: "@graphql-tools/utils@npm:10.8.1" + dependencies: + "@graphql-typed-document-node/core": ^3.1.1 + cross-inspect: 1.0.1 + dset: ^3.1.4 + tslib: ^2.4.0 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: 2de6d259a904a053d368134b76bf673c67af43e6d86a7fac5f638af119e61e86b30f3c1c00855ed558915f55b8057c11e732e78748e52d7b9fad491911b51c9c + languageName: node + linkType: hard + +"@graphql-tools/wrap@npm:^10.0.16": + version: 10.0.31 + resolution: "@graphql-tools/wrap@npm:10.0.31" + dependencies: + "@graphql-tools/delegate": ^10.2.13 + "@graphql-tools/schema": ^10.0.11 + "@graphql-tools/utils": ^10.8.1 + tslib: ^2.8.1 + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + checksum: c25ef1c6c08559c85e656f9db69d63d3c0e4930e315a66b1912268d4b0c0f758b16a8098cb0872dadf06517f06abf69f15df1661c46b333d4d2527b76172727a + languageName: node + linkType: hard + +"@graphql-typed-document-node/core@npm:3.2.0, @graphql-typed-document-node/core@npm:^3.1.1, @graphql-typed-document-node/core@npm:^3.2.0": + version: 3.2.0 + resolution: "@graphql-typed-document-node/core@npm:3.2.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 || ^17.0.0 + checksum: fa44443accd28c8cf4cb96aaaf39d144a22e8b091b13366843f4e97d19c7bfeaf609ce3c7603a4aeffe385081eaf8ea245d078633a7324c11c5ec4b2011bb76d + languageName: node + linkType: hard + "@grpc/grpc-js@npm:^1.7.1": version: 1.9.14 resolution: "@grpc/grpc-js@npm:1.9.14" @@ -6697,6 +7857,44 @@ __metadata: languageName: node linkType: hard +"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": + version: 9.3.0 + resolution: "@hapi/hoek@npm:9.3.0" + checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 + languageName: node + linkType: hard + +"@hapi/topo@npm:^5.1.0": + version: 5.1.0 + resolution: "@hapi/topo@npm:5.1.0" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 604dfd5dde76d5c334bd03f9001fce69c7ce529883acf92da96f4fe7e51221bf5e5110e964caca287a6a616ba027c071748ab636ff178ad750547fba611d6014 + languageName: node + linkType: hard + +"@headlessui/react@npm:^1.5.0": + version: 1.7.19 + resolution: "@headlessui/react@npm:1.7.19" + dependencies: + "@tanstack/react-virtual": ^3.0.0-beta.60 + client-only: ^0.0.1 + peerDependencies: + react: ^16 || ^17 || ^18 + react-dom: ^16 || ^17 || ^18 + checksum: 2a343a5fcf1f45e870cc94613231b89a8da78114001ffafa4751a0eceae7569ff9237aff1f2aedfa6f6e53ee3bb9ba5e5d19ebf1878fee3ff4f3c733fddc1087 + languageName: node + linkType: hard + +"@heroicons/react@npm:^1.0.6": + version: 1.0.6 + resolution: "@heroicons/react@npm:1.0.6" + peerDependencies: + react: ">= 16" + checksum: 372b1eda3ce735ef069777bc96304f70de585ebb71a6d1cedc121bb695f9bca235619112e3ee14e8779e95a03096813cbbe3b755927a54b7580d1ce084fa4096 + languageName: node + linkType: hard + "@hookform/error-message@npm:^2.0.0": version: 2.0.0 resolution: "@hookform/error-message@npm:2.0.0" @@ -7742,7 +8940,7 @@ __metadata: languageName: node linkType: hard -"@juggle/resize-observer@npm:^3.3.1": +"@juggle/resize-observer@npm:^3.3.1, @juggle/resize-observer@npm:^3.4.0": version: 3.4.0 resolution: "@juggle/resize-observer@npm:3.4.0" checksum: 2505028c05cc2e17639fcad06218b1c4b60f932a4ebb4b41ab546ef8c157031ae377e3f560903801f6d01706dbefd4943b6c4704bf19ed86dfa1c62f1473a570 @@ -8553,6 +9751,13 @@ __metadata: languageName: node linkType: hard +"@next/env@npm:13.5.8": + version: 13.5.8 + resolution: "@next/env@npm:13.5.8" + checksum: 233983c0b6be309b199ba918dec05eca3fb1aff91dd06e076088553f07af9a8bca6336a801302e50a737c8a19ce33e9e5f386f382d5af549b43a6c5f5e2a305e + languageName: node + linkType: hard + "@next/env@npm:14.0.4": version: 14.0.4 resolution: "@next/env@npm:14.0.4" @@ -8560,6 +9765,13 @@ __metadata: languageName: node linkType: hard +"@next/env@npm:14.2.24": + version: 14.2.24 + resolution: "@next/env@npm:14.2.24" + checksum: 251f9f3038fcc286619abd9fb32dcbf9f6e00355ecc7905986a3352658a67eca896519ba19df23f4e683e9628a6cf1414e94b498c1a4daac4060762a2658ff77 + languageName: node + linkType: hard + "@next/eslint-plugin-next@npm:13.2.1": version: 13.2.1 resolution: "@next/eslint-plugin-next@npm:13.2.1" @@ -8585,6 +9797,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-darwin-arm64@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-darwin-arm64@npm:13.5.8" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@next/swc-darwin-arm64@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-darwin-arm64@npm:14.0.4" @@ -8592,6 +9811,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-darwin-arm64@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-darwin-arm64@npm:14.2.24" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@next/swc-darwin-x64@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-darwin-x64@npm:13.5.7" @@ -8599,6 +9825,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-darwin-x64@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-darwin-x64@npm:13.5.8" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@next/swc-darwin-x64@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-darwin-x64@npm:14.0.4" @@ -8606,6 +9839,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-darwin-x64@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-darwin-x64@npm:14.2.24" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@next/swc-linux-arm64-gnu@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-arm64-gnu@npm:13.5.7" @@ -8613,6 +9853,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-arm64-gnu@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-linux-arm64-gnu@npm:13.5.8" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@next/swc-linux-arm64-gnu@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-linux-arm64-gnu@npm:14.0.4" @@ -8620,6 +9867,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-arm64-gnu@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-linux-arm64-gnu@npm:14.2.24" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@next/swc-linux-arm64-musl@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-arm64-musl@npm:13.5.7" @@ -8627,6 +9881,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-arm64-musl@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-linux-arm64-musl@npm:13.5.8" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@next/swc-linux-arm64-musl@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-linux-arm64-musl@npm:14.0.4" @@ -8634,6 +9895,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-arm64-musl@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-linux-arm64-musl@npm:14.2.24" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@next/swc-linux-x64-gnu@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-x64-gnu@npm:13.5.7" @@ -8641,6 +9909,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-x64-gnu@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-linux-x64-gnu@npm:13.5.8" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@next/swc-linux-x64-gnu@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-linux-x64-gnu@npm:14.0.4" @@ -8648,6 +9923,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-x64-gnu@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-linux-x64-gnu@npm:14.2.24" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@next/swc-linux-x64-musl@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-linux-x64-musl@npm:13.5.7" @@ -8655,6 +9937,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-x64-musl@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-linux-x64-musl@npm:13.5.8" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@next/swc-linux-x64-musl@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-linux-x64-musl@npm:14.0.4" @@ -8662,6 +9951,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-linux-x64-musl@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-linux-x64-musl@npm:14.2.24" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@next/swc-win32-arm64-msvc@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-win32-arm64-msvc@npm:13.5.7" @@ -8669,6 +9965,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-arm64-msvc@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-win32-arm64-msvc@npm:13.5.8" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@next/swc-win32-arm64-msvc@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-win32-arm64-msvc@npm:14.0.4" @@ -8676,6 +9979,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-arm64-msvc@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-win32-arm64-msvc@npm:14.2.24" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@next/swc-win32-ia32-msvc@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-win32-ia32-msvc@npm:13.5.7" @@ -8683,6 +9993,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-ia32-msvc@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-win32-ia32-msvc@npm:13.5.8" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@next/swc-win32-ia32-msvc@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-win32-ia32-msvc@npm:14.0.4" @@ -8690,6 +10007,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-ia32-msvc@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-win32-ia32-msvc@npm:14.2.24" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@next/swc-win32-x64-msvc@npm:13.5.7": version: 13.5.7 resolution: "@next/swc-win32-x64-msvc@npm:13.5.7" @@ -8697,6 +10021,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-x64-msvc@npm:13.5.8": + version: 13.5.8 + resolution: "@next/swc-win32-x64-msvc@npm:13.5.8" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@next/swc-win32-x64-msvc@npm:14.0.4": version: 14.0.4 resolution: "@next/swc-win32-x64-msvc@npm:14.0.4" @@ -8704,6 +10035,13 @@ __metadata: languageName: node linkType: hard +"@next/swc-win32-x64-msvc@npm:14.2.24": + version: 14.2.24 + resolution: "@next/swc-win32-x64-msvc@npm:14.2.24" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@next/third-parties@npm:^14.2.5": version: 14.2.5 resolution: "@next/third-parties@npm:14.2.5" @@ -10168,6 +11506,39 @@ __metadata: languageName: node linkType: hard +"@peculiar/asn1-schema@npm:^2.3.13, @peculiar/asn1-schema@npm:^2.3.8": + version: 2.3.15 + resolution: "@peculiar/asn1-schema@npm:2.3.15" + dependencies: + asn1js: ^3.0.5 + pvtsutils: ^1.3.6 + tslib: ^2.8.1 + checksum: af9a84e3a530f0208561dfeacfc591e1bdbee1a8bb0bc666fc46c7d9e6426c793816cef0eba94d01d289e7b6d7be82767f90553404f3487e4abf54867831d4d7 + languageName: node + linkType: hard + +"@peculiar/json-schema@npm:^1.1.12": + version: 1.1.12 + resolution: "@peculiar/json-schema@npm:1.1.12" + dependencies: + tslib: ^2.0.0 + checksum: b26ececdc23c5ef25837f8be8d1eb5e1c8bb6e9ae7227ac59ffea57fff56bd05137734e7685e9100595d3d88d906dff638ef8d1df54264c388d3eac1b05aa060 + languageName: node + linkType: hard + +"@peculiar/webcrypto@npm:^1.4.0": + version: 1.5.0 + resolution: "@peculiar/webcrypto@npm:1.5.0" + dependencies: + "@peculiar/asn1-schema": ^2.3.8 + "@peculiar/json-schema": ^1.1.12 + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + webcrypto-core: ^1.8.0 + checksum: 9022d7452d564a5a26fbacf477842be34736f2d9139f2f5026adc47fdeda7033193d727491503f2a829d35ab819bbfa61c82a785c49c999eac535ecd69a3a459 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -10333,6 +11704,13 @@ __metadata: languageName: node linkType: hard +"@prisma/debug@npm:5.22.0": + version: 5.22.0 + resolution: "@prisma/debug@npm:5.22.0" + checksum: ee263d933c3ab92e93aee78771e5040a510316d96ce69c64cfd65d21e59646b9c5a047446ce7965651563d001150ef763485474bd43ca8a6544ab7ce604d2ffa + languageName: node + linkType: hard + "@prisma/debug@npm:5.3.1": version: 5.3.1 resolution: "@prisma/debug@npm:5.3.1" @@ -10503,6 +11881,15 @@ __metadata: languageName: node linkType: hard +"@prisma/generator-helper@npm:^5.9.1": + version: 5.22.0 + resolution: "@prisma/generator-helper@npm:5.22.0" + dependencies: + "@prisma/debug": 5.22.0 + checksum: 5c942d95b0e31c5b80eecb29185ff2561ca9a5eb86badb0d6dfd96c4e8b8e65e726c8682366bd55c332d9682deda08bc90d8f8dd7c0fc0652c9254d0d983bf47 + languageName: node + linkType: hard + "@prisma/generator-helper@npm:~3.8.1": version: 3.8.1 resolution: "@prisma/generator-helper@npm:3.8.1" @@ -10803,6 +12190,33 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-accordion@npm:^1.0.0": + version: 1.2.3 + resolution: "@radix-ui/react-accordion@npm:1.2.3" + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-collapsible": 1.1.3 + "@radix-ui/react-collection": 1.1.2 + "@radix-ui/react-compose-refs": 1.1.1 + "@radix-ui/react-context": 1.1.1 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-primitive": 2.0.2 + "@radix-ui/react-use-controllable-state": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: ea7873d9b796b0433f3b0091f36aa97c7a9fb29fa5f9ccb43389d9b59d35f43b8b7a41b9e7419c78897ccac67833a88156b66a89fb37aaaea5d2d182c6804ea0 + languageName: node + linkType: hard + "@radix-ui/react-arrow@npm:1.0.3": version: 1.0.3 resolution: "@radix-ui/react-arrow@npm:1.0.3" @@ -10873,6 +12287,32 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-collapsible@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-collapsible@npm:1.1.3" + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-compose-refs": 1.1.1 + "@radix-ui/react-context": 1.1.1 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-presence": 1.1.2 + "@radix-ui/react-primitive": 2.0.2 + "@radix-ui/react-use-controllable-state": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 3689dd1393ed983869e1f2aa4ccfe349af4788a4eb8ee36805ff89aaf6df5ed9743823302388691f9d4527ecee6ed558e95a198fdbe5b86bd2d81b40d0bc2a8c + languageName: node + linkType: hard + "@radix-ui/react-collapsible@npm:^1.0.0": version: 1.0.3 resolution: "@radix-ui/react-collapsible@npm:1.0.3" @@ -10960,6 +12400,28 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-collection@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-collection@npm:1.1.2" + dependencies: + "@radix-ui/react-compose-refs": 1.1.1 + "@radix-ui/react-context": 1.1.1 + "@radix-ui/react-primitive": 2.0.2 + "@radix-ui/react-slot": 1.1.2 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 4401f36778cc9edc9dc5e82f59b51327f38cf6ed048981a04ff17b3279c47b1c6b6919fe6a621572fc154d2cb664df829b125f28525a556980e3c3b66447e6e5 + languageName: node + linkType: hard + "@radix-ui/react-compose-refs@npm:0.1.0": version: 0.1.0 resolution: "@radix-ui/react-compose-refs@npm:0.1.0" @@ -11255,6 +12717,29 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-dismissable-layer@npm:1.1.5": + version: 1.1.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.5" + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-compose-refs": 1.1.1 + "@radix-ui/react-primitive": 2.0.2 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-escape-keydown": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 6f8c219df5033e98b5337e5351e0add8706aab6d10a6f2c7f028f7f36202300f648805530e788a8c8cc3014a7fb9d8e9824ea02100da510e70778457ffb3e4c0 + languageName: node + linkType: hard + "@radix-ui/react-dropdown-menu@npm:^2.0.5": version: 2.0.5 resolution: "@radix-ui/react-dropdown-menu@npm:2.0.5" @@ -11426,6 +12911,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-id@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-id@npm:1.1.0" + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 6fbc9d1739b3b082412da10359e63967b4f3a60383ebda4c9e56b07a722d29bee53b203b3b1418f88854a29315a7715867133bb149e6e22a027a048cdd20d970 + languageName: node + linkType: hard + "@radix-ui/react-label@npm:0.1.5": version: 0.1.5 resolution: "@radix-ui/react-label@npm:0.1.5" @@ -11478,6 +12978,38 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-navigation-menu@npm:^1.0.0": + version: 1.2.5 + resolution: "@radix-ui/react-navigation-menu@npm:1.2.5" + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-collection": 1.1.2 + "@radix-ui/react-compose-refs": 1.1.1 + "@radix-ui/react-context": 1.1.1 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-dismissable-layer": 1.1.5 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-presence": 1.1.2 + "@radix-ui/react-primitive": 2.0.2 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.0 + "@radix-ui/react-use-previous": 1.1.0 + "@radix-ui/react-visually-hidden": 1.1.2 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: b5790c9f2ec06fd10fb2b7226f62777555a7691003ecd085cd8d6beef59ee1e224023e31b260775278da6d7be8d5996e8ad6e8ec5ab00805d018752c8988a134 + languageName: node + linkType: hard + "@radix-ui/react-popover@npm:^1.0.2": version: 1.0.6 resolution: "@radix-ui/react-popover@npm:1.0.6" @@ -11672,6 +13204,26 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-presence@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-presence@npm:1.1.2" + dependencies: + "@radix-ui/react-compose-refs": 1.1.1 + "@radix-ui/react-use-layout-effect": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 0345bc8d3e1ddcbf4b864025833c71f3d76e4801ce16ad126a98aed816be6e819c4fe01097c6c1320771b947f5a14929cc610d18e7a1438cfb5573289fa4d4a6 + languageName: node + linkType: hard + "@radix-ui/react-primitive@npm:0.1.4": version: 0.1.4 resolution: "@radix-ui/react-primitive@npm:0.1.4" @@ -11755,6 +13307,25 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-primitive@npm:2.0.2": + version: 2.0.2 + resolution: "@radix-ui/react-primitive@npm:2.0.2" + dependencies: + "@radix-ui/react-slot": 1.1.2 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 3a6144ed164322b1135f6f774bfd23c7c4c5340db8a1022d05c9c7ad41ba187299a4894caae634e94a1d73b5f69305318a47b41e6dc7806fb5923fa05dd39d40 + languageName: node + linkType: hard + "@radix-ui/react-radio-group@npm:^1.0.0": version: 1.1.3 resolution: "@radix-ui/react-radio-group@npm:1.1.3" @@ -11812,6 +13383,33 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-roving-focus@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-roving-focus@npm:1.1.2" + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-collection": 1.1.2 + "@radix-ui/react-compose-refs": 1.1.1 + "@radix-ui/react-context": 1.1.1 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-primitive": 2.0.2 + "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-controllable-state": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 4a57f5af51387ae7621a6d0c7e3c743f16b06afda9311e6e5a39c023157d6a314931170dd794f901b59c0c768f0c3a121b8af59f7f80e58eb87512fb4540b037 + languageName: node + linkType: hard + "@radix-ui/react-select@npm:^0.1.1": version: 0.1.1 resolution: "@radix-ui/react-select@npm:0.1.1" @@ -12031,6 +13629,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-slot@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-slot@npm:1.1.2" + dependencies: + "@radix-ui/react-compose-refs": 1.1.1 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: f341cd66b284061a5147a67f6d7b8a7337a4c076b97ce087bcb1358fa36e9714ef988cc7ea2c2ed3b6ec3f17adafd2460851b31ed8f4dd73ea22b0b11e22ab97 + languageName: node + linkType: hard + "@radix-ui/react-switch@npm:^1.0.0": version: 1.0.3 resolution: "@radix-ui/react-switch@npm:1.0.3" @@ -12082,6 +13695,32 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-tabs@npm:^1.0.0": + version: 1.1.3 + resolution: "@radix-ui/react-tabs@npm:1.1.3" + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-context": 1.1.1 + "@radix-ui/react-direction": 1.1.0 + "@radix-ui/react-id": 1.1.0 + "@radix-ui/react-presence": 1.1.2 + "@radix-ui/react-primitive": 2.0.2 + "@radix-ui/react-roving-focus": 1.1.2 + "@radix-ui/react-use-controllable-state": 1.1.0 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: abfba997219743ac75840281df5577f0be154c4813588cb4bb4aac16fc8bd4bcd230170663162a805bb31bdc393adfd2ee942daa3f15484ab4f82aa210e532bb + languageName: node + linkType: hard + "@radix-ui/react-toast@npm:^1.1.5": version: 1.1.5 resolution: "@radix-ui/react-toast@npm:1.1.5" @@ -12375,6 +14014,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-use-escape-keydown@npm:1.1.0": + version: 1.1.0 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.0 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 9bf88ea272b32ea0f292afd336780a59c5646f795036b7e6105df2d224d73c54399ee5265f61d571eb545d28382491a8b02dc436e3088de8dae415d58b959b71 + languageName: node + linkType: hard + "@radix-ui/react-use-layout-effect@npm:0.1.0": version: 0.1.0 resolution: "@radix-ui/react-use-layout-effect@npm:0.1.0" @@ -12543,6 +14197,25 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-visually-hidden@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-visually-hidden@npm:1.1.2" + dependencies: + "@radix-ui/react-primitive": 2.0.2 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 87dc45ffb32b652bde629bb5c3b216adb82fd1ec68c484fec260980b31508cbc515a73327798d0f47d558dd22245b25f51bb06296b1762693af9f27e23c1cb1f + languageName: node + linkType: hard + "@radix-ui/rect@npm:1.0.1": version: 1.0.1 resolution: "@radix-ui/rect@npm:1.0.1" @@ -12642,6 +14315,13 @@ __metadata: languageName: node linkType: hard +"@repeaterjs/repeater@npm:^3.0.4, @repeaterjs/repeater@npm:^3.0.6": + version: 3.0.6 + resolution: "@repeaterjs/repeater@npm:3.0.6" + checksum: aae878b953162bec77c94b45f2236ddfc01a65308267c7cb30220fa2f8511654a302c0d32aad228c58241d685607d7bb35b6d528b2879355e6636ff08fddb266 + languageName: node + linkType: hard + "@replexica/sdk@npm:^0.7.0": version: 0.7.2 resolution: "@replexica/sdk@npm:0.7.2" @@ -12674,6 +14354,13 @@ __metadata: languageName: node linkType: hard +"@resvg/resvg-wasm@npm:2.6.0": + version: 2.6.0 + resolution: "@resvg/resvg-wasm@npm:2.6.0" + checksum: 730ababcab7d11be84129ab68aa9b86bb393b820b5a0a223fb53232462c33bc777eb875170691f54cd5d29c6aa36498f5b7dcd7fca000b56818e3e312be01804 + languageName: node + linkType: hard + "@rollup/plugin-commonjs@npm:24.0.0": version: 24.0.0 resolution: "@rollup/plugin-commonjs@npm:24.0.0" @@ -13818,6 +15505,29 @@ __metadata: languageName: node linkType: hard +"@sideway/address@npm:^4.1.5": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" + dependencies: + "@hapi/hoek": ^9.0.0 + checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d + languageName: node + linkType: hard + +"@sideway/formula@npm:^3.0.1": + version: 3.0.1 + resolution: "@sideway/formula@npm:3.0.1" + checksum: e4beeebc9dbe2ff4ef0def15cec0165e00d1612e3d7cea0bc9ce5175c3263fc2c818b679bd558957f49400ee7be9d4e5ac90487e1625b4932e15c4aa7919c57a + languageName: node + linkType: hard + +"@sideway/pinpoint@npm:^2.0.0": + version: 2.0.0 + resolution: "@sideway/pinpoint@npm:2.0.0" + checksum: 0f4491e5897fcf5bf02c46f5c359c56a314e90ba243f42f0c100437935daa2488f20482f0f77186bd6bf43345095a95d8143ecf8b1f4d876a7bc0806aba9c3d2 + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.25.16": version: 0.25.24 resolution: "@sinclair/typebox@npm:0.25.24" @@ -13832,7 +15542,7 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^4": +"@sindresorhus/is@npm:^4, @sindresorhus/is@npm:^4.0.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 @@ -14365,13 +16075,27 @@ __metadata: languageName: node linkType: hard -"@stablelib/base64@npm:^1.0.0": +"@stablelib/base64@npm:^1.0.0, @stablelib/base64@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/base64@npm:1.0.1" checksum: 3ef4466d1d6889ac3fc67407bc21aa079953981c322eeca3b29f426d05506c63011faab1bfc042d7406e0677a94de6c9d2db2ce079afdd1eccae90031bfb5859 languageName: node linkType: hard +"@stablelib/hex@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hex@npm:1.0.1" + checksum: 557f1c5d6b42963deee7627d4be1ae3542607851c5561e9419c42682d09562ebd3a06e2d92e088c52213a71ed121ec38221abfc5acd9e65707a77ecee3c96915 + languageName: node + linkType: hard + +"@stablelib/utf8@npm:^1.0.1": + version: 1.0.2 + resolution: "@stablelib/utf8@npm:1.0.2" + checksum: 3ab01baa4eb36eece44a310bf6b2e4313e8d585fc04dbcf8a5dc2d239f06071f34038b85aad6fbd98e9969f0b3b0584fcb541fe5e512c8f0cc0982b9fe1290a3 + languageName: node + linkType: hard + "@storybook/addon-actions@npm:7.6.3, @storybook/addon-actions@npm:^7.6.3": version: 7.6.3 resolution: "@storybook/addon-actions@npm:7.6.3" @@ -15530,6 +17254,16 @@ __metadata: languageName: node linkType: hard +"@swc/helpers@npm:0.5.5": + version: 0.5.5 + resolution: "@swc/helpers@npm:0.5.5" + dependencies: + "@swc/counter": ^0.1.3 + tslib: ^2.4.0 + checksum: d4f207b191e54b29460804ddf2984ba6ece1d679a0b2f6a9c765dcf27bba92c5769e7965668a4546fb9f1021eaf0ff9be4bf5c235ce12adcd65acdfe77187d11 + languageName: node + linkType: hard + "@swc/types@npm:^0.1.5": version: 0.1.5 resolution: "@swc/types@npm:0.1.5" @@ -15546,6 +17280,15 @@ __metadata: languageName: node linkType: hard +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: ^2.0.0 + checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -15588,6 +17331,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/query-core@npm:4.36.1": + version: 4.36.1 + resolution: "@tanstack/query-core@npm:4.36.1" + checksum: 47672094da20d89402d9fe03bb7b0462be73a76ff9ca715169738bc600a719d064d106d083a8eedae22a2c22de22f87d5eb5d31ef447aba771d9190f2117ed10 + languageName: node + linkType: hard + "@tanstack/query-core@npm:5.17.19": version: 5.17.19 resolution: "@tanstack/query-core@npm:5.17.19" @@ -15595,6 +17345,25 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-query@npm:^4.3.9": + version: 4.36.1 + resolution: "@tanstack/react-query@npm:4.36.1" + dependencies: + "@tanstack/query-core": 4.36.1 + use-sync-external-store: ^1.2.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: "*" + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 1aff0a476859386f8d32253fa0d0bde7b81769a6d4d4d9cbd78778f0f955459a3bdb7ee27a0d2ee7373090f12998b45df80db0b5b313bd0a7a39d36c6e8e51c5 + languageName: node + linkType: hard + "@tanstack/react-query@npm:^5.17.15": version: 5.17.19 resolution: "@tanstack/react-query@npm:5.17.19" @@ -15618,6 +17387,18 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-virtual@npm:^3.0.0-beta.60": + version: 3.13.0 + resolution: "@tanstack/react-virtual@npm:3.13.0" + dependencies: + "@tanstack/virtual-core": 3.13.0 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 0cc6fcc63d68af698d79b455fa6a44115ee3abfb41bd2a52fc96094cb4760743989e593871b3b872021f966c7ecc90eb45e85ccfc70446fff44ce8e6296cc76f + languageName: node + linkType: hard + "@tanstack/react-virtual@npm:^3.10.9": version: 3.10.9 resolution: "@tanstack/react-virtual@npm:3.10.9" @@ -15644,6 +17425,13 @@ __metadata: languageName: node linkType: hard +"@tanstack/virtual-core@npm:3.13.0": + version: 3.13.0 + resolution: "@tanstack/virtual-core@npm:3.13.0" + checksum: 0cbead3350002bea1f8353e091d3d8d3d9ba7815f4a0eb359bc927b7b7f39c9530c1dfa15f8d75fe5f47621c8f55be57643133b8fe728af09f7ea0578016f78d + languageName: node + linkType: hard + "@tediousjs/connection-string@npm:^0.5.0": version: 0.5.0 resolution: "@tediousjs/connection-string@npm:0.5.0" @@ -15839,6 +17627,15 @@ __metadata: languageName: node linkType: hard +"@trpc/client@npm:^10.0.0": + version: 10.45.2 + resolution: "@trpc/client@npm:10.45.2" + peerDependencies: + "@trpc/server": 10.45.2 + checksum: d1eaa8e0059a371265065dafb48372be8456bc5bbc68f63c92401b12258cf15efb3f9f3790ef18ec6a0b7b73daa362bbd371f98db67c0610f2aee284f12cf09a + languageName: node + linkType: hard + "@trpc/next@npm:11.0.0-next-beta.222": version: 11.0.0-next-beta.222 resolution: "@trpc/next@npm:11.0.0-next-beta.222" @@ -15879,6 +17676,13 @@ __metadata: languageName: node linkType: hard +"@trpc/server@npm:^10.0.0": + version: 10.45.2 + resolution: "@trpc/server@npm:10.45.2" + checksum: 30b92853c45747a376bbbd5c4eef71fea17a2b22e83ba7e694fb13cc99b15d1f24a17aa9124346074618fb5cee8d13434aa16cdf24af82f5e8acabdecfee0ca2 + languageName: node + linkType: hard + "@tryvital/vital-node@npm:^1.4.6": version: 1.4.6 resolution: "@tryvital/vital-node@npm:1.4.6" @@ -15932,6 +17736,25 @@ __metadata: languageName: node linkType: hard +"@typeform/embed-react@npm:^1.2.4": + version: 1.21.0 + resolution: "@typeform/embed-react@npm:1.21.0" + dependencies: + "@typeform/embed": 1.38.0 + fast-deep-equal: ^3.1.3 + peerDependencies: + react: ">=16.8.0" + checksum: 1d91cb797dfe7b27e08798f7a571f34724a8f56bf9c89a8ed2a454820efce2de4db44fd4a18f446573784c28f79478f269c1719500e1b332e7ea34ea77ffa185 + languageName: node + linkType: hard + +"@typeform/embed@npm:1.38.0": + version: 1.38.0 + resolution: "@typeform/embed@npm:1.38.0" + checksum: 41115134e5cee28f5e031181b4525c7885d23707699cf183921110262717c7544bfd101428267410b812914c235687783e373ce98e37bdc447d72f8177663597 + languageName: node + linkType: hard + "@types/accept-language-parser@npm:1.5.2": version: 1.5.2 resolution: "@types/accept-language-parser@npm:1.5.2" @@ -16043,6 +17866,18 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "*" + "@types/keyv": ^3.1.4 + "@types/node": "*" + "@types/responselike": ^1.0.0 + checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 + languageName: node + linkType: hard + "@types/cli-progress@npm:^3.11.0": version: 3.11.4 resolution: "@types/cli-progress@npm:3.11.4" @@ -16215,6 +18050,13 @@ __metadata: languageName: node linkType: hard +"@types/debounce@npm:^1.2.1": + version: 1.2.4 + resolution: "@types/debounce@npm:1.2.4" + checksum: decef3eee65d681556d50f7fac346f1b33134f6b21f806d41326f9dfb362fa66b0282ff0640ae6791b690694c9dc3dad4e146e909e707e6f96650f3aa325b9da + languageName: node + linkType: hard + "@types/debug@npm:4.1.7": version: 4.1.7 resolution: "@types/debug@npm:4.1.7" @@ -16242,6 +18084,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.0.0": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "*" + checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 + languageName: node + linkType: hard + "@types/detect-port@npm:^1.3.0": version: 1.3.5 resolution: "@types/detect-port@npm:1.3.5" @@ -16320,6 +18171,15 @@ __metadata: languageName: node linkType: hard +"@types/estree-jsx@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree-jsx@npm:1.0.5" + dependencies: + "@types/estree": "*" + checksum: a028ab0cd7b2950168a05c6a86026eb3a36a54a4adfae57f13911d7b49dffe573d9c2b28421b2d029b49b3d02fcd686611be2622dc3dad6d9791166c083f6008 + languageName: node + linkType: hard + "@types/estree@npm:*, @types/estree@npm:^0.0.51": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" @@ -16431,6 +18291,13 @@ __metadata: languageName: node linkType: hard +"@types/gensync@npm:^1.0.0": + version: 1.0.4 + resolution: "@types/gensync@npm:1.0.4" + checksum: 99c3aa0d3f1198973c7e51bea5947b815f3338ce89ce09a39ac8abb41cd844c5b95189da254ea45e50a395fe25fd215664d8ca76c5438814963597afb01f686e + languageName: node + linkType: hard + "@types/glidejs__glide@npm:^3.4.2": version: 3.4.2 resolution: "@types/glidejs__glide@npm:3.4.2" @@ -16447,6 +18314,13 @@ __metadata: languageName: node linkType: hard +"@types/gtag.js@npm:^0.0.10": + version: 0.0.10 + resolution: "@types/gtag.js@npm:0.0.10" + checksum: 5c18ffdc64418887763ec1a564e73c9fbf222ff3eece1fbc35a182fdd884e7884bb7708f67e6e4939f157bb9f2cb7a4aff42be7834527e35c5aac4f98783164c + languageName: node + linkType: hard + "@types/hast@npm:^2.0.0": version: 2.3.4 resolution: "@types/hast@npm:2.3.4" @@ -16456,6 +18330,15 @@ __metadata: languageName: node linkType: hard +"@types/hast@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "*" + checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 + languageName: node + linkType: hard + "@types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1": version: 3.3.1 resolution: "@types/hoist-non-react-statics@npm:3.3.1" @@ -16480,7 +18363,7 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:^4.0.2": +"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2": version: 4.0.4 resolution: "@types/http-cache-semantics@npm:4.0.4" checksum: 7f4dd832e618bc1e271be49717d7b4066d77c2d4eed5b81198eb987e532bb3e1c7e02f45d77918185bad936f884b700c10cebe06305f50400f382ab75055f9e8 @@ -16571,6 +18454,13 @@ __metadata: languageName: node linkType: hard +"@types/js-yaml@npm:^4.0.0": + version: 4.0.9 + resolution: "@types/js-yaml@npm:4.0.9" + checksum: e5e5e49b5789a29fdb1f7d204f82de11cb9e8f6cb24ab064c616da5d6e1b3ccfbf95aa5d1498a9fbd3b9e745564e69b4a20b6c530b5a8bbb2d4eb830cda9bc69 + languageName: node + linkType: hard + "@types/jsdom@npm:^21.1.3": version: 21.1.4 resolution: "@types/jsdom@npm:21.1.4" @@ -16646,6 +18536,15 @@ __metadata: languageName: node linkType: hard +"@types/keyv@npm:^3.1.4": + version: 3.1.4 + resolution: "@types/keyv@npm:3.1.4" + dependencies: + "@types/node": "*" + checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d + languageName: node + linkType: hard + "@types/koa-compose@npm:*": version: 3.2.8 resolution: "@types/koa-compose@npm:3.2.8" @@ -16741,6 +18640,24 @@ __metadata: languageName: node linkType: hard +"@types/mdast@npm:^3.0.0": + version: 3.0.15 + resolution: "@types/mdast@npm:3.0.15" + dependencies: + "@types/unist": ^2 + checksum: af85042a4e3af3f879bde4059fa9e76c71cb552dffc896cdcc6cf9dc1fd38e37035c2dbd6245cfa6535b433f1f0478f5549696234ccace47a64055a10c656530 + languageName: node + linkType: hard + +"@types/mdast@npm:^4.0.0": + version: 4.0.4 + resolution: "@types/mdast@npm:4.0.4" + dependencies: + "@types/unist": "*" + checksum: 20c4e9574cc409db662a35cba52b068b91eb696b3049e94321219d47d34c8ccc99a142be5c76c80a538b612457b03586bc2f6b727a3e9e7530f4c8568f6282ee + languageName: node + linkType: hard + "@types/mdurl@npm:*": version: 1.0.2 resolution: "@types/mdurl@npm:1.0.2" @@ -16748,6 +18665,13 @@ __metadata: languageName: node linkType: hard +"@types/mdurl@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/mdurl@npm:1.0.5" + checksum: e8e872e8da8f517a9c748b06cec61c947cb73fd3069e8aeb0926670ec5dfac5d30549b3d0f1634950401633e812f9b7263f2d5dbe7e98fce12bcb2c659aa4b21 + languageName: node + linkType: hard + "@types/mdx@npm:^2.0.0": version: 2.0.10 resolution: "@types/mdx@npm:2.0.10" @@ -16887,6 +18811,13 @@ __metadata: languageName: node linkType: hard +"@types/parse5@npm:^6.0.0": + version: 6.0.3 + resolution: "@types/parse5@npm:6.0.3" + checksum: ddb59ee4144af5dfcc508a8dcf32f37879d11e12559561e65788756b95b33e6f03ea027d88e1f5408f9b7bfb656bf630ace31a2169edf44151daaf8dd58df1b7 + languageName: node + linkType: hard + "@types/passport-jwt@npm:^3.0.13": version: 3.0.13 resolution: "@types/passport-jwt@npm:3.0.13" @@ -17023,6 +18954,13 @@ __metadata: languageName: node linkType: hard +"@types/react-gtm-module@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/react-gtm-module@npm:2.0.4" + checksum: 635699a2d85f958ba92126cda851f9a1b46df75d3846bdc89ce2345524f73d889a266110d00492f6c23e9e42e70ec2246449a93c9cc2c6367bd643a7d2f0e88a + languageName: node + linkType: hard + "@types/react-phone-number-input@npm:^3.0.14": version: 3.0.14 resolution: "@types/react-phone-number-input@npm:3.0.14" @@ -17085,6 +19023,15 @@ __metadata: languageName: node linkType: hard +"@types/responselike@npm:^1.0.0": + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" + dependencies: + "@types/node": "*" + checksum: 6ac4b35723429b11b117e813c7acc42c3af8b5554caaf1fc750404c1ae59f9b7376bc69b9e9e194a5a97357a597c2228b7173d317320f0360d617b6425212f58 + languageName: node + linkType: hard + "@types/retry@npm:0.12.0": version: 0.12.0 resolution: "@types/retry@npm:0.12.0" @@ -17282,6 +19229,20 @@ __metadata: languageName: node linkType: hard +"@types/unist@npm:^2": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e + languageName: node + linkType: hard + +"@types/unist@npm:^3.0.0": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 96e6453da9e075aaef1dc22482463898198acdc1eeb99b465e65e34303e2ec1e3b1ed4469a9118275ec284dc98019f63c3f5d49422f0e4ac707e5ab90fb3b71a + languageName: node + linkType: hard + "@types/uuid@npm:8.3.1": version: 8.3.1 resolution: "@types/uuid@npm:8.3.1" @@ -17328,6 +19289,24 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^8.0.0": + version: 8.5.14 + resolution: "@types/ws@npm:8.5.14" + dependencies: + "@types/node": "*" + checksum: b63d25146a0d2ebb9cb35e4b68c5a01d81b8f4657d62b0a0d9470df6a357798349a44064b2f84b8f98a553ba84d9a5ee302d3053feef02c7771010c55d290ca6 + languageName: node + linkType: hard + +"@types/xml2js@npm:^0.4.11": + version: 0.4.14 + resolution: "@types/xml2js@npm:0.4.14" + dependencies: + "@types/node": "*" + checksum: df9f106b9953dcdec7ba3304ebc56d6c2f61d49bf556d600bed439f94a1733f73ca0bf2d0f64330b402191622862d9d6058bab9d7e3dcb5b0fe51ebdc4372aac + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.0 resolution: "@types/yargs-parser@npm:21.0.0" @@ -17642,6 +19621,13 @@ __metadata: languageName: node linkType: hard +"@ungap/structured-clone@npm:^1.0.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 64ed518f49c2b31f5b50f8570a1e37bde3b62f2460042c50f132430b2d869c4a6586f13aa33a58a4722715b8158c68cae2827389d6752ac54da2893c83e480fc + languageName: node + linkType: hard + "@unkey/api@npm:^0.19.4": version: 0.19.4 resolution: "@unkey/api@npm:0.19.4" @@ -17679,6 +19665,15 @@ __metadata: languageName: node linkType: hard +"@vercel/analytics@npm:^0.1.6": + version: 0.1.11 + resolution: "@vercel/analytics@npm:0.1.11" + peerDependencies: + react: ^16.8||^17||^18 + checksum: 05b8180ac6e23ebe7c09d74c43f8ee78c408cd0b6546e676389cbf4fba44dfeeae3648c9b52e2421be64fe3aeee8b026e6ea4bdfc0589fb5780670f2b090a167 + languageName: node + linkType: hard + "@vercel/edge-config@npm:^0.1.1": version: 0.1.1 resolution: "@vercel/edge-config@npm:0.1.1" @@ -17712,6 +19707,17 @@ __metadata: languageName: node linkType: hard +"@vercel/og@npm:^0.5.0": + version: 0.5.20 + resolution: "@vercel/og@npm:0.5.20" + dependencies: + "@resvg/resvg-wasm": 2.6.0 + satori: 0.10.9 + yoga-wasm-web: 0.3.3 + checksum: b6e08f3a9b2a0ef7c2cfe074d7e2699e7d4b1ab78cab370846ebea92dcb1becfcfef50309e1f905c1c37f37a64484fc789b0a364a5ce9496b8b4ab25048e7aaa + languageName: node + linkType: hard + "@vercel/og@npm:^0.6.3": version: 0.6.3 resolution: "@vercel/og@npm:0.6.3" @@ -18193,6 +20199,52 @@ __metadata: languageName: node linkType: hard +"@whatwg-node/disposablestack@npm:^0.0.5": + version: 0.0.5 + resolution: "@whatwg-node/disposablestack@npm:0.0.5" + dependencies: + tslib: ^2.6.3 + checksum: d2df8ba46c567c3cc07767821fcedc8f4c9247f1f5488c7dadc42f86ca6429bace4451e48506ac2de15afe8e5baa1cd0951a7aa6419f091d48c671844e399931 + languageName: node + linkType: hard + +"@whatwg-node/fetch@npm:^0.10.0, @whatwg-node/fetch@npm:^0.10.1": + version: 0.10.3 + resolution: "@whatwg-node/fetch@npm:0.10.3" + dependencies: + "@whatwg-node/node-fetch": ^0.7.7 + urlpattern-polyfill: ^10.0.0 + checksum: 9fb7072cb048d1b747dfb6cf9b9a4e5240071bd290095b0b5552644b68626fa7116c76817462c74461dc0e0c57eb6bd2ba73e2dafa5f1d8d178e0366bea75bbb + languageName: node + linkType: hard + +"@whatwg-node/fetch@npm:^0.5.3": + version: 0.5.4 + resolution: "@whatwg-node/fetch@npm:0.5.4" + dependencies: + "@peculiar/webcrypto": ^1.4.0 + abort-controller: ^3.0.0 + busboy: ^1.6.0 + form-data-encoder: ^1.7.1 + formdata-node: ^4.3.1 + node-fetch: ^2.6.7 + undici: ^5.12.0 + web-streams-polyfill: ^3.2.0 + checksum: 6fb6c6a582cb78fc438beee11f1d931eabc0ac8b5b660b68ea30a42c2068f4d3126d2b07e21770a4d6f391e70979bae527ca892898da9857e73dc3cc7adb8da9 + languageName: node + linkType: hard + +"@whatwg-node/node-fetch@npm:^0.7.7": + version: 0.7.9 + resolution: "@whatwg-node/node-fetch@npm:0.7.9" + dependencies: + "@whatwg-node/disposablestack": ^0.0.5 + busboy: ^1.6.0 + tslib: ^2.6.3 + checksum: e7b6e5300eb522bc365c90e92a7aed33aa7197dd41d102302db83b819d3c62eedcd4d802cf0cf7a9998acf7465430afea5ad23bb6391ccc9609532a19dedb436 + languageName: node + linkType: hard + "@wojtekmaj/date-utils@npm:^1.0.2, @wojtekmaj/date-utils@npm:^1.0.3": version: 1.0.3 resolution: "@wojtekmaj/date-utils@npm:1.0.3" @@ -18968,6 +21020,13 @@ __metadata: languageName: node linkType: hard +"array-flatten@npm:^3.0.0": + version: 3.0.0 + resolution: "array-flatten@npm:3.0.0" + checksum: ad00c51ca70cf837501fb6da823ba39bc6a86b43d0b76d840daa02fe0f8e68e94ad5bc2d0d038053118b879aaca8ea6168c32c7387a2fa5b118ad28db4f1f863 + languageName: node + linkType: hard + "array-includes@npm:^3.1.4": version: 3.1.4 resolution: "array-includes@npm:3.1.4" @@ -19269,6 +21328,17 @@ __metadata: languageName: node linkType: hard +"asn1js@npm:^3.0.5": + version: 3.0.5 + resolution: "asn1js@npm:3.0.5" + dependencies: + pvtsutils: ^1.3.2 + pvutils: ^1.1.3 + tslib: ^2.4.0 + checksum: 3b6af1bbadd5762ef8ead5daf2f6bda1bc9e23bc825c4dcc996aa1f9521ad7390a64028565d95d98090d69c8431f004c71cccb866004759169d7c203cf9075eb + languageName: node + linkType: hard + "assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": version: 1.0.0 resolution: "assert-plus@npm:1.0.0" @@ -19360,6 +21430,13 @@ __metadata: languageName: node linkType: hard +"async-scheduler@npm:^1.4.4": + version: 1.4.4 + resolution: "async-scheduler@npm:1.4.4" + checksum: 080310e642bc4309aa83d625b21f9f0f1291bd0a292361cf6c0ebc86646ca719888bebc3d519f8ed177130b623b0f20640dad7f24fd8c2ede31d6d6f976968a4 + languageName: node + linkType: hard + "async@npm:^3.2.3, async@npm:^3.2.4": version: 3.2.4 resolution: "async@npm:3.2.4" @@ -19412,7 +21489,7 @@ __metadata: languageName: node linkType: hard -"auto-bind@npm:4.0.0": +"auto-bind@npm:4.0.0, auto-bind@npm:~4.0.0": version: 4.0.0 resolution: "auto-bind@npm:4.0.0" checksum: 00cad71cce5742faccb7dd65c1b55ebc4f45add4b0c9a1547b10b05bab22813230133b0c892c67ba3eb969a4524710c5e43cc45c72898ec84e56f3a596e7a04f @@ -19596,6 +21673,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:^1.6.1": + version: 1.7.9 + resolution: "axios@npm:1.7.9" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: cb8ce291818effda09240cb60f114d5625909b345e10f389a945320e06acf0bc949d0f8422d25720f5dd421362abee302c99f5e97edec4c156c8939814b23d19 + languageName: node + linkType: hard + "axios@npm:^1.6.7": version: 1.6.8 resolution: "axios@npm:1.6.8" @@ -19808,6 +21896,23 @@ __metadata: languageName: node linkType: hard +"babel-runtime@npm:^6.11.6": + version: 6.26.0 + resolution: "babel-runtime@npm:6.26.0" + dependencies: + core-js: ^2.4.0 + regenerator-runtime: ^0.11.0 + checksum: 8aeade94665e67a73c1ccc10f6fd42ba0c689b980032b70929de7a6d9a12eb87ef51902733f8fefede35afea7a5c3ef7e916a64d503446c1eedc9e3284bd3d50 + languageName: node + linkType: hard + +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -20124,6 +22229,15 @@ __metadata: languageName: node linkType: hard +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 + languageName: node + linkType: hard + "breakword@npm:^1.0.5": version: 1.0.5 resolution: "breakword@npm:1.0.5" @@ -20305,6 +22419,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.24.0": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" + dependencies: + caniuse-lite: ^1.0.30001688 + electron-to-chromium: ^1.5.73 + node-releases: ^2.0.19 + update-browserslist-db: ^1.1.1 + bin: + browserslist: cli.js + checksum: 64074bf6cf0a9ae3094d753270e3eae9cf925149db45d646f0bc67bacc2e46d7ded64a4e835b95f5fdcf0350f63a83c3755b32f80831f643a47f0886deb8a065 + languageName: node + linkType: hard + "bs-logger@npm:0.x": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" @@ -20453,7 +22581,7 @@ __metadata: languageName: node linkType: hard -"busboy@npm:1.6.0, busboy@npm:^1.0.0": +"busboy@npm:1.6.0, busboy@npm:^1.0.0, busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" dependencies: @@ -20558,6 +22686,13 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d + languageName: node + linkType: hard + "cacheable-lookup@npm:^7.0.0": version: 7.0.0 resolution: "cacheable-lookup@npm:7.0.0" @@ -20580,6 +22715,21 @@ __metadata: languageName: node linkType: hard +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: ^1.0.2 + get-stream: ^5.1.0 + http-cache-semantics: ^4.0.0 + keyv: ^4.0.0 + lowercase-keys: ^2.0.0 + normalize-url: ^6.0.1 + responselike: ^2.0.0 + checksum: 0de9df773fd4e7dd9bd118959878f8f2163867e2e1ab3575ffbecbe6e75e80513dd0c68ba30005e5e5a7b377cc6162bbc00ab1db019bb4e9cb3c2f3f7a6f1ee4 + languageName: node + linkType: hard + "calcom-monorepo@workspace:.": version: 0.0.0-use.local resolution: "calcom-monorepo@workspace:." @@ -20681,6 +22831,16 @@ __metadata: languageName: node linkType: hard +"camel-case@npm:^3.0.0": + version: 3.0.0 + resolution: "camel-case@npm:3.0.0" + dependencies: + no-case: ^2.2.0 + upper-case: ^1.1.1 + checksum: 4190ed6ab8acf4f3f6e1a78ad4d0f3f15ce717b6bfa1b5686d58e4bcd29960f6e312dd746b5fa259c6d452f1413caef25aee2e10c9b9a580ac83e516533a961a + languageName: node + linkType: hard + "camel-case@npm:^4.1.2": version: 4.1.2 resolution: "camel-case@npm:4.1.2" @@ -20709,6 +22869,13 @@ __metadata: languageName: node linkType: hard +"camelcase@npm:^3.0.0": + version: 3.0.0 + resolution: "camelcase@npm:3.0.0" + checksum: ae4fe1c17c8442a3a345a6b7d2393f028ab7a7601af0c352ad15d1ab97ca75112e19e29c942b2a214898e160194829b68923bce30e018d62149c6d84187f1673 + languageName: node + linkType: hard + "camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -20765,6 +22932,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001579": + version: 1.0.30001700 + resolution: "caniuse-lite@npm:1.0.30001700" + checksum: 0e5e1c8648efeae1a2bcf371c872a4e41d9508d58b47133558f78b99c3d58c4b6ce7688068ea872deffbfc7c3c2a117e756fc48e1de7ae6c5540f3c3a4441c7a + languageName: node + linkType: hard + "caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001591": version: 1.0.30001597 resolution: "caniuse-lite@npm:1.0.30001597" @@ -20779,6 +22953,24 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001699 + resolution: "caniuse-lite@npm:1.0.30001699" + checksum: 697172065537b0f33c428fe8561f4cba6796428dc8e3e56f78eee28404edfcbea70d48bb109ab6c6536de6da90e331058a2cb8ef3a15c58b2226c96ee558bc07 + languageName: node + linkType: hard + +"capital-case@npm:^1.0.4": + version: 1.0.4 + resolution: "capital-case@npm:1.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case-first: ^2.0.2 + checksum: 41fa8fa87f6d24d0835a2b4a9341a3eaecb64ac29cd7c5391f35d6175a0fa98ab044e7f2602e1ec3afc886231462ed71b5b80c590b8b41af903ec2c15e5c5931 + languageName: node + linkType: hard + "cardinal@npm:^2.1.1": version: 2.1.1 resolution: "cardinal@npm:2.1.1" @@ -20805,6 +22997,13 @@ __metadata: languageName: node linkType: hard +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 + languageName: node + linkType: hard + "chai@npm:^5.1.1": version: 5.1.1 resolution: "chai@npm:5.1.1" @@ -20892,6 +23091,24 @@ __metadata: languageName: node linkType: hard +"change-case-all@npm:1.0.15": + version: 1.0.15 + resolution: "change-case-all@npm:1.0.15" + 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 + checksum: e1dabdcd8447a3690f3faf15f92979dfbc113109b50916976e1d5e518e6cfdebee4f05f54d0ca24fb79a4bf835185b59ae25e967bb3dc10bd236a775b19ecc52 + languageName: node + linkType: hard + "change-case@npm:^2.3.0": version: 2.3.1 resolution: "change-case@npm:2.3.1" @@ -20916,6 +23133,52 @@ __metadata: languageName: node linkType: hard +"change-case@npm:^3.0.0": + version: 3.1.0 + resolution: "change-case@npm:3.1.0" + dependencies: + camel-case: ^3.0.0 + constant-case: ^2.0.0 + dot-case: ^2.1.0 + header-case: ^1.0.0 + is-lower-case: ^1.1.0 + is-upper-case: ^1.1.0 + lower-case: ^1.1.1 + lower-case-first: ^1.0.0 + no-case: ^2.3.2 + param-case: ^2.1.0 + pascal-case: ^2.0.0 + path-case: ^2.1.0 + sentence-case: ^2.1.0 + snake-case: ^2.1.0 + swap-case: ^1.1.0 + title-case: ^2.1.0 + upper-case: ^1.1.1 + upper-case-first: ^1.1.0 + checksum: d6f9f90a5f1d2a98294e06ea62f913fa0d7cfc289f188bf05662344da6128f5710b5c99ece83682c6a848db8d996b7348e09b2235dc3363afb6ae7142e7978e1 + languageName: node + linkType: hard + +"change-case@npm:^4.1.2": + version: 4.1.2 + resolution: "change-case@npm:4.1.2" + 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 + checksum: e4bc4a093a1f7cce8b33896665cf9e456e3bc3cc0def2ad7691b1994cfca99b3188d0a513b16855b01a6bd20692fcde12a7d4d87a5615c4c515bbbf0e651f116 + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -20923,6 +23186,13 @@ __metadata: languageName: node linkType: hard +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d + languageName: node + linkType: hard + "character-entities-legacy@npm:^1.0.0": version: 1.1.4 resolution: "character-entities-legacy@npm:1.1.4" @@ -20930,6 +23200,13 @@ __metadata: languageName: node linkType: hard +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 + languageName: node + linkType: hard + "character-entities@npm:^1.0.0": version: 1.2.4 resolution: "character-entities@npm:1.2.4" @@ -20937,6 +23214,13 @@ __metadata: languageName: node linkType: hard +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: cf1643814023697f725e47328fcec17923b8f1799102a8a79c1514e894815651794a2bffd84bb1b3a4b124b050154e4529ed6e81f7c8068a734aecf07a6d3def + languageName: node + linkType: hard + "character-reference-invalid@npm:^1.0.0": version: 1.1.4 resolution: "character-reference-invalid@npm:1.1.4" @@ -20944,6 +23228,13 @@ __metadata: languageName: node linkType: hard +"character-reference-invalid@npm:^2.0.0": + version: 2.0.1 + resolution: "character-reference-invalid@npm:2.0.1" + checksum: 98d3b1a52ae510b7329e6ee7f6210df14f1e318c5415975d4c9e7ee0ef4c07875d47c6e74230c64551f12f556b4a8ccc24d9f3691a2aa197019e72a95e9297ee + languageName: node + linkType: hard + "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -20958,6 +23249,13 @@ __metadata: languageName: node linkType: hard +"chart.js@npm:^3.7.1": + version: 3.9.1 + resolution: "chart.js@npm:3.9.1" + checksum: 9ab0c0ac01215af0b3f020f2e313030fd6e347b48ed17d5484ee9c4e8ead45e78ae71bea16c397621c386b409ce0b14bf17f9f6c2492cd15b56c0f433efdfff6 + languageName: node + linkType: hard + "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -21361,13 +23659,24 @@ __metadata: languageName: node linkType: hard -"client-only@npm:0.0.1": +"client-only@npm:0.0.1, client-only@npm:^0.0.1": version: 0.0.1 resolution: "client-only@npm:0.0.1" checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 languageName: node linkType: hard +"cliui@npm:^3.2.0": + version: 3.2.0 + resolution: "cliui@npm:3.2.0" + dependencies: + string-width: ^1.0.1 + strip-ansi: ^3.0.1 + wrap-ansi: ^2.0.0 + checksum: c68d1dbc3e347bfe79ed19cc7f48007d5edd6cd8438342e32073e0b4e311e3c44e1f4f19221462bc6590de56c2df520e427533a9dde95dee25710bec322746ad + languageName: node + linkType: hard + "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -21412,6 +23721,15 @@ __metadata: languageName: node linkType: hard +"clone-response@npm:^1.0.2": + version: 1.0.3 + resolution: "clone-response@npm:1.0.3" + dependencies: + mimic-response: ^1.0.0 + checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e + languageName: node + linkType: hard + "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" @@ -21440,6 +23758,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:^1.2.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 + languageName: node + linkType: hard + "clsx@npm:^2.0.0": version: 2.1.0 resolution: "clsx@npm:2.1.0" @@ -21497,6 +23822,15 @@ __metadata: languageName: node linkType: hard +"cobe@npm:^0.4.1": + version: 0.4.2 + resolution: "cobe@npm:0.4.2" + dependencies: + phenomenon: ^1.6.0 + checksum: 4c11dd8cf3c6614a2ff2f6eacca5283278c6db06c2e441011aa90f58c66d045e66ef98a5e4b9d0282d58ee22f5b87d965538aa4c6064ed97f436f3e4cd9ee3ed + languageName: node + linkType: hard + "code-block-writer@npm:^11.0.0": version: 11.0.0 resolution: "code-block-writer@npm:11.0.0" @@ -21515,6 +23849,13 @@ __metadata: languageName: node linkType: hard +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 17d5666611f9b16d64fdf48176d9b7fb1c7d1c1607a189f7e600040a11a6616982876af148230336adb7d8fe728a559f743a4e29db3747e3b1a32fa7f4529681 + languageName: node + linkType: hard + "coffeescript@npm:^1.10.0": version: 1.12.7 resolution: "coffeescript@npm:1.12.7" @@ -21650,6 +23991,13 @@ __metadata: languageName: node linkType: hard +"comma-separated-tokens@npm:^2.0.0": + version: 2.0.3 + resolution: "comma-separated-tokens@npm:2.0.3" + checksum: e3bf9e0332a5c45f49b90e79bcdb4a7a85f28d6a6f0876a94f1bb9b2bfbdbbb9292aac50e1e742d8c0db1e62a0229a106f57917e2d067fca951d81737651700d + languageName: node + linkType: hard + "command-score@npm:0.1.2, command-score@npm:^0.1.2": version: 0.1.2 resolution: "command-score@npm:0.1.2" @@ -21757,6 +24105,13 @@ __metadata: languageName: node linkType: hard +"common-tags@npm:1.8.2": + version: 1.8.2 + resolution: "common-tags@npm:1.8.2" + checksum: 767a6255a84bbc47df49a60ab583053bb29a7d9687066a18500a516188a062c4e4cd52de341f22de0b07062e699b1b8fe3cfa1cb55b241cb9301aeb4f45b4dff + languageName: node + linkType: hard + "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -21852,6 +24207,26 @@ __metadata: languageName: node linkType: hard +"concurrently@npm:^7.6.0": + version: 7.6.0 + resolution: "concurrently@npm:7.6.0" + dependencies: + chalk: ^4.1.0 + date-fns: ^2.29.1 + lodash: ^4.17.21 + rxjs: ^7.0.0 + shell-quote: ^1.7.3 + spawn-command: ^0.0.2-1 + supports-color: ^8.1.0 + tree-kill: ^1.2.2 + yargs: ^17.3.1 + bin: + conc: dist/bin/concurrently.js + concurrently: dist/bin/concurrently.js + checksum: f705c9a7960f1b16559ca64958043faeeef6385c0bf30a03d1375e15ab2d96dba4f8166f1bbbb1c85e8da35ca0ce3c353875d71dff2aa132b2357bb533b3332e + languageName: node + linkType: hard + "conf@npm:10.2.0": version: 10.2.0 resolution: "conf@npm:10.2.0" @@ -21936,6 +24311,27 @@ __metadata: languageName: node linkType: hard +"constant-case@npm:^2.0.0": + version: 2.0.0 + resolution: "constant-case@npm:2.0.0" + dependencies: + snake-case: ^2.1.0 + upper-case: ^1.1.1 + checksum: 893c793a425ebcd0744061c7f12650c655aae259b89d5654fb8eda42d22c3690716a4988ed03f2abe370b1ee7bfec44f8e4395e76e2f1458a8921982b15410ba + languageName: node + linkType: hard + +"constant-case@npm:^3.0.4": + version: 3.0.4 + resolution: "constant-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case: ^2.0.2 + checksum: 6c3346d51afc28d9fae922e966c68eb77a19d94858dba230dd92d7b918b37d36db50f0311e9ecf6847e43e934b1c01406a0936973376ab17ec2c471fbcfb2cf3 + languageName: node + linkType: hard + "constants-browserify@npm:^1.0.0": version: 1.0.0 resolution: "constants-browserify@npm:1.0.0" @@ -22123,6 +24519,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:^2.4.0": + version: 2.6.12 + resolution: "core-js@npm:2.6.12" + checksum: 44fa9934a85f8c78d61e0c8b7b22436330471ffe59ec5076fe7f324d6e8cf7f824b14b1c81ca73608b13bdb0fef035bd820989bf059767ad6fa13123bb8bd016 + languageName: node + linkType: hard + "core-js@npm:^3": version: 3.21.1 resolution: "core-js@npm:3.21.1" @@ -22204,7 +24607,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.2.0": +"cosmiconfig@npm:^8.1.0, cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -22340,6 +24743,18 @@ __metadata: languageName: node linkType: hard +"cross-env@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-env@npm:7.0.3" + dependencies: + cross-spawn: ^7.0.1 + bin: + cross-env: src/bin/cross-env.js + cross-env-shell: src/bin/cross-env-shell.js + checksum: 26f2f3ea2ab32617f57effb70d329c2070d2f5630adc800985d8b30b56e8bf7f5f439dd3a0358b79cee6f930afc23cf8e23515f17ccfb30092c6b62c6b630a79 + languageName: node + linkType: hard + "cross-fetch@npm:3.1.5, cross-fetch@npm:^3.1.5": version: 3.1.5 resolution: "cross-fetch@npm:3.1.5" @@ -22358,6 +24773,15 @@ __metadata: languageName: node linkType: hard +"cross-inspect@npm:1.0.1": + version: 1.0.1 + resolution: "cross-inspect@npm:1.0.1" + dependencies: + tslib: ^2.4.0 + checksum: 7c1e02e0a9670b62416a3ea1df7ae880fdad3aa0a857de8932c4e5f8acd71298c7e3db9da8e9da603f5692cd1879938f5e72e34a9f5d1345987bef656d117fc1 + languageName: node + linkType: hard + "cross-spawn@npm:7.0.3, cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" @@ -22393,6 +24817,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^7.0.1": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b + languageName: node + linkType: hard + "crypt@npm:0.0.2": version: 0.0.2 resolution: "crypt@npm:0.0.2" @@ -22858,6 +25293,13 @@ __metadata: languageName: node linkType: hard +"dataloader@npm:^2.2.3": + version: 2.2.3 + resolution: "dataloader@npm:2.2.3" + checksum: cc272181f6cad0ea20511c0a0d270cbc1df960a3526ab24941bbeb2cb7120499a598fe2cd41b4818527367acf7bc1be0723b6e5034637db4759a396c904b78a6 + languageName: node + linkType: hard + "date-fns@npm:^2.28.0": version: 2.29.3 resolution: "date-fns@npm:2.29.3" @@ -22865,6 +25307,15 @@ __metadata: languageName: node linkType: hard +"date-fns@npm:^2.29.1": + version: 2.30.0 + resolution: "date-fns@npm:2.30.0" + dependencies: + "@babel/runtime": ^7.21.0 + checksum: f7be01523282e9bb06c0cd2693d34f245247a29098527d4420628966a2d9aad154bd0e90a6b1cf66d37adcb769cd108cf8a7bd49d76db0fb119af5cdd13644f4 + languageName: node + linkType: hard + "date-fns@npm:^3.6.0": version: 3.6.0 resolution: "date-fns@npm:3.6.0" @@ -22872,6 +25323,43 @@ __metadata: languageName: node linkType: hard +"datocms-listen@npm:^0.1.9": + version: 0.1.15 + resolution: "datocms-listen@npm:0.1.15" + dependencies: + "@0no-co/graphql.web": ^1.0.1 + checksum: 243fec6f8c07d35f8d8d206ded45c4b8cfeb22907bba23d2180af6284903e4af1146c89e08ad0f68977193d42530323c53d0d906f7cf9f1ba92490ed11386e8c + languageName: node + linkType: hard + +"datocms-structured-text-generic-html-renderer@npm:^2.0.1, datocms-structured-text-generic-html-renderer@npm:^2.1.12": + version: 2.1.12 + resolution: "datocms-structured-text-generic-html-renderer@npm:2.1.12" + dependencies: + datocms-structured-text-utils: ^2.1.12 + checksum: ef9e29b15903ce69be42faa4f4a4364bb7ba0c6565008cb2f557e8865c0806edb938a27f9bee7aa682f7af84fe89489b688b9713ea48501c139d204fea1f18c0 + languageName: node + linkType: hard + +"datocms-structured-text-to-plain-text@npm:^2.0.4": + version: 2.1.12 + resolution: "datocms-structured-text-to-plain-text@npm:2.1.12" + dependencies: + datocms-structured-text-generic-html-renderer: ^2.1.12 + datocms-structured-text-utils: ^2.1.12 + checksum: 8d436ca14379650d66257b5a2f36523e1ebaee41584caf021c863155404a292dbde7408c6cb0e0185638c2eb7508087239f862e78e8647b806ececd4e24683fd + languageName: node + linkType: hard + +"datocms-structured-text-utils@npm:^2.0.1, datocms-structured-text-utils@npm:^2.0.4, datocms-structured-text-utils@npm:^2.1.12": + version: 2.1.12 + resolution: "datocms-structured-text-utils@npm:2.1.12" + dependencies: + array-flatten: ^3.0.0 + checksum: 68d5be9cb711fb630866cca2c0e44b333b390d9672b2ea680d5870c26e8ccadcc6bd77d02a95ccbb913c160466a3046cbd934c41712f9d064f98a73009e0b97a + languageName: node + linkType: hard + "dayjs@npm:1.11.4": version: 1.11.4 resolution: "dayjs@npm:1.11.4" @@ -22919,6 +25407,13 @@ __metadata: languageName: node linkType: hard +"debounce@npm:^1.2.0, debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.0, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -22949,6 +25444,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.0.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 + languageName: node + linkType: hard + "debug@npm:^4.3.6, debug@npm:^4.3.7": version: 4.3.7 resolution: "debug@npm:4.3.7" @@ -22971,7 +25478,7 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": +"decamelize@npm:^1.1.0, decamelize@npm:^1.1.1, decamelize@npm:^1.2.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa @@ -22992,6 +25499,15 @@ __metadata: languageName: node linkType: hard +"decode-named-character-reference@npm:^1.0.0": + version: 1.0.2 + resolution: "decode-named-character-reference@npm:1.0.2" + dependencies: + character-entities: ^2.0.0 + checksum: f4c71d3b93105f20076052f9cb1523a22a9c796b8296cd35eef1ca54239c78d182c136a848b83ff8da2071e3ae2b1d300bf29d00650a6d6e675438cc31b11d78 + languageName: node + linkType: hard + "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -23117,7 +25633,7 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^2.0.1": +"defer-to-connect@npm:^2.0.0, defer-to-connect@npm:^2.0.1": version: 2.0.1 resolution: "defer-to-connect@npm:2.0.1" checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b @@ -23268,6 +25784,13 @@ __metadata: languageName: node linkType: hard +"dependency-graph@npm:^0.11.0": + version: 0.11.0 + resolution: "dependency-graph@npm:0.11.0" + checksum: 477204beaa9be69e642bc31ffe7a8c383d0cf48fa27acbc91c5df01431ab913e65c154213d2ef83d034c98d77280743ec85e5da018a97a18dd43d3c0b78b28cd + languageName: node + linkType: hard + "deprecation@npm:^2.0.0": version: 2.3.1 resolution: "deprecation@npm:2.3.1" @@ -23275,7 +25798,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.2, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0, dequal@npm:^2.0.2, dequal@npm:^2.0.3": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 @@ -23373,6 +25896,15 @@ __metadata: languageName: node linkType: hard +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": + version: 1.1.0 + resolution: "devlop@npm:1.1.0" + dependencies: + dequal: ^2.0.0 + checksum: d2ff650bac0bb6ef08c48f3ba98640bb5fec5cce81e9957eb620408d1bab1204d382a45b785c6b3314dc867bb0684936b84c6867820da6db97cbb5d3c15dd185 + languageName: node + linkType: hard + "dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -23411,6 +25943,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.0.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -23632,6 +26171,15 @@ __metadata: languageName: node linkType: hard +"dot-case@npm:^2.1.0": + version: 2.1.1 + resolution: "dot-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + checksum: 5c9d937245ff810a7ae788602e40c62e38cb515146ddf9b11c7f60cb02aae84859588761f1e8769d9e713609fae3c78dc99c8da9e0ee8e4d8b5c09a2fdf70328 + languageName: node + linkType: hard + "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -23716,6 +26264,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^10.0.0": + version: 10.0.0 + resolution: "dotenv@npm:10.0.0" + checksum: f412c5fe8c24fbe313d302d2500e247ba8a1946492db405a4de4d30dd0eb186a88a43f13c958c5a7de303938949c4231c56994f97d05c4bc1f22478d631b4005 + languageName: node + linkType: hard + "dotenv@npm:^16.0.0": version: 16.0.1 resolution: "dotenv@npm:16.0.1" @@ -23745,6 +26300,13 @@ __metadata: languageName: node linkType: hard +"dset@npm:^3.1.2, dset@npm:^3.1.4": + version: 3.1.4 + resolution: "dset@npm:3.1.4" + checksum: 9a7677e9ffd3c13ad850f7cf367aa94b39984006510e84c3c09b7b88bba0a5b3b7196d85a99d0c4cae4e47d67bdeca43dc1834a41d80f31bcdc86dd26121ecec + languageName: node + linkType: hard + "dub@npm:^0.55.1": version: 0.55.1 resolution: "dub@npm:0.55.1" @@ -23857,6 +26419,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.73": + version: 1.5.100 + resolution: "electron-to-chromium@npm:1.5.100" + checksum: 14c54ba03bbe96a7cd9e8ae4eff01e3306e8a6932e643bee2b6543a1a48f5ff7418769736d133542fbf6ec4837e113aeb9b2d8859a3420ddd950d498f7bd2b06 + languageName: node + linkType: hard + "elliptic@npm:^6.5.3": version: 6.5.4 resolution: "elliptic@npm:6.5.4" @@ -23944,7 +26513,7 @@ __metadata: languageName: node linkType: hard -"encoding@npm:0.1.13, encoding@npm:^0.1.13": +"encoding@npm:0.1.13, encoding@npm:^0.1.11, encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: @@ -24022,6 +26591,16 @@ __metadata: languageName: node linkType: hard +"enquirer@npm:^2.4.1": + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" + dependencies: + ansi-colors: ^4.1.1 + strip-ansi: ^6.0.1 + checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 + languageName: node + linkType: hard + "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -24096,7 +26675,7 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.3.1": +"error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": version: 1.3.2 resolution: "error-ex@npm:1.3.2" dependencies: @@ -24785,6 +27364,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + "escape-goat@npm:^4.0.0": version: 4.0.0 resolution: "escape-goat@npm:4.0.0" @@ -25405,6 +27991,13 @@ __metadata: languageName: node linkType: hard +"estree-util-is-identifier-name@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-is-identifier-name@npm:3.0.0" + checksum: ea3909f0188ea164af0aadeca87c087e3e5da78d76da5ae9c7954ff1340ea3e4679c4653bbf4299ffb70caa9b322218cc1128db2541f3d2976eb9704f9857787 + languageName: node + linkType: hard + "estree-walker@npm:^1.0.1": version: 1.0.1 resolution: "estree-walker@npm:1.0.1" @@ -25705,6 +28298,13 @@ __metadata: languageName: node linkType: hard +"extract-files@npm:^11.0.0": + version: 11.0.0 + resolution: "extract-files@npm:11.0.0" + checksum: 39ebd92772e9a1e30d1e3112fb7db85d353c8243640635668b615ac1d605ceb79fbb13d17829dd308993ef37bb189ad99817f79ab164ae95c9bb3df9f440bd16 + languageName: node + linkType: hard + "extract-zip@npm:^1.6.6": version: 1.7.0 resolution: "extract-zip@npm:1.7.0" @@ -25920,6 +28520,13 @@ __metadata: languageName: node linkType: hard +"fathom-client@npm:^3.5.0": + version: 3.7.2 + resolution: "fathom-client@npm:3.7.2" + checksum: 2f6859cc8e2995334b67b1e9efe3e1084e0b55cfd8832f4fd9badf37abf80d2213a5892313ec57a3dfccd7b7a62bb3949617dc8310dd7af2af0781e534398cbc + languageName: node + linkType: hard + "fault@npm:^1.0.0": version: 1.0.4 resolution: "fault@npm:1.0.4" @@ -25961,6 +28568,28 @@ __metadata: languageName: node linkType: hard +"fbjs-css-vars@npm:^1.0.0": + version: 1.0.2 + resolution: "fbjs-css-vars@npm:1.0.2" + checksum: 72baf6d22c45b75109118b4daecb6c8016d4c83c8c0f23f683f22e9d7c21f32fff6201d288df46eb561e3c7d4bb4489b8ad140b7f56444c453ba407e8bd28511 + languageName: node + linkType: hard + +"fbjs@npm:^3.0.0": + version: 3.0.5 + resolution: "fbjs@npm:3.0.5" + 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 + checksum: e609b5b64686bc96495a5c67728ed9b2710b9b3d695c5759c5f5e47c9483d1c323543ac777a86459e3694efc5712c6ce7212e944feb19752867d699568bb0e54 + languageName: node + linkType: hard + "fd-slicer@npm:~1.1.0": version: 1.1.0 resolution: "fd-slicer@npm:1.1.0" @@ -26145,6 +28774,15 @@ __metadata: languageName: node linkType: hard +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 + languageName: node + linkType: hard + "filter-obj@npm:^2.0.2": version: 2.0.2 resolution: "filter-obj@npm:2.0.2" @@ -26231,6 +28869,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^1.0.0": + version: 1.1.2 + resolution: "find-up@npm:1.1.2" + dependencies: + path-exists: ^2.0.0 + pinkie-promise: ^2.0.0 + checksum: a2cb9f4c9f06ee3a1e92ed71d5aed41ac8ae30aefa568132f6c556fac7678a5035126153b59eaec68da78ac409eef02503b2b059706bdbf232668d7245e3240a + languageName: node + linkType: hard + "find-up@npm:^2.1.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" @@ -26467,6 +29115,13 @@ __metadata: languageName: node linkType: hard +"form-data-encoder@npm:^1.7.1": + version: 1.9.0 + resolution: "form-data-encoder@npm:1.9.0" + checksum: a73f617976f91b594dbd777ec5147abdb0c52d707475130f8cefc8ae9102ccf51be154b929f7c18323729c2763ac25b16055f5034bc188834e9febeb0d971d7f + languageName: node + linkType: hard + "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -26546,6 +29201,16 @@ __metadata: languageName: node linkType: hard +"formdata-node@npm:^4.3.1": + version: 4.4.1 + resolution: "formdata-node@npm:4.4.1" + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + checksum: d91d4f667cfed74827fc281594102c0dabddd03c9f8b426fc97123eedbf73f5060ee43205d89284d6854e2fc5827e030cd352ef68b93beda8decc2d72128c576 + languageName: node + linkType: hard + "formdata-polyfill@npm:^4.0.10": version: 4.0.10 resolution: "formdata-polyfill@npm:4.0.10" @@ -26688,7 +29353,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^8.1.0": +"fs-extra@npm:^8.0.1, fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" dependencies: @@ -26954,6 +29619,13 @@ __metadata: languageName: node linkType: hard +"get-caller-file@npm:^1.0.1": + version: 1.0.3 + resolution: "get-caller-file@npm:1.0.3" + checksum: 2b90a7f848896abcebcdc0acc627a435bcf05b9cd280599bc980ebfcdc222416c3df12c24c4845f69adc4346728e8966f70b758f9369f3534182791dfbc25c05 + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -27057,6 +29729,15 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^5.1.0": + version: 5.2.0 + resolution: "get-stream@npm:5.2.0" + dependencies: + pump: ^3.0.0 + checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 + languageName: node + linkType: hard + "get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -27192,6 +29873,13 @@ __metadata: languageName: node linkType: hard +"github-buttons@npm:^2.22.0": + version: 2.29.1 + resolution: "github-buttons@npm:2.29.1" + checksum: adde1324247df85730e0056206d751894c02ce8dcad5e96234bbc9f2f15caaa12a6431608b7e04434e29df83b6900f4fc36d2d4581605f435d97dc29dcfd1a42 + languageName: node + linkType: hard + "github-from-package@npm:0.0.0": version: 0.0.0 resolution: "github-from-package@npm:0.0.0" @@ -27409,7 +30097,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.1.0": +"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.0.3, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -27463,6 +30151,19 @@ __metadata: languageName: node linkType: hard +"globby@npm:^13.1.3": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: ^3.0.1 + fast-glob: ^3.3.0 + ignore: ^5.2.4 + merge2: ^1.4.1 + slash: ^4.0.0 + checksum: f3d84ced58a901b4fcc29c846983108c426631fe47e94872868b65565495f7bee7b3defd68923bd480582771fd4bbe819217803a164a618ad76f1d22f666f41e + languageName: node + linkType: hard + "globrex@npm:^0.1.2": version: 0.1.2 resolution: "globrex@npm:0.1.2" @@ -27592,6 +30293,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^11.8.5": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": ^4.0.0 + "@szmarczak/http-timer": ^4.0.5 + "@types/cacheable-request": ^6.0.1 + "@types/responselike": ^1.0.0 + cacheable-lookup: ^5.0.3 + cacheable-request: ^7.0.2 + decompress-response: ^6.0.0 + http2-wrapper: ^1.0.0-beta.5.2 + lowercase-keys: ^2.0.0 + p-cancelable: ^2.0.0 + responselike: ^2.0.0 + checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d + languageName: node + linkType: hard + "got@npm:^12.1.0": version: 12.6.1 resolution: "got@npm:12.6.1" @@ -27649,6 +30369,99 @@ __metadata: languageName: node linkType: hard +"graphql-codegen@npm:^0.4.0": + version: 0.4.0 + resolution: "graphql-codegen@npm:0.4.0" + dependencies: + babel-runtime: ^6.11.6 + change-case: ^3.0.0 + graphql: ^0.7.0 + inflected: ^1.1.7 + mkdirp: ^0.5.1 + node-fetch: ^1.5.3 + yargs: ^5.0.0 + bin: + graphql-codegen: ./lib/cli.js + checksum: 584ad3382de9ee3927cfd4fcc340abb2f8d4bbdacacebe9e56e34edf255c87eb1e191f2d7c4f3d1d5bb0ebd829b852e50efe91e967683a8b181dcd3b26ae6b6c + languageName: node + linkType: hard + +"graphql-config@npm:^5.1.1": + version: 5.1.3 + resolution: "graphql-config@npm:5.1.3" + 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: ^2.0.0 + minimatch: ^9.0.5 + string-env-interpolation: ^1.0.1 + tslib: ^2.4.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 + checksum: fde8aee849def42a5eaf02fbe3e404c91be94a53782c22ff58b29bfcfed7e9be2fba114fa94b4a97e12ea1e5970267ebaa119ba6915b2d4d9bb8f5ae9c5485c2 + languageName: node + linkType: hard + +"graphql-request@npm:^6.0.0, graphql-request@npm:^6.1.0": + version: 6.1.0 + resolution: "graphql-request@npm:6.1.0" + dependencies: + "@graphql-typed-document-node/core": ^3.2.0 + cross-fetch: ^3.1.5 + peerDependencies: + graphql: 14 - 16 + checksum: 6d62630a0169574442320651c1f7626c0c602025c3c46b19e09417c9579bb209306ee63de9793a03be2e1701bb7f13971f8545d99bc6573e340f823af0ad35b2 + languageName: node + linkType: hard + +"graphql-tag@npm:^2.11.0": + version: 2.12.6 + resolution: "graphql-tag@npm:2.12.6" + dependencies: + tslib: ^2.1.0 + 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 + checksum: b15162a3d62f17b9b79302445b9ee330e041582f1c7faca74b9dec5daa74272c906ec1c34e1c50592bb6215e5c3eba80a309103f6ba9e4c1cddc350c46f010df + languageName: node + linkType: hard + +"graphql-ws@npm:^6.0.3": + version: 6.0.3 + resolution: "graphql-ws@npm:6.0.3" + peerDependencies: + "@fastify/websocket": ^10 || ^11 + graphql: ^15.10.1 || ^16 + uWebSockets.js: ^20 + ws: ^8 + peerDependenciesMeta: + "@fastify/websocket": + optional: true + uWebSockets.js: + optional: true + ws: + optional: true + checksum: e60cbefd0a0f9c5bb9cd785fa5ac187e83730c9e096cf04d41381c77c8e08f58b7c97b62639afaf0b5c5d32c66ccece9933f657a508282b5a6b2c6b06d6b7082 + languageName: node + linkType: hard + +"graphql@npm:^0.7.0": + version: 0.7.2 + resolution: "graphql@npm:0.7.2" + dependencies: + iterall: 1.0.2 + checksum: 9b815b851d4fbc861609ce37e88e0be881d25fa2d5dc54f661379e600d103d4f051cee15a09799c4efa2d3590a61f64fc2e1d67332c7fdf8df2871c27b1c3f40 + languageName: node + linkType: hard + "graphql@npm:^16.3.0": version: 16.5.0 resolution: "graphql@npm:16.5.0" @@ -27656,7 +30469,7 @@ __metadata: languageName: node linkType: hard -"graphql@npm:^16.8.1": +"graphql@npm:^16.8.0, graphql@npm:^16.8.1": version: 16.10.0 resolution: "graphql@npm:16.10.0" checksum: 969c2d1061d69ad6fe08a7fe642428212b0b8485a2f9b5d8650203eb6c3221479e81ec6a757708f849d84b85afcb3ebc5a8ff2f71778bb66c5e4850f051c170e @@ -27675,6 +30488,13 @@ __metadata: languageName: node linkType: hard +"gsap@npm:^3.11.0": + version: 3.12.7 + resolution: "gsap@npm:3.12.7" + checksum: 15f5da56d02f04be8eb4b58cb733fbd71619647608c0854717697da8b1922a5ce4ea5487cba0c66f428aa645247e143e462bec885f8470725c2c9ab393247e25 + languageName: node + linkType: hard + "gtoken@npm:^5.0.4": version: 5.3.2 resolution: "gtoken@npm:5.3.2" @@ -27945,6 +30765,21 @@ __metadata: languageName: node linkType: hard +"hast-util-from-parse5@npm:^7.0.0": + version: 7.1.2 + resolution: "hast-util-from-parse5@npm:7.1.2" + dependencies: + "@types/hast": ^2.0.0 + "@types/unist": ^2.0.0 + hastscript: ^7.0.0 + property-information: ^6.0.0 + vfile: ^5.0.0 + vfile-location: ^4.0.0 + web-namespaces: ^2.0.0 + checksum: 7b4ed5b508b1352127c6719f7b0c0880190cf9859fe54ccaf7c9228ecf623d36cef3097910b3874d2fe1aac6bf4cf45d3cc2303daac3135a05e9ade6534ddddb + languageName: node + linkType: hard + "hast-util-parse-selector@npm:^2.0.0": version: 2.2.5 resolution: "hast-util-parse-selector@npm:2.2.5" @@ -27952,6 +30787,115 @@ __metadata: languageName: node linkType: hard +"hast-util-parse-selector@npm:^3.0.0": + version: 3.1.1 + resolution: "hast-util-parse-selector@npm:3.1.1" + dependencies: + "@types/hast": ^2.0.0 + checksum: 511d373465f60dd65e924f88bf0954085f4fb6e3a2b062a4b5ac43b93cbfd36a8dce6234b5d1e3e63499d936375687e83fc5da55628b22bd6b581b5ee167d1c4 + languageName: node + linkType: hard + +"hast-util-raw@npm:^7.0.0": + version: 7.2.3 + resolution: "hast-util-raw@npm:7.2.3" + dependencies: + "@types/hast": ^2.0.0 + "@types/parse5": ^6.0.0 + hast-util-from-parse5: ^7.0.0 + hast-util-to-parse5: ^7.0.0 + html-void-elements: ^2.0.0 + parse5: ^6.0.0 + unist-util-position: ^4.0.0 + unist-util-visit: ^4.0.0 + vfile: ^5.0.0 + web-namespaces: ^2.0.0 + zwitch: ^2.0.0 + checksum: 21857eea3ffb8fd92d2d9be7793b56d0b2c40db03c4cfa14828855ae41d7c584917aa83efb7157220b2e41e25e95f81f24679ac342c35145e5f1c1d39015f81f + languageName: node + linkType: hard + +"hast-util-sanitize@npm:^4.0.0": + version: 4.1.0 + resolution: "hast-util-sanitize@npm:4.1.0" + dependencies: + "@types/hast": ^2.0.0 + checksum: 4f1786d6556bae6485a657a3e77e7e71b573fd20e4e2d70678e0f445eb8fe3dc6c4441cda6d18b89a79b53e2c03b6232eb6c470ecd478737050724ea09398603 + languageName: node + linkType: hard + +"hast-util-to-html@npm:^8.0.0": + version: 8.0.4 + resolution: "hast-util-to-html@npm:8.0.4" + dependencies: + "@types/hast": ^2.0.0 + "@types/unist": ^2.0.0 + ccount: ^2.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-raw: ^7.0.0 + hast-util-whitespace: ^2.0.0 + html-void-elements: ^2.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + stringify-entities: ^4.0.0 + zwitch: ^2.0.4 + checksum: 8f2ae071df2ced5afb4f19f76af8fd3a2f837dc47bcc1c0e0c1578d29dafcd28738f9617505d13c4a2adf13d70e043143e2ad8f130d5554ab4fc11bfa8f74094 + languageName: node + linkType: hard + +"hast-util-to-jsx-runtime@npm:^2.0.0": + version: 2.3.2 + resolution: "hast-util-to-jsx-runtime@npm:2.3.2" + dependencies: + "@types/estree": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/unist": ^3.0.0 + comma-separated-tokens: ^2.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 + hast-util-whitespace: ^3.0.0 + mdast-util-mdx-expression: ^2.0.0 + mdast-util-mdx-jsx: ^3.0.0 + mdast-util-mdxjs-esm: ^2.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + style-to-object: ^1.0.0 + unist-util-position: ^5.0.0 + vfile-message: ^4.0.0 + checksum: 223cc3e2ea622d14529e2aa070bd88f6ca7255084bd5e6e28015dad435cda22b1ddd98064bba6a4753d546d882dcd3f8067af1ea27c253986f6f303869544075 + languageName: node + linkType: hard + +"hast-util-to-parse5@npm:^7.0.0": + version: 7.1.0 + resolution: "hast-util-to-parse5@npm:7.1.0" + dependencies: + "@types/hast": ^2.0.0 + comma-separated-tokens: ^2.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + web-namespaces: ^2.0.0 + zwitch: ^2.0.0 + checksum: 3a7f2175a3db599bbae7e49ba73d3e5e688e5efca7590ff50130ba108ad649f728402815d47db49146f6b94c14c934bf119915da9f6964e38802c122bcc8af6b + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "hast-util-whitespace@npm:2.0.1" + checksum: 431be6b2f35472f951615540d7a53f69f39461e5e080c0190268bdeb2be9ab9b1dddfd1f467dd26c1de7e7952df67beb1307b6ee940baf78b24a71b5e0663868 + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^3.0.0": + version: 3.0.0 + resolution: "hast-util-whitespace@npm:3.0.0" + dependencies: + "@types/hast": ^3.0.0 + checksum: 41d93ccce218ba935dc3c12acdf586193c35069489c8c8f50c2aa824c00dec94a3c78b03d1db40fa75381942a189161922e4b7bca700b3a2cc779634c351a1e4 + languageName: node + linkType: hard + "hastscript@npm:^6.0.0": version: 6.0.0 resolution: "hastscript@npm:6.0.0" @@ -27965,6 +30909,19 @@ __metadata: languageName: node linkType: hard +"hastscript@npm:^7.0.0": + version: 7.2.0 + resolution: "hastscript@npm:7.2.0" + dependencies: + "@types/hast": ^2.0.0 + comma-separated-tokens: ^2.0.0 + hast-util-parse-selector: ^3.0.0 + property-information: ^6.0.0 + space-separated-tokens: ^2.0.0 + checksum: 928a21576ff7b9a8c945e7940bcbf2d27f770edb4279d4d04b33dc90753e26ca35c1172d626f54afebd377b2afa32331e399feb3eb0f7b91a399dca5927078ae + languageName: node + linkType: hard + "he@npm:1.2.0, he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -27974,6 +30931,26 @@ __metadata: languageName: node linkType: hard +"header-case@npm:^1.0.0": + version: 1.0.1 + resolution: "header-case@npm:1.0.1" + dependencies: + no-case: ^2.2.0 + upper-case: ^1.1.3 + checksum: fe1cc9a555ec9aabc2de80f4dd961a81c534fc23951694fef34297e59b0dd60f26647148731bf0dd3fdb3a1c688089d3cd147d7038db850e25be7c0a5fabb022 + languageName: node + linkType: hard + +"header-case@npm:^2.0.4": + version: 2.0.4 + resolution: "header-case@npm:2.0.4" + dependencies: + capital-case: ^1.0.4 + tslib: ^2.0.3 + checksum: 571c83eeb25e8130d172218712f807c0b96d62b020981400bccc1503a7cf14b09b8b10498a962d2739eccf231d950e3848ba7d420b58a6acd2f9283439546cd9 + languageName: node + linkType: hard + "headers-polyfill@npm:^3.0.4": version: 3.0.7 resolution: "headers-polyfill@npm:3.0.7" @@ -28134,6 +31111,20 @@ __metadata: languageName: node linkType: hard +"html-url-attributes@npm:^3.0.0": + version: 3.0.1 + resolution: "html-url-attributes@npm:3.0.1" + checksum: 1ecbf9cae0c438d2802386710177b7bbf7e30cc61327e9f125eb32fca7302cd1e3ab45c441859cb1e7646109be322fc1163592ad4dfde9b14d09416d101a6573 + languageName: node + linkType: hard + +"html-void-elements@npm:^2.0.0": + version: 2.0.1 + resolution: "html-void-elements@npm:2.0.1" + checksum: 06d41f13b9d5d6e0f39861c4bec9a9196fa4906d56cd5cf6cf54ad2e52a85bf960cca2bf9600026bde16c8331db171bedba5e5a35e2e43630c8f1d497b2fb658 + languageName: node + linkType: hard + "html-webpack-plugin@npm:^5.5.0": version: 5.5.4 resolution: "html-webpack-plugin@npm:5.5.4" @@ -28173,7 +31164,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 @@ -28327,6 +31318,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.0.0 + checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e + languageName: node + linkType: hard + "http2-wrapper@npm:^2.1.10": version: 2.2.1 resolution: "http2-wrapper@npm:2.2.1" @@ -28584,6 +31585,28 @@ __metadata: languageName: node linkType: hard +"iframe-resizer-react@npm:^1.1.0": + version: 1.1.1 + resolution: "iframe-resizer-react@npm:1.1.1" + dependencies: + "@babel/plugin-proposal-private-property-in-object": ^7.21.11 + iframe-resizer: ^4.4.4 + warning: ^4.0.3 + peerDependencies: + prop-types: ^15.7.2 + react: ^16.13.1 || ^18.0.0 + react-dom: ^16.13.1 || ^18.0.0 + checksum: fd3db2dfd3e1455e2f8150ed0cc4068b8970389eca478d13e2ca6408e1fe0a85425f7b2cb004e5a8eee0e7d4ed304774cad4b1b40d9a7467c2db3ed4851c4572 + languageName: node + linkType: hard + +"iframe-resizer@npm:^4.4.4": + version: 4.4.5 + resolution: "iframe-resizer@npm:4.4.5" + checksum: fa2493daba2df7578866aeb5fceabcf2129da9327abd7d26b4f16e9e7109eddcb97a8ba7ea6e94b043705f13bcbe6ae307e67cc48c24f7bd9d948d491a150163 + languageName: node + linkType: hard + "ignore-walk@npm:^5.0.1": version: 5.0.1 resolution: "ignore-walk@npm:5.0.1" @@ -28627,6 +31650,13 @@ __metadata: languageName: node linkType: hard +"immer@npm:^10.0.3": + version: 10.1.1 + resolution: "immer@npm:10.1.1" + checksum: 07c67970b7d22aded73607193d84861bf786f07d47f7d7c98bb10016c7a88f6654ad78ae1e220b3c623695b133aabbf24f5eb8d9e8060cff11e89ccd81c9c10b + languageName: node + linkType: hard + "immutable@npm:^3.8.2, immutable@npm:^3.x.x": version: 3.8.2 resolution: "immutable@npm:3.8.2" @@ -28634,6 +31664,13 @@ __metadata: languageName: node linkType: hard +"immutable@npm:~3.7.6": + version: 3.7.6 + resolution: "immutable@npm:3.7.6" + checksum: 8cccfb22d3ecf14fe0c474612e96d6bb5d117493e7639fe6642fb81e78c9ac4b698dd8a322c105001a709ad873ffc90e30bad7db5d9a3ef0b54a6e1db0258e8e + languageName: node + linkType: hard + "import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" @@ -28644,6 +31681,13 @@ __metadata: languageName: node linkType: hard +"import-from@npm:4.0.0": + version: 4.0.0 + resolution: "import-from@npm:4.0.0" + checksum: 1fa29c05b048da18914e91d9a529e5d9b91774bebbfab10e53f59bcc1667917672b971cf102fee857f142e5e433ce69fa1f0a596e1c7d82f9947a5ec352694b9 + languageName: node + linkType: hard + "import-in-the-middle@npm:1.4.2": version: 1.4.2 resolution: "import-in-the-middle@npm:1.4.2" @@ -28739,6 +31783,13 @@ __metadata: languageName: node linkType: hard +"inflected@npm:^1.1.7": + version: 1.1.7 + resolution: "inflected@npm:1.1.7" + checksum: eac857f10871586006d629dc72bab05058f1967c10fae9d7391d627534566a8e5be0a1f690d2590102d890e4ef5647b73b7827380dc7bcf50faac4154f0ab084 + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -28834,6 +31885,13 @@ __metadata: languageName: node linkType: hard +"inline-style-parser@npm:0.2.4": + version: 0.2.4 + resolution: "inline-style-parser@npm:0.2.4" + checksum: 5df20a21dd8d67104faaae29774bb50dc9690c75bc5c45dac107559670a5530104ead72c4cf54f390026e617e7014c65b3d68fb0bb573a37c4d1f94e9c36e1ca + languageName: node + linkType: hard + "inline-style-prefixer@npm:^7.0.0": version: 7.0.0 resolution: "inline-style-prefixer@npm:7.0.0" @@ -28875,7 +31933,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:8.2.6": +"inquirer@npm:8.2.6, inquirer@npm:^8.0.0": version: 8.2.6 resolution: "inquirer@npm:8.2.6" dependencies: @@ -29035,6 +32093,13 @@ __metadata: languageName: node linkType: hard +"invert-kv@npm:^1.0.0": + version: 1.0.0 + resolution: "invert-kv@npm:1.0.0" + checksum: aebeee31dda3b3d25ffd242e9a050926e7fe5df642d60953ab183aca1a7d1ffb39922eb2618affb0e850cf2923116f0da1345367759d88d097df5da1f1e1590e + languageName: node + linkType: hard + "ioredis@npm:^5.3.2": version: 5.3.2 resolution: "ioredis@npm:5.3.2" @@ -29083,6 +32148,16 @@ __metadata: languageName: node linkType: hard +"is-absolute@npm:^1.0.0": + version: 1.0.0 + resolution: "is-absolute@npm:1.0.0" + dependencies: + is-relative: ^1.0.0 + is-windows: ^1.0.1 + checksum: 9d16b2605eda3f3ce755410f1d423e327ad3a898bcb86c9354cf63970ed3f91ba85e9828aa56f5d6a952b9fae43d0477770f78d37409ae8ecc31e59ebc279b27 + languageName: node + linkType: hard + "is-alphabetical@npm:^1.0.0": version: 1.0.4 resolution: "is-alphabetical@npm:1.0.4" @@ -29090,6 +32165,13 @@ __metadata: languageName: node linkType: hard +"is-alphabetical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphabetical@npm:2.0.1" + checksum: 56207db8d9de0850f0cd30f4966bf731eb82cedfe496cbc2e97e7c3bacaf66fc54a972d2d08c0d93bb679cb84976a05d24c5ad63de56fabbfc60aadae312edaa + languageName: node + linkType: hard + "is-alphanumerical@npm:^1.0.0": version: 1.0.4 resolution: "is-alphanumerical@npm:1.0.4" @@ -29100,6 +32182,16 @@ __metadata: languageName: node linkType: hard +"is-alphanumerical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphanumerical@npm:2.0.1" + dependencies: + is-alphabetical: ^2.0.0 + is-decimal: ^2.0.0 + checksum: 87acc068008d4c9c4e9f5bd5e251041d42e7a50995c77b1499cf6ed248f971aadeddb11f239cabf09f7975ee58cac7a48ffc170b7890076d8d227b24a68663c9 + languageName: node + linkType: hard + "is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.1": version: 1.1.1 resolution: "is-arguments@npm:1.1.1" @@ -29182,6 +32274,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:^2.0.0": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 + languageName: node + linkType: hard + "is-buffer@npm:~1.1.6": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" @@ -29304,6 +32403,13 @@ __metadata: languageName: node linkType: hard +"is-decimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-decimal@npm:2.0.1" + checksum: 97132de7acdce77caa7b797632970a2ecd649a88e715db0e4dbc00ab0708b5e7574ba5903962c860cd4894a14fd12b100c0c4ac8aed445cf6f55c6cf747a4158 + languageName: node + linkType: hard + "is-deflate@npm:^1.0.0": version: 1.0.0 resolution: "is-deflate@npm:1.0.0" @@ -29362,6 +32468,15 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: ^1.0.0 + checksum: 4d46a7465a66a8aebcc5340d3b63a56602133874af576a9ca42c6f0f4bd787a743605771c5f246db77da96605fefeffb65fc1dbe862dcc7328f4b4d03edf5a57 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -29399,7 +32514,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:4.0.3, is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -29422,6 +32537,13 @@ __metadata: languageName: node linkType: hard +"is-hexadecimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-hexadecimal@npm:2.0.1" + checksum: 66a2ea85994c622858f063f23eda506db29d92b52580709eb6f4c19550552d4dcf3fb81952e52f7cf972097237959e00adc7bb8c9400cd12886e15bf06145321 + languageName: node + linkType: hard + "is-in-ci@npm:^0.1.0": version: 0.1.0 resolution: "is-in-ci@npm:0.1.0" @@ -29482,6 +32604,15 @@ __metadata: languageName: node linkType: hard +"is-lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "is-lower-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: ba57dd1201e15fd9b590654736afccf1b3b68e919f40c23ef13b00ebcc639b1d9c2f81fe86415bff3e8eccffec459786c9ac9dc8f3a19cfa4484206c411c1d7d + languageName: node + linkType: hard + "is-map@npm:^2.0.2": version: 2.0.2 resolution: "is-map@npm:2.0.2" @@ -29620,7 +32751,7 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^4.1.0": +"is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce @@ -29683,6 +32814,15 @@ __metadata: languageName: node linkType: hard +"is-relative@npm:^1.0.0": + version: 1.0.0 + resolution: "is-relative@npm:1.0.0" + dependencies: + is-unc-path: ^1.0.0 + checksum: 3271a0df109302ef5e14a29dcd5d23d9788e15ade91a40b942b035827ffbb59f7ce9ff82d036ea798541a52913cbf9d2d0b66456340887b51f3542d57b5a4c05 + languageName: node + linkType: hard + "is-retry-allowed@npm:^1.1.0": version: 1.2.0 resolution: "is-retry-allowed@npm:1.2.0" @@ -29738,6 +32878,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^1.0.1": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae + languageName: node + linkType: hard + "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -29811,6 +32958,15 @@ __metadata: languageName: node linkType: hard +"is-unc-path@npm:^1.0.0": + version: 1.0.0 + resolution: "is-unc-path@npm:1.0.0" + dependencies: + unc-path-regex: ^0.1.2 + checksum: e8abfde203f7409f5b03a5f1f8636e3a41e78b983702ef49d9343eb608cdfe691429398e8815157519b987b739bcfbc73ae7cf4c8582b0ab66add5171088eab6 + languageName: node + linkType: hard + "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -29841,6 +32997,22 @@ __metadata: languageName: node linkType: hard +"is-upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "is-upper-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: cf4fd43c00c2e72cd5cff911923070b89f0933b464941bd782e2315385f80b5a5acd772db3b796542e5e3cfed735f4dffd88c54d62db1ebfc5c3daa7b1af2bc6 + languageName: node + linkType: hard + +"is-utf8@npm:^0.2.0": + version: 0.2.1 + resolution: "is-utf8@npm:0.2.1" + checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -29881,7 +33053,7 @@ __metadata: languageName: node linkType: hard -"is-windows@npm:1.0.2, is-windows@npm:^1.0.0": +"is-windows@npm:1.0.2, is-windows@npm:^1.0.0, is-windows@npm:^1.0.1": version: 1.0.2 resolution: "is-windows@npm:1.0.2" checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 @@ -29976,6 +33148,15 @@ __metadata: languageName: node linkType: hard +"isomorphic-ws@npm:^5.0.0": + version: 5.0.0 + resolution: "isomorphic-ws@npm:5.0.0" + peerDependencies: + ws: "*" + checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 + languageName: node + linkType: hard + "isstream@npm:~0.1.2": version: 0.1.2 resolution: "isstream@npm:0.1.2" @@ -30071,6 +33252,13 @@ __metadata: languageName: node linkType: hard +"iterall@npm:1.0.2": + version: 1.0.2 + resolution: "iterall@npm:1.0.2" + checksum: f87cbb8e22e3681f4d7ba634e4ce7bd419a78b47ff7b01f57f90cf761d187cb845fcac0d4d7e4c7dfcbfb80467c8ea42a9f3691bb3aa909e3e3707a25735ed70 + languageName: node + linkType: hard + "iterare@npm:1.2.1": version: 1.2.1 resolution: "iterare@npm:1.2.1" @@ -30716,6 +33904,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^1.17.1": + version: 1.21.7 + resolution: "jiti@npm:1.21.7" + bin: + jiti: bin/jiti.js + checksum: 9cd20dabf82e3a4cceecb746a69381da7acda93d34eed0cdb9c9bdff3bce07e4f2f4a016ca89924392c935297d9aedc58ff9f7d3281bc5293319ad244926e0b7 + languageName: node + linkType: hard + "jiti@npm:^1.18.2": version: 1.20.0 resolution: "jiti@npm:1.20.0" @@ -30734,6 +33931,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.0.0": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" + bin: + jiti: lib/jiti-cli.mjs + checksum: c6c30c7b6b293e9f26addfb332b63d964a9f143cdd2cf5e946dbe5143db89f7c1b50ad9223b77fb1f6ddb0b9c5ecef995fea024ecf7d2861d285d779cde66e1e + languageName: node + linkType: hard + "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -30741,6 +33947,19 @@ __metadata: languageName: node linkType: hard +"joi@npm:^17.11.0": + version: 17.13.3 + resolution: "joi@npm:17.13.3" + dependencies: + "@hapi/hoek": ^9.3.0 + "@hapi/topo": ^5.1.0 + "@sideway/address": ^4.1.5 + "@sideway/formula": ^3.0.1 + "@sideway/pinpoint": ^2.0.0 + checksum: 66ed454fee3d8e8da1ce21657fd2c7d565d98f3e539d2c5c028767e5f38cbd6297ce54df8312d1d094e62eb38f9452ebb43da4ce87321df66cf5e3f128cbc400 + languageName: node + linkType: hard + "jose@npm:5.2.1": version: 5.2.1 resolution: "jose@npm:5.2.1" @@ -30769,6 +33988,13 @@ __metadata: languageName: node linkType: hard +"jose@npm:^5.0.0": + version: 5.9.6 + resolution: "jose@npm:5.9.6" + checksum: 4b536da0201858ed4c4582e8bb479081f11e0c63dd0f5e473adde16fc539785e1f2f0409bc1fc7cbbb5b68026776c960b4952da3a06f6fdfff0b9764c9127ae0 + languageName: node + linkType: hard + "jpeg-js@npm:0.4.2": version: 0.4.2 resolution: "jpeg-js@npm:0.4.2" @@ -30818,7 +34044,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:=4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0, js-yaml@npm:=4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -30976,6 +34202,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -31098,6 +34333,16 @@ __metadata: languageName: node linkType: hard +"json-to-pretty-yaml@npm:^1.2.2": + version: 1.2.2 + resolution: "json-to-pretty-yaml@npm:1.2.2" + dependencies: + remedial: ^1.0.7 + remove-trailing-spaces: ^1.0.6 + checksum: 4b78480f426e176e5fdac073e05877683bb026f1175deb52d0941b992f9c91a58a812c020f00aa67ba1fc7cadb220539a264146f222e48a48c8bb2a0931cac9b + languageName: node + linkType: hard + "json5@npm:^1.0.1, json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -31153,6 +34398,19 @@ __metadata: languageName: node linkType: hard +"jsonfile@npm:^5.0.0": + version: 5.0.0 + resolution: "jsonfile@npm:5.0.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^0.1.2 + dependenciesMeta: + graceful-fs: + optional: true + checksum: e0ecff572dba34153a66e3a3bc5c6cb01a2c1d2cf4a2c19b6728dcfcab39d94be9cca4a0fc86a17ff2c815f2aeb43768ac75545780dbea4009433fdc32aa14d1 + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" @@ -31326,6 +34584,13 @@ __metadata: languageName: node linkType: hard +"keen-slider@npm:^6.8.0": + version: 6.8.6 + resolution: "keen-slider@npm:6.8.6" + checksum: f87e65d72e3b2e73cbd52b1908c1458b253ec5a2a2d3e1e34bd1a831172d18568649188cf3e4ad679c7988568929195ae91d4b7a1c0bd3d6da592a453be3723a + languageName: node + linkType: hard + "keypress@npm:~0.2.1": version: 0.2.1 resolution: "keypress@npm:0.2.1" @@ -31333,7 +34598,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.0.0, keyv@npm:^4.5.3": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -31349,7 +34614,7 @@ __metadata: languageName: node linkType: hard -"kleur@npm:4.1.5, kleur@npm:^4.1.5": +"kleur@npm:4.1.5, kleur@npm:^4.0.3, kleur@npm:^4.1.5": version: 4.1.5 resolution: "kleur@npm:4.1.5" checksum: 1dc476e32741acf0b1b5b0627ffd0d722e342c1b0da14de3e8ae97821327ca08f9fb944542fb3c126d90ac5f27f9d804edbe7c585bf7d12ef495d115e0f22c12 @@ -31452,6 +34717,15 @@ __metadata: languageName: node linkType: hard +"lcid@npm:^1.0.0": + version: 1.0.0 + resolution: "lcid@npm:1.0.0" + dependencies: + invert-kv: ^1.0.0 + checksum: e8c7a4db07663068c5c44b650938a2bc41aa992037eebb69376214320f202c1250e70b50c32f939e28345fd30c2d35b8e8cd9a19d5932c398246a864ce54843d + languageName: node + linkType: hard + "level-blobs@npm:^0.1.7": version: 0.1.7 resolution: "level-blobs@npm:0.1.7" @@ -31738,6 +35012,19 @@ __metadata: languageName: node linkType: hard +"load-json-file@npm:^1.0.0": + version: 1.1.0 + resolution: "load-json-file@npm:1.1.0" + dependencies: + graceful-fs: ^4.1.2 + parse-json: ^2.2.0 + pify: ^2.0.0 + pinkie-promise: ^2.0.0 + strip-bom: ^2.0.0 + checksum: 0e4e4f380d897e13aa236246a917527ea5a14e4fc34d49e01ce4e7e2a1e08e2740ee463a03fb021c04f594f29a178f4adb994087549d7c1c5315fcd29bf9934b + languageName: node + linkType: hard + "load-json-file@npm:^4.0.0": version: 4.0.0 resolution: "load-json-file@npm:4.0.0" @@ -31865,6 +35152,13 @@ __metadata: languageName: node linkType: hard +"lodash.assign@npm:^4.1.0, lodash.assign@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.assign@npm:4.2.0" + checksum: 75bbc6733c9f577c448031b4051f990f068802708891f94be9d4c2faffd6a9ec67a2c49671dafc908a068d35687765464853282842b4560b662e6c903d11cc90 + languageName: node + linkType: hard + "lodash.camelcase@npm:^4.3.0": version: 4.3.0 resolution: "lodash.camelcase@npm:4.3.0" @@ -32026,6 +35320,13 @@ __metadata: languageName: node linkType: hard +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c + languageName: node + linkType: hard + "lodash.startcase@npm:^4.4.0": version: 4.4.0 resolution: "lodash.startcase@npm:4.4.0" @@ -32061,14 +35362,14 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.15": +"lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.0, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 languageName: node linkType: hard -"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": +"log-symbols@npm:4.1.0, log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -32149,6 +35450,13 @@ __metadata: languageName: node linkType: hard +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -32204,6 +35512,15 @@ __metadata: languageName: node linkType: hard +"lower-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case-first@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 33e3da1098ddda219ce125d4ab7a78a944972c0ee8872e95b6ccc35df8ad405284ab233b0ba4d72315ad1a06fe2f0d418ee4cba9ec1ef1c386dea78899fc8958 + languageName: node + linkType: hard + "lower-case@npm:^1.1.0, lower-case@npm:^1.1.1, lower-case@npm:^1.1.2": version: 1.1.4 resolution: "lower-case@npm:1.1.4" @@ -32220,6 +35537,13 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:^2.0.0": + version: 2.0.0 + resolution: "lowercase-keys@npm:2.0.0" + checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 + languageName: node + linkType: hard + "lowercase-keys@npm:^3.0.0": version: 3.0.0 resolution: "lowercase-keys@npm:3.0.0" @@ -32334,6 +35658,15 @@ __metadata: languageName: node linkType: hard +"lucide-react@npm:^0.171.0": + version: 0.171.0 + resolution: "lucide-react@npm:0.171.0" + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + checksum: 768ffe368c52a518ee339203d86ff4479989ab4d79c0716f721900c4bb7392ef6ff7a14807f6a685abd74d27f4c1778170bff77a0ab4c3e06c17944b557d8300 + languageName: node + linkType: hard + "lucide-static@npm:^0.424.0": version: 0.424.0 resolution: "lucide-static@npm:0.424.0" @@ -32564,6 +35897,13 @@ __metadata: languageName: node linkType: hard +"map-cache@npm:^0.2.0": + version: 0.2.2 + resolution: "map-cache@npm:0.2.2" + checksum: 3067cea54285c43848bb4539f978a15dedc63c03022abeec6ef05c8cb6829f920f13b94bcaf04142fc6a088318e564c4785704072910d120d55dbc2e0c421969 + languageName: node + linkType: hard + "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" @@ -32668,6 +36008,192 @@ __metadata: languageName: node linkType: hard +"mdast-util-definitions@npm:^5.0.0": + version: 5.1.2 + resolution: "mdast-util-definitions@npm:5.1.2" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + unist-util-visit: ^4.0.0 + checksum: 2544daccab744ea1ede76045c2577ae4f1cc1b9eb1ea51ab273fe1dca8db5a8d6f50f87759c0ce6484975914b144b7f40316f805cb9c86223a78db8de0b77bae + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^1.0.0": + version: 1.3.1 + resolution: "mdast-util-from-markdown@npm:1.3.1" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + decode-named-character-reference: ^1.0.0 + mdast-util-to-string: ^3.1.0 + micromark: ^3.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-decode-string: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + unist-util-stringify-position: ^3.0.0 + uvu: ^0.5.0 + checksum: c2fac225167e248d394332a4ea39596e04cbde07d8cdb3889e91e48972c4c3462a02b39fda3855345d90231eb17a90ac6e082fb4f012a77c1d0ddfb9c7446940 + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^2.0.0": + version: 2.0.2 + resolution: "mdast-util-from-markdown@npm:2.0.2" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + mdast-util-to-string: ^4.0.0 + micromark: ^4.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 1ad19f48b30ac6e0cb756070c210c78ad93c26876edfb3f75127783bc6df8b9402016d8f3e9964f3d1d5430503138ec65c145e869438727e1aa7f3cebf228fba + languageName: node + linkType: hard + +"mdast-util-mdx-expression@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdx-expression@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 6af56b06bde3ab971129db9855dcf0d31806c70b3b052d7a90a5499a366b57ffd0c2efca67d281c448c557298ba7e3e61bd07133733b735440840dd339b28e19 + languageName: node + linkType: hard + +"mdast-util-mdx-jsx@npm:^3.0.0": + version: 3.2.0 + resolution: "mdast-util-mdx-jsx@npm:3.2.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + ccount: ^2.0.0 + devlop: ^1.1.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + parse-entities: ^4.0.0 + stringify-entities: ^4.0.0 + unist-util-stringify-position: ^4.0.0 + vfile-message: ^4.0.0 + checksum: 224f5f6ad247f0f2622ee36c82ac7a4c6a60c31850de4056bf95f531bd2f7ec8943ef34dfe8a8375851f65c07e4913c4f33045d703df4ff4d11b2de5a088f7f9 + languageName: node + linkType: hard + +"mdast-util-mdxjs-esm@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdxjs-esm@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 1f9dad04d31d59005332e9157ea9510dc1d03092aadbc607a10475c7eec1c158b475aa0601a3a4f74e13097ca735deb8c2d9d37928ddef25d3029fd7c9e14dc3 + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^3.0.0": + version: 3.0.1 + resolution: "mdast-util-phrasing@npm:3.0.1" + dependencies: + "@types/mdast": ^3.0.0 + unist-util-is: ^5.0.0 + checksum: c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": ^4.0.0 + unist-util-is: ^6.0.0 + checksum: 3a97533e8ad104a422f8bebb34b3dde4f17167b8ed3a721cf9263c7416bd3447d2364e6d012a594aada40cac9e949db28a060bb71a982231693609034ed5324e + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^11.0.0": + version: 11.3.0 + resolution: "mdast-util-to-hast@npm:11.3.0" + dependencies: + "@types/hast": ^2.0.0 + "@types/mdast": ^3.0.0 + "@types/mdurl": ^1.0.0 + mdast-util-definitions: ^5.0.0 + mdurl: ^1.0.0 + unist-builder: ^3.0.0 + unist-util-generated: ^2.0.0 + unist-util-position: ^4.0.0 + unist-util-visit: ^4.0.0 + checksum: a968d034613aa5cfb44b9c03d8e61a08bb563bfde3a233fb3d83a28857357e2beef56b6767bab2867d3c3796dc5dd796af4d03fb83e3133aeb7f4187b5cc9327 + languageName: node + linkType: hard + +"mdast-util-to-hast@npm:^13.0.0": + version: 13.2.0 + resolution: "mdast-util-to-hast@npm:13.2.0" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@ungap/structured-clone": ^1.0.0 + devlop: ^1.0.0 + micromark-util-sanitize-uri: ^2.0.0 + trim-lines: ^3.0.0 + unist-util-position: ^5.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + checksum: 7e5231ff3d4e35e1421908437577fd5098141f64918ff5cc8a0f7a8a76c5407f7a3ee88d75f7a1f7afb763989c9f357475fa0ba8296c00aaff1e940098fe86a6 + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^1.0.0": + version: 1.5.0 + resolution: "mdast-util-to-markdown@npm:1.5.0" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^3.0.0 + mdast-util-to-string: ^3.0.0 + micromark-util-decode-string: ^1.0.0 + unist-util-visit: ^4.0.0 + zwitch: ^2.0.0 + checksum: 64338eb33e49bb0aea417591fd986f72fdd39205052563bb7ce9eb9ecc160824509bfacd740086a05af355c6d5c36353aafe95cab9e6927d674478757cee6259 + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.2 + resolution: "mdast-util-to-markdown@npm:2.1.2" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^4.0.0 + mdast-util-to-string: ^4.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + unist-util-visit: ^5.0.0 + zwitch: ^2.0.0 + checksum: 288d152bd50c00632e6e01c610bb904a220d1e226c8086c40627877959746f83ab0b872f4150cb7d910198953b1bf756e384ac3fee3e7b0ddb4517f9084c5803 + languageName: node + linkType: hard + "mdast-util-to-string@npm:^1.0.0": version: 1.1.0 resolution: "mdast-util-to-string@npm:1.1.0" @@ -32675,6 +36201,24 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": + version: 3.2.0 + resolution: "mdast-util-to-string@npm:3.2.0" + dependencies: + "@types/mdast": ^3.0.0 + checksum: dc40b544d54339878ae2c9f2b3198c029e1e07291d2126bd00ca28272ee6616d0d2194eb1c9828a7c34d412a79a7e73b26512a734698d891c710a1e73db1e848 + languageName: node + linkType: hard + +"mdast-util-to-string@npm:^4.0.0": + version: 4.0.0 + resolution: "mdast-util-to-string@npm:4.0.0" + dependencies: + "@types/mdast": ^4.0.0 + checksum: 35489fb5710d58cbc2d6c8b6547df161a3f81e0f28f320dfb3548a9393555daf07c310c0c497708e67ed4dfea4a06e5655799e7d631ca91420c288b4525d6c29 + languageName: node + linkType: hard + "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -32682,7 +36226,7 @@ __metadata: languageName: node linkType: hard -"mdurl@npm:^1.0.1": +"mdurl@npm:^1.0.0, mdurl@npm:^1.0.1": version: 1.0.1 resolution: "mdurl@npm:1.0.1" checksum: 71731ecba943926bfbf9f9b51e28b5945f9411c4eda80894221b47cc105afa43ba2da820732b436f0798fd3edbbffcd1fc1415843c41a87fea08a41cc1e3d02b @@ -32816,6 +36360,18 @@ __metadata: languageName: node linkType: hard +"meros@npm:^1.2.1": + version: 1.3.0 + resolution: "meros@npm:1.3.0" + peerDependencies: + "@types/node": ">=13" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: ea86c83fe9357d3eb2f5bad20909e12642c7bc8c10340d9bd0968b48f69ec453de14f7e5032d138ad04cb10d79b8c9fb3c9601bb515e8fbdf9bec4eed62994ad + languageName: node + linkType: hard + "methods@npm:^1.1.2, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -32836,6 +36392,478 @@ __metadata: languageName: node linkType: hard +"micromark-core-commonmark@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-core-commonmark@npm:1.1.0" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-factory-destination: ^1.0.0 + micromark-factory-label: ^1.0.0 + micromark-factory-space: ^1.0.0 + micromark-factory-title: ^1.0.0 + micromark-factory-whitespace: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-chunked: ^1.0.0 + micromark-util-classify-character: ^1.0.0 + micromark-util-html-tag-name: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-resolve-all: ^1.0.0 + micromark-util-subtokenize: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.1 + uvu: ^0.5.0 + checksum: c6dfedc95889cc73411cb222fc2330b9eda6d849c09c9fd9eb3cd3398af246167e9d3cdb0ae3ce9ae59dd34a14624c8330e380255d41279ad7350cf6c6be6c5b + languageName: node + linkType: hard + +"micromark-core-commonmark@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-core-commonmark@npm:2.0.2" + dependencies: + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-factory-destination: ^2.0.0 + micromark-factory-label: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-factory-title: ^2.0.0 + micromark-factory-whitespace: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-html-tag-name: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: e49d78429baf72533a02d06ae83e5a24d4d547bc832173547ffbae93c0960a7dbf0d8896058301498fa4297f280070a5a66891e0e6160040d6c5ef9bc5d9cd51 + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-destination@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 9e2b5fb5fedbf622b687e20d51eb3d56ae90c0e7ecc19b37bd5285ec392c1e56f6e21aa7cfcb3c01eda88df88fe528f3acb91a5f57d7f4cba310bc3cd7f824fa + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 9c4baa9ca2ed43c061bbf40ddd3d85154c2a0f1f485de9dea41d7dd2ad994ebb02034a003b2c1dbe228ba83a0576d591f0e90e0bf978713f84ee7d7f3aa98320 + languageName: node + linkType: hard + +"micromark-factory-label@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-label@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: fcda48f1287d9b148c562c627418a2ab759cdeae9c8e017910a0cba94bb759a96611e1fc6df33182e97d28fbf191475237298983bb89ef07d5b02464b1ad28d5 + languageName: node + linkType: hard + +"micromark-factory-label@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" + dependencies: + devlop: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: bd03f5a75f27cdbf03b894ddc5c4480fc0763061fecf9eb927d6429233c930394f223969a99472df142d570c831236134de3dc23245d23d9f046f9d0b623b5c2 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 + languageName: node + linkType: hard + +"micromark-factory-space@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 1bd68a017c1a66f4787506660c1e1c5019169aac3b1cb075d49ac5e360e0b2065e984d4e1d6e9e52a9d44000f2fa1c98e66a743d7aae78b4b05616bf3242ed71 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-title@npm:1.1.0" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 4432d3dbc828c81f483c5901b0c6591a85d65a9e33f7d96ba7c3ae821617a0b3237ff5faf53a9152d00aaf9afb3a9f185b205590f40ed754f1d9232e0e9157b1 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: b4d2e4850a8ba0dff25ce54e55a3eb0d43dda88a16293f53953153288f9d84bcdfa8ca4606b2cfbb4f132ea79587bbb478a73092a349f893f5264fbcdbce2ee1 + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-whitespace@npm:1.1.0" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: ef0fa682c7d593d85a514ee329809dee27d10bc2a2b65217d8ef81173e33b8e83c549049764b1ad851adfe0a204dec5450d9d20a4ca8598f6c94533a73f73fcd + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" + dependencies: + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 67b3944d012a42fee9e10e99178254a04d48af762b54c10a50fcab988688799993efb038daf9f5dbc04001a97b9c1b673fc6f00e6a56997877ab25449f0c8650 + languageName: node + linkType: hard + +"micromark-util-character@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" + dependencies: + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 089e79162a19b4a28731736246579ab7e9482ac93cd681c2bfca9983dcff659212ef158a66a5957e9d4b1dba957d1b87b565d85418a5b009f0294f1f07f2aaac + languageName: node + linkType: hard + +"micromark-util-character@npm:^2.0.0": + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" + dependencies: + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: e9e409efe4f2596acd44587e8591b722bfc041c1577e8fe0d9c007a4776fb800f9b3637a22862ad2ba9489f4bdf72bb547fce5767dbbfe0a5e6760e2a21c6495 + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-chunked@npm:1.1.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: c435bde9110cb595e3c61b7f54c2dc28ee03e6a57fa0fc1e67e498ad8bac61ee5a7457a2b6a73022ddc585676ede4b912d28dcf57eb3bd6951e54015e14dc20b + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: f8cb2a67bcefe4bd2846d838c97b777101f0043b9f1de4f69baf3e26bb1f9885948444e3c3aec66db7595cad8173bd4567a000eb933576c233d54631f6323fe4 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-classify-character@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 8499cb0bb1f7fb946f5896285fcca65cd742f66cd3e79ba7744792bd413ec46834f932a286de650349914d02e822946df3b55d03e6a8e1d245d1ddbd5102e5b0 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 4d8bbe3a6dbf69ac0fc43516866b5bab019fe3f4568edc525d4feaaaf78423fa54e6b6732b5bccbeed924455279a3758ffc9556954aafb903982598a95a02704 + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-combine-extensions@npm:1.1.0" + dependencies: + micromark-util-chunked: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: ee78464f5d4b61ccb437850cd2d7da4d690b260bca4ca7a79c4bb70291b84f83988159e373b167181b6716cb197e309bc6e6c96a68cc3ba9d50c13652774aba9 + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" + dependencies: + micromark-util-chunked: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 5d22fb9ee37e8143adfe128a72b50fa09568c2cc553b3c76160486c96dbbb298c5802a177a10a215144a604b381796071b5d35be1f2c2b2ee17995eda92f0c8e + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: 4733fe75146e37611243f055fc6847137b66f0cde74d080e33bd26d0408c1d6f44cabc984063eee5968b133cb46855e729d555b9ff8d744652262b7b51feec73 + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^2.0.0": + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: ee11c8bde51e250e302050474c4a2adca094bca05c69f6cdd241af12df285c48c88d19ee6e022b9728281c280be16328904adca994605680c43af56019f4b0b6 + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-string@npm:1.1.0" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-symbol: ^1.0.0 + checksum: f1625155db452f15aa472918499689ba086b9c49d1322a08b22bfbcabe918c61b230a3002c8bc3ea9b1f52ca7a9bb1c3dd43ccb548c7f5f8b16c24a1ae77a813 + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-util-character: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: e9546ae53f9b5a4f9aa6aaf3e750087100d3429485ca80dbacec99ff2bb15a406fa7d93784a0fc2fe05ad7296b9295e75160ef71faec9e90110b7be2ae66241a + languageName: node + linkType: hard + +"micromark-util-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-encode@npm:1.1.0" + checksum: 4ef29d02b12336918cea6782fa87c8c578c67463925221d4e42183a706bde07f4b8b5f9a5e1c7ce8c73bb5a98b261acd3238fecd152e6dd1cdfa2d1ae11b60a0 + languageName: node + linkType: hard + +"micromark-util-encode@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: be890b98e78dd0cdd953a313f4148c4692cc2fb05533e56fef5f421287d3c08feee38ca679f318e740530791fc251bfe8c80efa926fcceb4419b269c9343d226 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-html-tag-name@npm:1.2.0" + checksum: ccf0fa99b5c58676dc5192c74665a3bfd1b536fafaf94723bd7f31f96979d589992df6fcf2862eba290ef18e6a8efb30ec8e1e910d9f3fc74f208871e9f84750 + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: dea365f5ad28ad74ff29fcb581f7b74fc1f80271c5141b3b2bc91c454cbb6dfca753f28ae03730d657874fcbd89d0494d0e3965dfdca06d9855f467c576afa9d + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-normalize-identifier@npm:1.1.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: 8655bea41ffa4333e03fc22462cb42d631bbef9c3c07b625fd852b7eb442a110f9d2e5902a42e65188d85498279569502bf92f3434a1180fc06f7c37edfbaee2 + languageName: node + linkType: hard + +"micromark-util-normalize-identifier@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" + dependencies: + micromark-util-symbol: ^2.0.0 + checksum: 1eb9a289d7da067323df9fdc78bfa90ca3207ad8fd893ca02f3133e973adcb3743b233393d23d95c84ccaf5d220ae7f5a28402a644f135dcd4b8cfa60a7b5f84 + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-resolve-all@npm:1.1.0" + dependencies: + micromark-util-types: ^1.0.0 + checksum: 1ce6c0237cd3ca061e76fae6602cf95014e764a91be1b9f10d36cb0f21ca88f9a07de8d49ab8101efd0b140a4fbfda6a1efb72027ab3f4d5b54c9543271dc52c + languageName: node + linkType: hard + +"micromark-util-resolve-all@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" + dependencies: + micromark-util-types: ^2.0.0 + checksum: 9275f3ddb6c26f254dd2158e66215d050454b279707a7d9ce5a3cd0eba23201021cedcb78ae1a746c1b23227dcc418ee40dd074ade195359506797a5493550cc + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-sanitize-uri@npm:1.2.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-encode: ^1.0.0 + micromark-util-symbol: ^1.0.0 + checksum: 6663f365c4fe3961d622a580f4a61e34867450697f6806f027f21cf63c92989494895fcebe2345d52e249fe58a35be56e223a9776d084c9287818b40c779acc1 + languageName: node + linkType: hard + +"micromark-util-sanitize-uri@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" + dependencies: + micromark-util-character: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-symbol: ^2.0.0 + checksum: d01517840c17de67aaa0b0f03bfe05fac8a41d99723cd8ce16c62f6810e99cd3695364a34c335485018e5e2c00e69031744630a1b85c6868aa2f2ca1b36daa2f + languageName: node + linkType: hard + +"micromark-util-subtokenize@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-subtokenize@npm:1.1.0" + dependencies: + micromark-util-chunked: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: 4a9d780c4d62910e196ea4fd886dc4079d8e424e5d625c0820016da0ed399a281daff39c50f9288045cc4bcd90ab47647e5396aba500f0853105d70dc8b1fc45 + languageName: node + linkType: hard + +"micromark-util-subtokenize@npm:^2.0.0": + version: 2.0.4 + resolution: "micromark-util-subtokenize@npm:2.0.4" + dependencies: + devlop: ^1.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: a084e626773f0750747770226c017a2d31f30fa5bd7c7e9df62755681395fea7d8693eeb81b5f41a15a05db941f2491c37af5c23f05e50d2d9777e4036a2b6bb + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 02414a753b79f67ff3276b517eeac87913aea6c028f3e668a19ea0fc09d98aea9f93d6222a76ca783d20299af9e4b8e7c797fe516b766185dcc6e93290f11f88 + languageName: node + linkType: hard + +"micromark-util-symbol@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: fb7346950550bc85a55793dda94a8b3cb3abc068dbd7570d1162db7aee803411d06c0a5de4ae59cd945f46143bdeadd4bba02a02248fa0d18cc577babaa00044 + languageName: node + linkType: hard + +"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: b0ef2b4b9589f15aec2666690477a6a185536927ceb7aa55a0f46475852e012d75a1ab945187e5c7841969a842892164b15d58ff8316b8e0d6cc920cabd5ede7 + languageName: node + linkType: hard + +"micromark-util-types@npm:^2.0.0": + version: 2.0.1 + resolution: "micromark-util-types@npm:2.0.1" + checksum: 630aac466628a360962f478f69421599c53ff8b3080765201b7be3b3a4be7f4c5b73632b9a6dd426b9e06035353c18acccee637d6c43d9b0bf1c31111bbb88a7 + languageName: node + linkType: hard + +"micromark@npm:^3.0.0": + version: 3.2.0 + resolution: "micromark@npm:3.2.0" + dependencies: + "@types/debug": ^4.0.0 + debug: ^4.0.0 + decode-named-character-reference: ^1.0.0 + micromark-core-commonmark: ^1.0.1 + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-chunked: ^1.0.0 + micromark-util-combine-extensions: ^1.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-encode: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-resolve-all: ^1.0.0 + micromark-util-sanitize-uri: ^1.0.0 + micromark-util-subtokenize: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.1 + uvu: ^0.5.0 + checksum: 56c15851ad3eb8301aede65603473443e50c92a54849cac1dadd57e4ec33ab03a0a77f3df03de47133e6e8f695dae83b759b514586193269e98c0bf319ecd5e4 + languageName: node + linkType: hard + +"micromark@npm:^4.0.0": + version: 4.0.1 + resolution: "micromark@npm:4.0.1" + dependencies: + "@types/debug": ^4.0.0 + debug: ^4.0.0 + decode-named-character-reference: ^1.0.0 + devlop: ^1.0.0 + micromark-core-commonmark: ^2.0.0 + micromark-factory-space: ^2.0.0 + micromark-util-character: ^2.0.0 + micromark-util-chunked: ^2.0.0 + micromark-util-combine-extensions: ^2.0.0 + micromark-util-decode-numeric-character-reference: ^2.0.0 + micromark-util-encode: ^2.0.0 + micromark-util-normalize-identifier: ^2.0.0 + micromark-util-resolve-all: ^2.0.0 + micromark-util-sanitize-uri: ^2.0.0 + micromark-util-subtokenize: ^2.0.0 + micromark-util-symbol: ^2.0.0 + micromark-util-types: ^2.0.0 + checksum: 83ea084e8bf84442cc70c1207e916df11f0fde0ebd9daf978c895a1466c47a1dd4ed42b21b6e65bcc0d268fcbec24b4b1b28bc59c548940fe690929b8e0e7732 + languageName: node + linkType: hard + "micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -32846,6 +36874,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 79920eb634e6f400b464a954fcfa589c4e7c7143209488e44baf627f9affc8b1e306f41f4f0deedde97e69cb725920879462d3e750ab3bd3c1aed675bb3a8966 + languageName: node + linkType: hard + "miller-rabin@npm:^4.0.0": version: 4.0.1 resolution: "miller-rabin@npm:4.0.1" @@ -32913,6 +36951,13 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^1.0.0": + version: 1.0.1 + resolution: "mimic-response@npm:1.0.1" + checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 + languageName: node + linkType: hard + "mimic-response@npm:^3.1.0": version: 3.1.0 resolution: "mimic-response@npm:3.1.0" @@ -33002,7 +37047,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -33022,7 +37067,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.3": +"minimist@npm:^1.1.0, minimist@npm:^1.2.3, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -33388,7 +37433,7 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.2.0": +"mri@npm:^1.1.0, mri@npm:^1.2.0": version: 1.2.0 resolution: "mri@npm:1.2.0" checksum: 83f515abbcff60150873e424894a2f65d68037e5a7fcde8a9e2b285ee9c13ac581b63cfc1e6826c4732de3aeb84902f7c1e16b7aff46cd3f897a0f757a894e85 @@ -34020,6 +38065,61 @@ __metadata: languageName: node linkType: hard +"next@npm:^13.5.4": + version: 13.5.8 + resolution: "next@npm:13.5.8" + dependencies: + "@next/env": 13.5.8 + "@next/swc-darwin-arm64": 13.5.8 + "@next/swc-darwin-x64": 13.5.8 + "@next/swc-linux-arm64-gnu": 13.5.8 + "@next/swc-linux-arm64-musl": 13.5.8 + "@next/swc-linux-x64-gnu": 13.5.8 + "@next/swc-linux-x64-musl": 13.5.8 + "@next/swc-win32-arm64-msvc": 13.5.8 + "@next/swc-win32-ia32-msvc": 13.5.8 + "@next/swc-win32-x64-msvc": 13.5.8 + "@swc/helpers": 0.5.2 + busboy: 1.6.0 + caniuse-lite: ^1.0.30001406 + postcss: 8.4.31 + styled-jsx: 5.1.1 + watchpack: 2.4.0 + peerDependencies: + "@opentelemetry/api": ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + dependenciesMeta: + "@next/swc-darwin-arm64": + optional: true + "@next/swc-darwin-x64": + optional: true + "@next/swc-linux-arm64-gnu": + optional: true + "@next/swc-linux-arm64-musl": + optional: true + "@next/swc-linux-x64-gnu": + optional: true + "@next/swc-linux-x64-musl": + optional: true + "@next/swc-win32-arm64-msvc": + optional: true + "@next/swc-win32-ia32-msvc": + optional: true + "@next/swc-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@opentelemetry/api": + optional: true + sass: + optional: true + bin: + next: dist/bin/next + checksum: caf82f428b519139e39d9379da3f8cf2396bc5c5b0b329398f77c071b27bbca46e8638374fa8a3942173954ad55a586cfece4a3f9592ff743e06906304196019 + languageName: node + linkType: hard + "next@npm:^13.5.6": version: 13.5.7 resolution: "next@npm:13.5.7" @@ -34075,6 +38175,64 @@ __metadata: languageName: node linkType: hard +"next@npm:^14.1.3": + version: 14.2.24 + resolution: "next@npm:14.2.24" + dependencies: + "@next/env": 14.2.24 + "@next/swc-darwin-arm64": 14.2.24 + "@next/swc-darwin-x64": 14.2.24 + "@next/swc-linux-arm64-gnu": 14.2.24 + "@next/swc-linux-arm64-musl": 14.2.24 + "@next/swc-linux-x64-gnu": 14.2.24 + "@next/swc-linux-x64-musl": 14.2.24 + "@next/swc-win32-arm64-msvc": 14.2.24 + "@next/swc-win32-ia32-msvc": 14.2.24 + "@next/swc-win32-x64-msvc": 14.2.24 + "@swc/helpers": 0.5.5 + busboy: 1.6.0 + caniuse-lite: ^1.0.30001579 + graceful-fs: ^4.2.11 + postcss: 8.4.31 + styled-jsx: 5.1.1 + peerDependencies: + "@opentelemetry/api": ^1.1.0 + "@playwright/test": ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + dependenciesMeta: + "@next/swc-darwin-arm64": + optional: true + "@next/swc-darwin-x64": + optional: true + "@next/swc-linux-arm64-gnu": + optional: true + "@next/swc-linux-arm64-musl": + optional: true + "@next/swc-linux-x64-gnu": + optional: true + "@next/swc-linux-x64-musl": + optional: true + "@next/swc-win32-arm64-msvc": + optional: true + "@next/swc-win32-ia32-msvc": + optional: true + "@next/swc-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@opentelemetry/api": + optional: true + "@playwright/test": + optional: true + sass: + optional: true + bin: + next: dist/bin/next + checksum: b85053104c932b0e1b248623e2b40c78a6597ca3acf9bdad6040a9a2748b4badf59af7d0095ad54405f1b74d106f89797b4cbd072ad49d732f54b6df2e6fd8b7 + languageName: node + linkType: hard + "nice-try@npm:^1.0.4": version: 1.0.5 resolution: "nice-try@npm:1.0.5" @@ -34082,6 +38240,15 @@ __metadata: languageName: node linkType: hard +"no-case@npm:^2.2.0, no-case@npm:^2.3.2": + version: 2.3.2 + resolution: "no-case@npm:2.3.2" + dependencies: + lower-case: ^1.1.1 + checksum: 856487731936fef44377ca74fdc5076464aba2e0734b56a4aa2b2a23d5b154806b591b9b2465faa59bb982e2b5c9391e3685400957fb4eeb38f480525adcf3dd + languageName: node + linkType: hard + "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -34216,7 +38383,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:3.3.2": +"node-fetch@npm:3.3.2, node-fetch@npm:^3.3.2": version: 3.3.2 resolution: "node-fetch@npm:3.3.2" dependencies: @@ -34227,6 +38394,16 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^1.5.3": + version: 1.7.3 + resolution: "node-fetch@npm:1.7.3" + dependencies: + encoding: ^0.1.11 + is-stream: ^1.0.1 + checksum: 3bb0528c05d541316ebe52770d71ee25a6dce334df4231fd55df41a644143e07f068637488c18a5b0c43f05041dbd3346752f9e19b50df50569a802484544d5b + languageName: node + linkType: hard + "node-forge@npm:1.3.1, node-forge@npm:^1.3.1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -34344,6 +38521,32 @@ __metadata: languageName: node linkType: hard +"node-mocks-http@npm:^1.16.2": + version: 1.16.2 + resolution: "node-mocks-http@npm:1.16.2" + dependencies: + accepts: ^1.3.7 + content-disposition: ^0.5.3 + depd: ^1.1.0 + fresh: ^0.5.2 + merge-descriptors: ^1.0.1 + methods: ^1.1.2 + mime: ^1.3.4 + parseurl: ^1.3.3 + range-parser: ^1.2.0 + type-is: ^1.6.18 + peerDependencies: + "@types/express": ^4.17.21 || ^5.0.0 + "@types/node": "*" + peerDependenciesMeta: + "@types/express": + optional: true + "@types/node": + optional: true + checksum: 9d148c49947e2161dbfd55204f07352f3fd976a41dfe355a97bd932cb8d4dbf584be4058fc78b121a9d83f0b86397e00a591e87afa9a1ecfb0335608ef1ace96 + languageName: node + linkType: hard + "node-polyfill-webpack-plugin@npm:^2.0.1": version: 2.0.1 resolution: "node-polyfill-webpack-plugin@npm:2.0.1" @@ -34393,6 +38596,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 917dbced519f48c6289a44830a0ca6dc944c3ee9243c468ebd8515a41c97c8b2c256edb7f3f750416bc37952cc9608684e6483c7b6c6f39f6bd8d86c52cfe658 + languageName: node + linkType: hard + "node-releases@npm:^2.0.6": version: 2.0.6 resolution: "node-releases@npm:2.0.6" @@ -34499,6 +38709,15 @@ __metadata: languageName: node linkType: hard +"normalize-path@npm:^2.1.1": + version: 2.1.1 + resolution: "normalize-path@npm:2.1.1" + dependencies: + remove-trailing-separator: ^1.0.1 + checksum: 7e9cbdcf7f5b8da7aa191fbfe33daf290cdcd8c038f422faf1b8a83c972bf7a6d94c5be34c4326cb00fb63bc0fd97d9fbcfaf2e5d6142332c2cd36d2e1b86cea + languageName: node + linkType: hard + "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -34513,6 +38732,13 @@ __metadata: languageName: node linkType: hard +"normalize-url@npm:^6.0.1": + version: 6.1.0 + resolution: "normalize-url@npm:6.1.0" + checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 + languageName: node + linkType: hard + "normalize-url@npm:^8.0.0": version: 8.0.1 resolution: "normalize-url@npm:8.0.1" @@ -34647,6 +38873,13 @@ __metadata: languageName: node linkType: hard +"nullthrows@npm:^1.1.1": + version: 1.1.1 + resolution: "nullthrows@npm:1.1.1" + checksum: 10806b92121253eb1b08ecf707d92480f5331ba8ae5b23fa3eb0548ad24196eb797ed47606153006568a5733ea9e528a3579f21421f7828e09e7756f4bdd386f + languageName: node + linkType: hard + "number-allocator@npm:^1.0.9": version: 1.0.14 resolution: "number-allocator@npm:1.0.14" @@ -34780,6 +39013,13 @@ __metadata: languageName: node linkType: hard +"object-path@npm:^0.11.8": + version: 0.11.8 + resolution: "object-path@npm:0.11.8" + checksum: 684ccf0fb6b82f067dc81e2763481606692b8485bec03eb2a64e086a44dbea122b2b9ef44423a08e09041348fe4b4b67bd59985598f1652f67df95f0618f5968 + languageName: node + linkType: hard + "object-treeify@npm:^1.1.33": version: 1.1.33 resolution: "object-treeify@npm:1.1.33" @@ -35282,6 +39522,15 @@ __metadata: languageName: node linkType: hard +"os-locale@npm:^1.4.0": + version: 1.4.0 + resolution: "os-locale@npm:1.4.0" + dependencies: + lcid: ^1.0.0 + checksum: 0161a1b6b5a8492f99f4b47fe465df9fc521c55ba5414fce6444c45e2500487b8ed5b40a47a98a2363fe83ff04ab033785300ed8df717255ec4c3b625e55b1fb + languageName: node + linkType: hard + "os-name@npm:5.1.0": version: 5.1.0 resolution: "os-name@npm:5.1.0" @@ -35331,6 +39580,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^2.0.0": + version: 2.1.1 + resolution: "p-cancelable@npm:2.1.1" + checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf + languageName: node + linkType: hard + "p-cancelable@npm:^3.0.0": version: 3.0.0 resolution: "p-cancelable@npm:3.0.0" @@ -35354,6 +39610,15 @@ __metadata: languageName: node linkType: hard +"p-limit@npm:3.1.0, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + "p-limit@npm:^1.1.0": version: 1.3.0 resolution: "p-limit@npm:1.3.0" @@ -35372,15 +39637,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - "p-limit@npm:^4.0.0": version: 4.0.0 resolution: "p-limit@npm:4.0.0" @@ -35569,6 +39825,15 @@ __metadata: languageName: node linkType: hard +"param-case@npm:^2.1.0": + version: 2.1.1 + resolution: "param-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + checksum: 3a63dcb8d8dc7995a612de061afdc7bb6fe7bd0e6db994db8d4cae999ed879859fd24389090e1a0d93f4c9207ebf8c048c870f468a3f4767161753e03cb9ab58 + languageName: node + linkType: hard + "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -35656,6 +39921,32 @@ __metadata: languageName: node linkType: hard +"parse-entities@npm:^4.0.0": + version: 4.0.2 + resolution: "parse-entities@npm:4.0.2" + dependencies: + "@types/unist": ^2.0.0 + character-entities-legacy: ^3.0.0 + character-reference-invalid: ^2.0.0 + decode-named-character-reference: ^1.0.0 + is-alphanumerical: ^2.0.0 + is-decimal: ^2.0.0 + is-hexadecimal: ^2.0.0 + checksum: db22b46da1a62af00409c929ac49fbd306b5ebf0dbacf4646d2ae2b58616ef90a40eedc282568a3cf740fac2a7928bc97146973a628f6977ca274dedc2ad6edc + languageName: node + linkType: hard + +"parse-filepath@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-filepath@npm:1.0.2" + dependencies: + is-absolute: ^1.0.0 + map-cache: ^0.2.0 + path-root: ^0.1.1 + checksum: 6794c3f38d3921f0f7cc63fb1fb0c4d04cd463356ad389c8ce6726d3c50793b9005971f4138975a6d7025526058d5e65e9bfe634d0765e84c4e2571152665a69 + languageName: node + linkType: hard + "parse-headers@npm:^2.0.0": version: 2.0.5 resolution: "parse-headers@npm:2.0.5" @@ -35663,6 +39954,15 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^2.2.0": + version: 2.2.0 + resolution: "parse-json@npm:2.2.0" + dependencies: + error-ex: ^1.2.0 + checksum: dda78a63e57a47b713a038630868538f718a7ca0cd172a36887b0392ccf544ed0374902eb28f8bf3409e8b71d62b79d17062f8543afccf2745f9b0b2d2bb80ca + languageName: node + linkType: hard + "parse-json@npm:^4.0.0": version: 4.0.0 resolution: "parse-json@npm:4.0.0" @@ -35733,7 +40033,7 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^6.0.1": +"parse5@npm:^6.0.0, parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd @@ -35766,6 +40066,16 @@ __metadata: languageName: node linkType: hard +"pascal-case@npm:^2.0.0": + version: 2.0.1 + resolution: "pascal-case@npm:2.0.1" + dependencies: + camel-case: ^3.0.0 + upper-case-first: ^1.1.0 + checksum: 4c539bf556572812f64a02fc6b544f3d2b51db12aed484e5162ed7f8ac2b366775d15e536091c890d71d82bdf9153128321f21574721b3a984bd85df9e519a35 + languageName: node + linkType: hard + "pascal-case@npm:^3.1.2": version: 3.1.2 resolution: "pascal-case@npm:3.1.2" @@ -35837,6 +40147,34 @@ __metadata: languageName: node linkType: hard +"path-case@npm:^2.1.0": + version: 2.1.1 + resolution: "path-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + checksum: eb1da508c28378715cbe4ce054ee5f83a570c5010f041f4cfb439c811f7a78e36c46f26a8d59b2594c3882b53db06ef26195519c27f86523dc5d19c2e29f306d + languageName: node + linkType: hard + +"path-case@npm:^3.0.4": + version: 3.0.4 + resolution: "path-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: 61de0526222629f65038a66f63330dd22d5b54014ded6636283e1d15364da38b3cf29e4433aa3f9d8b0dba407ae2b059c23b0104a34ee789944b1bc1c5c7e06d + languageName: node + linkType: hard + +"path-exists@npm:^2.0.0": + version: 2.1.0 + resolution: "path-exists@npm:2.1.0" + dependencies: + pinkie-promise: ^2.0.0 + checksum: fdb734f1d00f225f7a0033ce6d73bff6a7f76ea08936abf0e5196fa6e54a645103538cd8aedcb90d6d8c3fa3705ded0c58a4da5948ae92aa8834892c1ab44a84 + languageName: node + linkType: hard + "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -35893,6 +40231,22 @@ __metadata: languageName: node linkType: hard +"path-root-regex@npm:^0.1.0": + version: 0.1.2 + resolution: "path-root-regex@npm:0.1.2" + checksum: dcd75d1f8e93faabe35a58e875b0f636839b3658ff2ad8c289463c40bc1a844debe0dab73c3398ef9dc8f6ec6c319720aff390cf4633763ddcf3cf4b1bbf7e8b + languageName: node + linkType: hard + +"path-root@npm:^0.1.1": + version: 0.1.1 + resolution: "path-root@npm:0.1.1" + dependencies: + path-root-regex: ^0.1.0 + checksum: ff88aebfc1c59ace510cc06703d67692a11530989920427625e52b66a303ca9b3d4059b0b7d0b2a73248d1ad29bcb342b8b786ec00592f3101d38a45fd3b2e08 + languageName: node + linkType: hard + "path-scurry@npm:^1.10.0, path-scurry@npm:^1.10.1, path-scurry@npm:^1.6.1": version: 1.10.1 resolution: "path-scurry@npm:1.10.1" @@ -35941,6 +40295,17 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^1.0.0": + version: 1.1.0 + resolution: "path-type@npm:1.1.0" + dependencies: + graceful-fs: ^4.1.2 + pify: ^2.0.0 + pinkie-promise: ^2.0.0 + checksum: 59a4b2c0e566baf4db3021a1ed4ec09a8b36fca960a490b54a6bcefdb9987dafe772852982b6011cd09579478a96e57960a01f75fa78a794192853c9d468fc79 + languageName: node + linkType: hard + "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -36151,6 +40516,13 @@ __metadata: languageName: node linkType: hard +"phenomenon@npm:^1.6.0": + version: 1.6.0 + resolution: "phenomenon@npm:1.6.0" + checksum: e05ca8223a9df42c5cee02c082103ef96a349424fec18a8478d2171060a63095e21bef394529263c64d8082aff43204a0fa1355211fd7ac2a338c2839fffbca3 + languageName: node + linkType: hard + "phin@npm:^2.9.1": version: 2.9.3 resolution: "phin@npm:2.9.3" @@ -36218,7 +40590,7 @@ __metadata: languageName: node linkType: hard -"pify@npm:^2.3.0": +"pify@npm:^2.0.0, pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba @@ -36248,6 +40620,15 @@ __metadata: languageName: node linkType: hard +"pinkie-promise@npm:^2.0.0": + version: 2.0.1 + resolution: "pinkie-promise@npm:2.0.1" + dependencies: + pinkie: ^2.0.0 + checksum: b53a4a2e73bf56b6f421eef711e7bdcb693d6abb474d57c5c413b809f654ba5ee750c6a96dd7225052d4b96c4d053cdcb34b708a86fceed4663303abee52fcca + languageName: node + linkType: hard + "pinkie@npm:^1.0.0": version: 1.0.0 resolution: "pinkie@npm:1.0.0" @@ -36255,6 +40636,13 @@ __metadata: languageName: node linkType: hard +"pinkie@npm:^2.0.0": + version: 2.0.4 + resolution: "pinkie@npm:2.0.4" + checksum: b12b10afea1177595aab036fc220785488f67b4b0fc49e7a27979472592e971614fa1c728e63ad3e7eb748b4ec3c3dbd780819331dad6f7d635c77c10537b9db + languageName: node + linkType: hard + "pirates@npm:^4.0.1, pirates@npm:^4.0.5": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -36334,6 +40722,15 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:^1.38.1": + version: 1.50.1 + resolution: "playwright-core@npm:1.50.1" + bin: + playwright-core: cli.js + checksum: 9c9c3115e8c39c9a2f4e0dc5b2bc1d76925fb0244051ace2bcffc7b2b66cf6fe1b96d9162f81bc7d9b7811b8c6f9df5aa93052d1284bfd6d30203bf4f7b58868 + languageName: node + linkType: hard + "playwright@npm:1.45.3": version: 1.45.3 resolution: "playwright@npm:1.45.3" @@ -37029,6 +41426,33 @@ __metadata: languageName: node linkType: hard +"prism-react-renderer@npm:^1.3.5": + version: 1.3.5 + resolution: "prism-react-renderer@npm:1.3.5" + peerDependencies: + react: ">=0.14.9" + checksum: c18806dcbc4c0b4fd6fd15bd06b4f7c0a6da98d93af235c3e970854994eb9b59e23315abb6cfc29e69da26d36709a47e25da85ab27fed81b6812f0a52caf6dfa + languageName: node + linkType: hard + +"prisma-field-encryption@npm:^1.4.0": + version: 1.6.0 + resolution: "prisma-field-encryption@npm:1.6.0" + dependencies: + "@47ng/cloak": ^1.2.0 + "@prisma/generator-helper": ^5.9.1 + debug: ^4.3.4 + immer: ^10.0.3 + object-path: ^0.11.8 + zod: ^3.22.4 + peerDependencies: + "@prisma/client": ">= 4.7" + bin: + prisma-field-encryption: dist/generator/main.js + checksum: 70a63e6ba316b17982288f01ce69a268ed924d6ca4b25082297ceedc75bc1aacbef20703d0e6356518a599107bc7a61ecec7964cb698a93e8076044291f31890 + languageName: node + linkType: hard + "prisma-kysely@npm:^1.7.1": version: 1.8.0 resolution: "prisma-kysely@npm:1.8.0" @@ -37214,6 +41638,13 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^6.0.0": + version: 6.5.0 + resolution: "property-information@npm:6.5.0" + checksum: 6e55664e2f64083b715011e5bafaa1e694faf36986c235b0907e95d09259cc37c38382e3cc94a4c3f56366e05336443db12c8a0f0968a8c0a1b1416eebfc8f53 + languageName: node + linkType: hard + "proto-list@npm:~1.2.1": version: 1.2.4 resolution: "proto-list@npm:1.2.4" @@ -37432,6 +41863,22 @@ __metadata: languageName: node linkType: hard +"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5, pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" + dependencies: + tslib: ^2.8.1 + checksum: 97b023b46d7b95bff004f8340efc465c1d995f35d7e97a2ef2e28d5e160f5ca47b48f42463b6be92b4341452a6b8c555feb2b1eb59ee90b97bd5d6fc86ffb186 + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3": + version: 1.1.3 + resolution: "pvutils@npm:1.1.3" + checksum: 2ee26a9e5176c348977d6ec00d8ee80bff62f51743b1c5fe8abeeb4c5d29d9959cdfe0ce146707a9e6801bce88190fed3002d720b072dc87d031c692820b44c9 + languageName: node + linkType: hard + "q@npm:2.0.x": version: 2.0.3 resolution: "q@npm:2.0.3" @@ -37724,6 +42171,16 @@ __metadata: languageName: node linkType: hard +"react-chartjs-2@npm:^4.0.1": + version: 4.3.1 + resolution: "react-chartjs-2@npm:4.3.1" + peerDependencies: + chart.js: ^3.5.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 574d12cc43b9b4a0f1e04cc692982e16ef7083c03da2a8a9fc2180fe9bcadc793008f81d8f4eec5465925eff84c95d7c523cb74376858b363ae75a83bb3c2a5d + languageName: node + linkType: hard + "react-colorful@npm:^5.1.2": version: 5.6.1 resolution: "react-colorful@npm:5.6.1" @@ -37744,6 +42201,17 @@ __metadata: languageName: node linkType: hard +"react-confetti@npm:^6.0.1": + version: 6.2.2 + resolution: "react-confetti@npm:6.2.2" + dependencies: + tween-functions: ^1.2.0 + peerDependencies: + react: ^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 + checksum: df470c7fae00c1db6b50562469916f900f1beaf3fcd3c735146e5c55cc3e79bb142851d10b8b9b493e347a016c94156b50564ca9ec4f9864ea02d2eae5fb9559 + languageName: node + linkType: hard + "react-copy-to-clipboard@npm:5.0.4": version: 5.0.4 resolution: "react-copy-to-clipboard@npm:5.0.4" @@ -37777,6 +42245,23 @@ __metadata: languageName: node linkType: hard +"react-datocms@npm:^3.1.0": + version: 3.1.4 + resolution: "react-datocms@npm:3.1.4" + dependencies: + datocms-listen: ^0.1.9 + datocms-structured-text-generic-html-renderer: ^2.0.1 + datocms-structured-text-utils: ^2.0.1 + react-intersection-observer: ^8.33.1 + react-string-replace: ^1.1.0 + universal-base64: ^2.1.0 + use-deep-compare-effect: ^1.6.1 + peerDependencies: + react: ">= 16.12.0" + checksum: 54aba12aef4937175c2011548a8a576c96c8d8a596e84d191826910624c1d596e76a49782689dc236388a10803b02e700ac820cb7500cca7fd147a81f6c544c3 + languageName: node + linkType: hard + "react-day-picker@npm:^8.10.1": version: 8.10.1 resolution: "react-day-picker@npm:8.10.1" @@ -37799,6 +42284,18 @@ __metadata: languageName: node linkType: hard +"react-device-detect@npm:^2.2.2": + version: 2.2.3 + resolution: "react-device-detect@npm:2.2.3" + dependencies: + ua-parser-js: ^1.0.33 + peerDependencies: + react: ">= 0.14.0" + react-dom: ">= 0.14.0" + checksum: 42d9b3182b9d2495bf0d7914c9f370da51d8bdb853a3eba2acaf433894ae760386a075ba103185be825b33d42f50d85ef462087f261656d433f4c74dab23861f + languageName: node + linkType: hard + "react-devtools-core@npm:^4.19.1": version: 4.24.6 resolution: "react-devtools-core@npm:4.24.6" @@ -37893,6 +42390,16 @@ __metadata: languageName: node linkType: hard +"react-fast-marquee@npm:^1.6.4": + version: 1.6.5 + resolution: "react-fast-marquee@npm:1.6.5" + peerDependencies: + react: ">= 16.8.0 || ^18.0.0" + react-dom: ">= 16.8.0 || ^18.0.0" + checksum: 5213b10983f47a2dc27c3206144f96b37dad2f08457b19ecb9e393e4bd3c8db8c9cccf1758ceb5c4ca6d697e3715f3f90c5d806e4cb62bbbad9ece7f0e7b3caf + languageName: node + linkType: hard + "react-fit@npm:^1.4.0": version: 1.4.0 resolution: "react-fit@npm:1.4.0" @@ -37916,6 +42423,17 @@ __metadata: languageName: node linkType: hard +"react-github-btn@npm:^1.4.0": + version: 1.4.0 + resolution: "react-github-btn@npm:1.4.0" + dependencies: + github-buttons: ^2.22.0 + peerDependencies: + react: ">=16.3.0" + checksum: 33a416ad76ab4cc9238ac5cf5cfcab636bb2127c48fb30805385350fd3a3c2aa0aaeb78f6c726c52a0d3d133ca469be35d4b3d188c8e40c735c7ff458d2c8c3c + languageName: node + linkType: hard + "react-hook-form@npm:^7.43.3": version: 7.43.3 resolution: "react-hook-form@npm:7.43.3" @@ -37989,6 +42507,15 @@ __metadata: languageName: node linkType: hard +"react-intersection-observer@npm:^8.33.1": + version: 8.34.0 + resolution: "react-intersection-observer@npm:8.34.0" + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0 + checksum: 7713fecfd1512c7f5a60f9f0bf15403b8f8bbd4110bcafaeaea6de36a0e0eb60368c3638f99e9c97b75ad8fc787ea48c241dcb5c694f821d7f2976f709082cc5 + languageName: node + linkType: hard + "react-intl@npm:^5.25.1": version: 5.25.1 resolution: "react-intl@npm:5.25.1" @@ -38057,6 +42584,34 @@ __metadata: languageName: node linkType: hard +"react-markdown@npm:^9.0.1": + version: 9.0.3 + resolution: "react-markdown@npm:9.0.3" + dependencies: + "@types/hast": ^3.0.0 + devlop: ^1.0.0 + hast-util-to-jsx-runtime: ^2.0.0 + html-url-attributes: ^3.0.0 + mdast-util-to-hast: ^13.0.0 + remark-parse: ^11.0.0 + remark-rehype: ^11.0.0 + unified: ^11.0.0 + unist-util-visit: ^5.0.0 + vfile: ^6.0.0 + peerDependencies: + "@types/react": ">=18" + react: ">=18" + checksum: 7ebb01b295f7c9acddcd305308a8531c58c582c24fb8d6a4897f16b21ba0bd7e9e20ddae4a9024767e910310d22db0003489b61478cdb491a3d802343cf3a931 + languageName: node + linkType: hard + +"react-merge-refs@npm:1.1.0": + version: 1.1.0 + resolution: "react-merge-refs@npm:1.1.0" + checksum: 90884352999002d868ab9f1bcfe3222fb0f2178ed629f1da7e98e5a9b02a2c96b4aa72800db92aabd69d2483211b4be57a2088e89a11a0b660e7ada744d4ddf7 + languageName: node + linkType: hard + "react-multi-email@npm:^0.5.3": version: 0.5.3 resolution: "react-multi-email@npm:0.5.3" @@ -38258,6 +42813,18 @@ __metadata: languageName: node linkType: hard +"react-resize-detector@npm:^9.1.0": + version: 9.1.1 + resolution: "react-resize-detector@npm:9.1.1" + dependencies: + lodash: ^4.17.21 + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 0612b4416212962e5762f25e20c7016bdce3107d745a399b44bc099a04488a704228908357845c2e3fa49bf9902077f0eeebc99cf76d42ea479a8aa79f4c5b9d + languageName: node + linkType: hard + "react-schemaorg@npm:^2.0.0": version: 2.0.0 resolution: "react-schemaorg@npm:2.0.0" @@ -38332,6 +42899,13 @@ __metadata: languageName: node linkType: hard +"react-string-replace@npm:^1.1.0": + version: 1.1.1 + resolution: "react-string-replace@npm:1.1.1" + checksum: fd5058bbb3953f4bb2daa7012630a154c6109e3e848f93925e146710cebf527647a7c1496c89ca0b5d9e4b4f8ffd5c55ca631539095039faaba0a7ba3787e7cb + languageName: node + linkType: hard + "react-style-singleton@npm:^2.1.0": version: 2.1.1 resolution: "react-style-singleton@npm:2.1.1" @@ -38450,6 +43024,20 @@ __metadata: languageName: node linkType: hard +"react-twemoji@npm:^0.3.0": + version: 0.3.0 + resolution: "react-twemoji@npm:0.3.0" + dependencies: + lodash.isequal: ^4.5.0 + prop-types: ^15.7.2 + twemoji: ^13.0.1 + peerDependencies: + react: ^16.4.2 + react-dom: ^16.4.2 + checksum: d4e56477c28c0ad65b98a062a2e9a1777b808a16c05dfa35d77d84fea26f7d1e884d2e30f95a8f14c94c31330d3d4f53a4fd0bfce917bc4be9fb21d34a05db8a + languageName: node + linkType: hard + "react-universal-interface@npm:^0.6.2": version: 0.6.2 resolution: "react-universal-interface@npm:0.6.2" @@ -38470,6 +43058,19 @@ __metadata: languageName: node linkType: hard +"react-use-measure@npm:^2.1.1": + version: 2.1.7 + resolution: "react-use-measure@npm:2.1.7" + peerDependencies: + react: ">=16.13" + react-dom: ">=16.13" + peerDependenciesMeta: + react-dom: + optional: true + checksum: 5f00c14cf50b0710cdbd27b63a005be20283099d2fa2723a97f3a1cf0b2daedddd67249520c21e49e95348f56428689f3229c343dcb9ed37da58f9c227d29bee + languageName: node + linkType: hard + "react-use@npm:^17.4.2": version: 17.5.0 resolution: "react-use@npm:17.5.0" @@ -38506,6 +43107,15 @@ __metadata: languageName: node linkType: hard +"react-wrap-balancer@npm:^1.0.0": + version: 1.1.1 + resolution: "react-wrap-balancer@npm:1.1.1" + peerDependencies: + react: ">=16.8.0 || ^17.0.0 || ^18" + checksum: 68d9417efa751eced4a8c9f7e3f1f43d59fbf9ecf42dfd90b7b4c33f5af855766bb21bf967c9fc8a0f09f6ca4a58071c1dd47af2c813b33b3813ebe7efcb32f2 + languageName: node + linkType: hard + "react@npm:^18, react@npm:^18.2.0": version: 18.2.0 resolution: "react@npm:18.2.0" @@ -38535,6 +43145,27 @@ __metadata: languageName: node linkType: hard +"read-pkg-up@npm:^1.0.1": + version: 1.0.1 + resolution: "read-pkg-up@npm:1.0.1" + dependencies: + find-up: ^1.0.0 + read-pkg: ^1.0.0 + checksum: d18399a0f46e2da32beb2f041edd0cda49d2f2cc30195a05c759ef3ed9b5e6e19ba1ad1bae2362bdec8c6a9f2c3d18f4d5e8c369e808b03d498d5781cb9122c7 + languageName: node + linkType: hard + +"read-pkg@npm:^1.0.0": + version: 1.1.0 + resolution: "read-pkg@npm:1.1.0" + dependencies: + load-json-file: ^1.0.0 + normalize-package-data: ^2.3.2 + path-type: ^1.0.0 + checksum: a0f5d5e32227ec8e6a028dd5c5134eab229768dcb7a5d9a41a284ed28ad4b9284fecc47383dc1593b5694f4de603a7ffaee84b738956b9b77e0999567485a366 + languageName: node + linkType: hard + "read-pkg@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg@npm:3.0.0" @@ -38900,6 +43531,13 @@ __metadata: languageName: node linkType: hard +"regenerator-runtime@npm:^0.11.0": + version: 0.11.1 + resolution: "regenerator-runtime@npm:0.11.1" + checksum: 3c97bd2c7b2b3247e6f8e2147a002eb78c995323732dad5dc70fac8d8d0b758d0295e7015b90d3d444446ae77cbd24b9f9123ec3a77018e81d8999818301b4f4 + languageName: node + linkType: hard + "regenerator-runtime@npm:^0.13.3": version: 0.13.9 resolution: "regenerator-runtime@npm:0.13.9" @@ -39045,6 +43683,17 @@ __metadata: languageName: node linkType: hard +"relay-runtime@npm:12.0.0": + version: 12.0.0 + resolution: "relay-runtime@npm:12.0.0" + dependencies: + "@babel/runtime": ^7.0.0 + fbjs: ^3.0.0 + invariant: ^2.2.4 + checksum: 51cdc8a5e04188982452ae4e7c6ac7d6375ee769130d24ce8e8f9cdd45aa7e11ecd68670f56e30dcee1b4974585e88ecce19e69a9868b80cda0db7678c3b8f0a + languageName: node + linkType: hard + "release-it@npm:^17.1.1": version: 17.1.1 resolution: "release-it@npm:17.1.1" @@ -39095,6 +43744,55 @@ __metadata: languageName: node linkType: hard +"remark-html@npm:^14.0.1": + version: 14.0.1 + resolution: "remark-html@npm:14.0.1" + dependencies: + "@types/mdast": ^3.0.0 + hast-util-sanitize: ^4.0.0 + hast-util-to-html: ^8.0.0 + mdast-util-to-hast: ^11.0.0 + unified: ^10.0.0 + checksum: 5d689b05dc6b4f24e08ece07aabca98685949198a8b6ceacb2fbf7fba8f45f55cea5623caddfd92aaf6e6f082bc1c93797dfb82dc48a6f6e1c5263947a4779c9 + languageName: node + linkType: hard + +"remark-parse@npm:^10.0.0": + version: 10.0.2 + resolution: "remark-parse@npm:10.0.2" + dependencies: + "@types/mdast": ^3.0.0 + mdast-util-from-markdown: ^1.0.0 + unified: ^10.0.0 + checksum: 5041b4b44725f377e69986e02f8f072ae2222db5e7d3b6c80829756b842e811343ffc2069cae1f958a96bfa36104ab91a57d7d7e2f0cef521e210ab8c614d5c7 + languageName: node + linkType: hard + +"remark-parse@npm:^11.0.0": + version: 11.0.0 + resolution: "remark-parse@npm:11.0.0" + dependencies: + "@types/mdast": ^4.0.0 + mdast-util-from-markdown: ^2.0.0 + micromark-util-types: ^2.0.0 + unified: ^11.0.0 + checksum: d83d245290fa84bb04fb3e78111f09c74f7417e7c012a64dd8dc04fccc3699036d828fbd8eeec8944f774b6c30cc1d925c98f8c46495ebcee7c595496342ab7f + languageName: node + linkType: hard + +"remark-rehype@npm:^11.0.0": + version: 11.1.1 + resolution: "remark-rehype@npm:11.1.1" + dependencies: + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + mdast-util-to-hast: ^13.0.0 + unified: ^11.0.0 + vfile: ^6.0.0 + checksum: e199dff098ae6a560e13dd1778dec9c61440f979cc931c4ca4dcde0d58e51c0723243a901c1842379b189083cf4d74f224f57833738095ffa9535179d7cf3f01 + languageName: node + linkType: hard + "remark-slug@npm:^6.0.0": version: 6.1.0 resolution: "remark-slug@npm:6.1.0" @@ -39106,6 +43804,29 @@ __metadata: languageName: node linkType: hard +"remark-stringify@npm:^10.0.0": + version: 10.0.3 + resolution: "remark-stringify@npm:10.0.3" + dependencies: + "@types/mdast": ^3.0.0 + mdast-util-to-markdown: ^1.0.0 + unified: ^10.0.0 + checksum: 6004e204fba672ee322c3cf0bef090e95802feedf7ef875f88b120c5e6208f1eb09c014486d5ca42a1e199c0a17ce0ed165fb248c66608458afed4bdca51dd3a + languageName: node + linkType: hard + +"remark@npm:^14.0.2": + version: 14.0.3 + resolution: "remark@npm:14.0.3" + dependencies: + "@types/mdast": ^3.0.0 + remark-parse: ^10.0.0 + remark-stringify: ^10.0.0 + unified: ^10.0.0 + checksum: 36eec9668c5f5e497507fa5d396c79183265a5f7dd204a608e7f031a4f61b48f7bb5cfaec212f5614ccd1266cc4a9f8d7a59a45e95aed9876986b4c453b191be + languageName: node + linkType: hard + "remarkable@npm:^2.0.1": version: 2.0.1 resolution: "remarkable@npm:2.0.1" @@ -39118,6 +43839,20 @@ __metadata: languageName: node linkType: hard +"remeda@npm:^1.24.1": + version: 1.61.0 + resolution: "remeda@npm:1.61.0" + checksum: c080da71953ccc178334ca774f0da5c3f4664ef25ff7bc1e1f09a921ff9c264bbf8be8e0ac876c4a3f851a4d3e017cd454319a0e24610fd744bd8f9177dd4c7b + languageName: node + linkType: hard + +"remedial@npm:^1.0.7": + version: 1.0.8 + resolution: "remedial@npm:1.0.8" + checksum: 12df7c55eb92501d7f33cfe5f5ad12be13bb6ac0c53f494aaa9963d5a5155bb8be2143e8d5e17afa1a500ef5dc71d13642920d35350f2a31b65a9778afab6869 + languageName: node + linkType: hard + "remove-markdown@npm:^0.5.0": version: 0.5.0 resolution: "remove-markdown@npm:0.5.0" @@ -39125,6 +43860,20 @@ __metadata: languageName: node linkType: hard +"remove-trailing-separator@npm:^1.0.1": + version: 1.1.0 + resolution: "remove-trailing-separator@npm:1.1.0" + checksum: d3c20b5a2d987db13e1cca9385d56ecfa1641bae143b620835ac02a6b70ab88f68f117a0021838db826c57b31373d609d52e4f31aca75fc490c862732d595419 + languageName: node + linkType: hard + +"remove-trailing-spaces@npm:^1.0.6": + version: 1.0.9 + resolution: "remove-trailing-spaces@npm:1.0.9" + checksum: a1a839ca5f17298fe37236f0515f51f04ea2777882227b1c2e4856f65f0e061c5e44c2f57ffa4bf5f901ebb6b17d7873f475fa02aeafbbd52f77595872adf3d2 + languageName: node + linkType: hard + "renderkid@npm:^3.0.0": version: 3.0.0 resolution: "renderkid@npm:3.0.0" @@ -39205,6 +43954,13 @@ __metadata: languageName: node linkType: hard +"require-main-filename@npm:^1.0.1": + version: 1.0.1 + resolution: "require-main-filename@npm:1.0.1" + checksum: 1fef30754da961f4e13c450c3eb60c7ae898a529c6ad6fa708a70bd2eed01564ceb299187b2899f5562804d797a059f39a5789884d0ac7b7ae1defc68fba4abf + languageName: node + linkType: hard + "require-main-filename@npm:^2.0.0": version: 2.0.0 resolution: "require-main-filename@npm:2.0.0" @@ -39233,7 +43989,7 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.2.0": +"resolve-alpn@npm:^1.0.0, resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 @@ -39249,6 +44005,13 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:5.0.0, resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -39256,13 +44019,6 @@ __metadata: languageName: node linkType: hard -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - "resolve-url-loader@npm:^5.0.0": version: 5.0.0 resolution: "resolve-url-loader@npm:5.0.0" @@ -39453,6 +44209,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: ^2.0.0 + checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a + languageName: node + linkType: hard + "responselike@npm:^3.0.0": version: 3.0.0 resolution: "responselike@npm:3.0.0" @@ -39891,7 +44656,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:7.8.1, rxjs@npm:^7.8.1": +"rxjs@npm:7.8.1, rxjs@npm:^7.0.0, rxjs@npm:^7.8.1": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -39909,6 +44674,22 @@ __metadata: languageName: node linkType: hard +"s-ago@npm:^2.2.0": + version: 2.2.0 + resolution: "s-ago@npm:2.2.0" + checksum: f665fef44d9d88322ce5a798ca3c49b40f96231ddc7bd46dc23c883e98215675aa422985760d45d3779faa3c0bc94edb2a50630bf15f54c239d11963e53d998c + languageName: node + linkType: hard + +"sade@npm:^1.7.3": + version: 1.8.1 + resolution: "sade@npm:1.8.1" + dependencies: + mri: ^1.1.0 + checksum: 0756e5b04c51ccdc8221ebffd1548d0ce5a783a44a0fa9017a026659b97d632913e78f7dca59f2496aa996a0be0b0c322afd87ca72ccd909406f49dbffa0f45d + languageName: node + linkType: hard + "safe-array-concat@npm:^1.0.1": version: 1.1.0 resolution: "safe-array-concat@npm:1.1.0" @@ -40143,6 +44924,13 @@ __metadata: languageName: node linkType: hard +"scuid@npm:^1.1.0": + version: 1.1.0 + resolution: "scuid@npm:1.1.0" + checksum: cd094ac3718b0070a222f9a499b280c698fdea10268cc163fa244421099544c1766dd893fdee0e2a8eba5d53ab9d0bcb11067bedff166665030fa6fda25a096b + languageName: node + linkType: hard + "section-matter@npm:^1.0.0": version: 1.0.0 resolution: "section-matter@npm:1.0.0" @@ -40281,6 +45069,27 @@ __metadata: languageName: node linkType: hard +"sentence-case@npm:^2.1.0": + version: 2.1.1 + resolution: "sentence-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + upper-case-first: ^1.1.2 + checksum: ce5ca48804051e056a6956ad75a1a7d833e5d8f5021a015d380a22d3cf04496d5238de2e5c876d9701a9218633052c3a65911ca1b6460d36a41ecad46e81d139 + languageName: node + linkType: hard + +"sentence-case@npm:^3.0.4": + version: 3.0.4 + resolution: "sentence-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case-first: ^2.0.2 + checksum: 3cfe6c0143e649132365695706702d7f729f484fa7b25f43435876efe7af2478243eefb052bacbcce10babf9319fd6b5b6bc59b94c80a1c819bcbb40651465d5 + languageName: node + linkType: hard + "seq-queue@npm:^0.0.5": version: 0.0.5 resolution: "seq-queue@npm:0.0.5" @@ -40399,7 +45208,7 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.4": +"setimmediate@npm:^1.0.4, setimmediate@npm:^1.0.5": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd @@ -40497,6 +45306,13 @@ __metadata: languageName: node linkType: hard +"shell-quote@npm:^1.7.3": + version: 1.8.2 + resolution: "shell-quote@npm:1.8.2" + checksum: 1e97b62ced1c4c5135015978ebf273bed1f425a68cf84163e83fbb0f34b3ff9471e656720dab2b7cbb4ae0f58998e686d17d166c28dfb3662acd009e8bd7faed + languageName: node + linkType: hard + "shelljs@npm:0.8.5": version: 0.8.5 resolution: "shelljs@npm:0.8.5" @@ -40571,6 +45387,13 @@ __metadata: languageName: node linkType: hard +"signedsource@npm:^1.0.0": + version: 1.0.0 + resolution: "signedsource@npm:1.0.0" + checksum: 64b2c8d7a48de9009cfd3aff62bb7c88abf3b8e0421f17ebb1d7f5ca9cc9c3ad10f5a1e3ae6cd804e4e6121c87b668202ae9057065f058ddfbf34ea65f63945d + languageName: node + linkType: hard + "simple-concat@npm:^1.0.0": version: 1.0.1 resolution: "simple-concat@npm:1.0.1" @@ -40728,6 +45551,25 @@ __metadata: languageName: node linkType: hard +"snake-case@npm:^2.1.0": + version: 2.1.0 + resolution: "snake-case@npm:2.1.0" + dependencies: + no-case: ^2.2.0 + checksum: 7e42b4841103be4dd050b2f57f5cb423d5164524c1cb3d81efda9809265a82a2d02ddf44361beae37d75a239308e6414be85fe441dc48cd70c708cb975387d10 + languageName: node + linkType: hard + +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: 0a7a79900bbb36f8aaa922cf111702a3647ac6165736d5dc96d3ef367efc50465cac70c53cd172c382b022dac72ec91710608e5393de71f76d7142e6fd80e8a3 + languageName: node + linkType: hard + "socks-proxy-agent@npm:^7.0.0": version: 7.0.0 resolution: "socks-proxy-agent@npm:7.0.0" @@ -40898,6 +45740,13 @@ __metadata: languageName: node linkType: hard +"space-separated-tokens@npm:^2.0.0": + version: 2.0.2 + resolution: "space-separated-tokens@npm:2.0.2" + checksum: 202e97d7ca1ba0758a0aa4fe226ff98142073bcceeff2da3aad037968878552c3bbce3b3231970025375bbba5aee00c5b8206eda408da837ab2dc9c0f26be990 + languageName: node + linkType: hard + "spacetime@npm:^7.1.4": version: 7.1.4 resolution: "spacetime@npm:7.1.4" @@ -40914,6 +45763,13 @@ __metadata: languageName: node linkType: hard +"spawn-command@npm:^0.0.2-1": + version: 0.0.2 + resolution: "spawn-command@npm:0.0.2" + checksum: e35c5d28177b4d461d33c88cc11f6f3a5079e2b132c11e1746453bbb7a0c0b8a634f07541a2a234fa4758239d88203b758def509161b651e81958894c0b4b64b + languageName: node + linkType: hard + "spawndamnit@npm:^2.0.0": version: 2.0.0 resolution: "spawndamnit@npm:2.0.0" @@ -40990,6 +45846,15 @@ __metadata: languageName: node linkType: hard +"sponge-case@npm:^1.0.1": + version: 1.0.1 + resolution: "sponge-case@npm:1.0.1" + dependencies: + tslib: ^2.0.3 + checksum: 64f53d930f63c5a9e59d4cae487c1ffa87d25eab682833b01d572cc885e7e3fdbad4f03409a41f03ecb27f1f8959432253eb48332c7007c3388efddb24ba2792 + languageName: node + linkType: hard + "sprintf-js@npm:^1.1.2": version: 1.1.2 resolution: "sprintf-js@npm:1.1.2" @@ -41370,6 +46235,13 @@ __metadata: languageName: node linkType: hard +"string-env-interpolation@npm:^1.0.1": + version: 1.0.1 + resolution: "string-env-interpolation@npm:1.0.1" + checksum: d126329587f635bee65300e4451e7352b9b67e03daeb62f006ca84244cac12a1f6e45176b018653ba0c3ec3b5d980f9ca59d2eeed99cf799501cdaa7f871dc6f + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -41398,6 +46270,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^1.0.1, string-width@npm:^1.0.2": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: ^1.0.0 + is-fullwidth-code-point: ^1.0.0 + strip-ansi: ^3.0.0 + checksum: 5c79439e95bc3bd7233a332c5f5926ab2ee90b23816ed4faa380ce3b2576d7800b0a5bb15ae88ed28737acc7ea06a518c2eef39142dd727adad0e45c776cd37e + languageName: node + linkType: hard + "string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" @@ -41610,6 +46493,16 @@ __metadata: languageName: node linkType: hard +"stringify-entities@npm:^4.0.0": + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" + dependencies: + character-entities-html4: ^2.0.0 + character-entities-legacy: ^3.0.0 + checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 + languageName: node + linkType: hard + "stringify-object@npm:^3.3.0": version: 3.3.0 resolution: "stringify-object@npm:3.3.0" @@ -41630,7 +46523,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^3.0.0": +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": version: 3.0.1 resolution: "strip-ansi@npm:3.0.1" dependencies: @@ -41664,6 +46557,15 @@ __metadata: languageName: node linkType: hard +"strip-bom@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-bom@npm:2.0.0" + dependencies: + is-utf8: ^0.2.0 + checksum: 08efb746bc67b10814cd03d79eb31bac633393a782e3f35efbc1b61b5165d3806d03332a97f362822cf0d4dd14ba2e12707fcff44fe1c870c48a063a0c9e4944 + languageName: node + linkType: hard + "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" @@ -41786,6 +46688,15 @@ __metadata: languageName: node linkType: hard +"style-to-object@npm:^1.0.0": + version: 1.0.8 + resolution: "style-to-object@npm:1.0.8" + dependencies: + inline-style-parser: 0.2.4 + checksum: 80ca4773fc728d7919edc552eb46bab11aa8cdd0b426528ee8b817ba6872ea7b9d38fbb97b6443fd2d4895a4c4b02ec32765387466a302d0b4d1b91deab1e1a0 + languageName: node + linkType: hard + "styled-jsx@npm:5.1.1": version: 5.1.1 resolution: "styled-jsx@npm:5.1.1" @@ -41880,6 +46791,15 @@ __metadata: languageName: node linkType: hard +"superjson@npm:^1.9.1": + version: 1.13.3 + resolution: "superjson@npm:1.13.3" + dependencies: + copy-anything: ^3.0.2 + checksum: f5aeb010f24163cb871a4bc402d9164112201c059afc247a75b03131c274aea6eec9cf08be9e4a9465fe4961689009a011584528531d52f7cc91c077e07e5c75 + languageName: node + linkType: hard + "supertest@npm:^6.3.3": version: 6.3.4 resolution: "supertest@npm:6.3.4" @@ -41915,7 +46835,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": +"supports-color@npm:^8.0.0, supports-color@npm:^8.1.0, supports-color@npm:^8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -42098,6 +47018,15 @@ __metadata: languageName: node linkType: hard +"swap-case@npm:^2.0.2": + version: 2.0.2 + resolution: "swap-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 6e21c9e1b3cd5735eb2af679a99ec3efc78a14e3d4d5e3fd594e254b91cfd37185b3d1c6e41b22f53a2cdf5d1b963ce30c0fe8b78337e3fd43d0137084670a5f + languageName: node + linkType: hard + "swc-loader@npm:^0.2.3": version: 0.2.3 resolution: "swc-loader@npm:0.2.3" @@ -42108,6 +47037,15 @@ __metadata: languageName: node linkType: hard +"swr@npm:^1.2.2": + version: 1.3.0 + resolution: "swr@npm:1.3.0" + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + checksum: e7a184f0d560e9c8be85c023cc8e65e56a88a6ed46f9394b301b07f838edca23d2e303685319a4fcd620b81d447a7bcb489c7fa0a752c259f91764903c690cdb + languageName: node + linkType: hard + "symbol-observable@npm:4.0.0": version: 4.0.0 resolution: "symbol-observable@npm:4.0.0" @@ -42122,6 +47060,17 @@ __metadata: languageName: node linkType: hard +"sync-fetch@npm:0.6.0-2": + version: 0.6.0-2 + resolution: "sync-fetch@npm:0.6.0-2" + dependencies: + node-fetch: ^3.3.2 + timeout-signal: ^2.0.0 + whatwg-mimetype: ^4.0.0 + checksum: 325988e32633affdc7c6dcababd5a6ed5a1e825f30eca55af4a44f877d4154ae5a9783351f82fd793de85d3105213a3f60a12411a4db25e7ae4be08581367252 + languageName: node + linkType: hard + "synchronous-promise@npm:^2.0.15": version: 2.0.15 resolution: "synchronous-promise@npm:2.0.15" @@ -42603,6 +47552,13 @@ __metadata: languageName: node linkType: hard +"timeout-signal@npm:^2.0.0": + version: 2.0.0 + resolution: "timeout-signal@npm:2.0.0" + checksum: 0e3a6fb7ce4912e890475fe268888dd31068814ed096b264b3748d57f5a63a323fa1a5c4ba3d7da4529fb5031ed1a69bf8edfe5fb709bd3eec79d72f9ee51cc9 + languageName: node + linkType: hard + "timers-browserify@npm:^2.0.12, timers-browserify@npm:^2.0.4": version: 2.0.12 resolution: "timers-browserify@npm:2.0.12" @@ -42750,6 +47706,25 @@ __metadata: languageName: node linkType: hard +"title-case@npm:^2.1.0": + version: 2.1.1 + resolution: "title-case@npm:2.1.1" + dependencies: + no-case: ^2.2.0 + upper-case: ^1.0.3 + checksum: e88ddfc4608a7fb18ed440139d9c42a5f8a50f916e07062be2aef5e2038720746ed51c4fdf9e7190d24a8cc10e6dec9773027fc44450b3a4a5e5c49b4a931fb1 + languageName: node + linkType: hard + +"title-case@npm:^3.0.3": + version: 3.0.3 + resolution: "title-case@npm:3.0.3" + dependencies: + tslib: ^2.0.3 + checksum: e8b7ea006b53cf3208d278455d9f1e22c409459d7f9878da324fa3b18cc0aef8560924c19c744e870394a5d9cddfdbe029ebae9875909ee7f4fc562e7cbfc53e + languageName: node + linkType: hard + "tldts-core@npm:^6.1.61": version: 6.1.61 resolution: "tldts-core@npm:6.1.61" @@ -42768,6 +47743,15 @@ __metadata: languageName: node linkType: hard +"tmp-promise@npm:^3.0.3": + version: 3.0.3 + resolution: "tmp-promise@npm:3.0.3" + dependencies: + tmp: ^0.2.0 + checksum: f854f5307dcee6455927ec3da9398f139897faf715c5c6dcee6d9471ae85136983ea06662eba2edf2533bdcb0fca66d16648e79e14381e30c7fb20be9c1aa62c + languageName: node + linkType: hard + "tmp@npm:0.2.1": version: 0.2.1 resolution: "tmp@npm:0.2.1" @@ -42786,6 +47770,13 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.2.0": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -42933,7 +47924,7 @@ __metadata: languageName: node linkType: hard -"tree-kill@npm:1.2.2": +"tree-kill@npm:1.2.2, tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -42942,6 +47933,13 @@ __metadata: languageName: node linkType: hard +"trim-lines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-lines@npm:3.0.1" + checksum: e241da104682a0e0d807222cc1496b92e716af4db7a002f4aeff33ae6a0024fef93165d49eab11aa07c71e1347c42d46563f91dfaa4d3fb945aa535cdead53ed + languageName: node + linkType: hard + "trim-newlines@npm:^3.0.0": version: 3.0.1 resolution: "trim-newlines@npm:3.0.1" @@ -42956,6 +47954,13 @@ __metadata: languageName: node linkType: hard +"trough@npm:^2.0.0": + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 6097df63169aca1f9b08c263b1b501a9b878387f46e161dde93f6d0bba7febba93c95f876a293c5ea370f6cb03bcb687b2488c8955c3cfb66c2c0161ea8c00f6 + languageName: node + linkType: hard + "ts-api-utils@npm:^1.0.1": version: 1.0.3 resolution: "ts-api-utils@npm:1.0.3" @@ -43104,6 +48109,13 @@ __metadata: languageName: node linkType: hard +"ts-log@npm:^2.2.3": + version: 2.2.7 + resolution: "ts-log@npm:2.2.7" + checksum: c423a5eb54abb9471578902953814d3d0c88b3f237db016998f8998ecf982cb0f748bb8ebf93670eeba9b836ff0ce407d8065a340f3ab218ea7b9442c255b3d4 + languageName: node + linkType: hard + "ts-morph@npm:^13.0.2": version: 13.0.3 resolution: "ts-morph@npm:13.0.3" @@ -43311,6 +48323,20 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.7.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a + languageName: node + linkType: hard + +"tslib@npm:~2.6.0": + version: 2.6.3 + resolution: "tslib@npm:2.6.3" + checksum: 74fce0e100f1ebd95b8995fbbd0e6c91bdd8f4c35c00d4da62e285a3363aaa534de40a80db30ecfd388ed7c313c42d930ee0eaf108e8114214b180eec3dbe6f5 + languageName: node + linkType: hard + "tslog@npm:^4.9.2": version: 4.9.2 resolution: "tslog@npm:4.9.2" @@ -43449,6 +48475,13 @@ __metadata: languageName: node linkType: hard +"tween-functions@npm:^1.2.0": + version: 1.2.0 + resolution: "tween-functions@npm:1.2.0" + checksum: 880708d680eff5c347ddcb9f922ad121703a91c78ce308ed309073e73a794b633eb0b80589a839365803f150515ad34c9646809ae8a0e90f09e62686eefb1ab6 + languageName: node + linkType: hard + "tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" @@ -43456,6 +48489,25 @@ __metadata: languageName: node linkType: hard +"twemoji-parser@npm:13.1.0": + version: 13.1.0 + resolution: "twemoji-parser@npm:13.1.0" + checksum: 8046ce003c03dd92d68c2648cfbfa39c659fca4f05c10da8d14957985dc3c0c680f3ecf2de8245dc1ddffedc5b2a675f2032053e1e77cc7474301a88fe192ad3 + languageName: node + linkType: hard + +"twemoji@npm:^13.0.1": + version: 13.1.1 + resolution: "twemoji@npm:13.1.1" + dependencies: + fs-extra: ^8.0.1 + jsonfile: ^5.0.0 + twemoji-parser: 13.1.0 + universalify: ^0.1.2 + checksum: f60a8785ad6eb1a673c4f1bccb00a852ead13639db9f763c0e3e9dee6e3e67d88f1d2b481bcee34c35570ab060918b30b6ee68aa65ea1042ad35cd83212a102a + languageName: node + linkType: hard + "twilio@npm:^3.80.1": version: 3.80.1 resolution: "twilio@npm:3.80.1" @@ -43895,6 +48947,15 @@ __metadata: languageName: node linkType: hard +"ua-parser-js@npm:^1.0.33, ua-parser-js@npm:^1.0.35": + version: 1.0.40 + resolution: "ua-parser-js@npm:1.0.40" + bin: + ua-parser-js: script/cli.js + checksum: ae555a33dc9395dd877e295d6adbf5634e047aad7c3358328830218f3ca3a6233e35848cd355465a7612f269860e8029984389282940c7a27c9af4dfcdbba8c3 + languageName: node + linkType: hard + "uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": version: 1.0.6 resolution: "uc.micro@npm:1.0.6" @@ -43944,6 +49005,22 @@ __metadata: languageName: node linkType: hard +"unc-path-regex@npm:^0.1.2": + version: 0.1.2 + resolution: "unc-path-regex@npm:0.1.2" + checksum: a05fa2006bf4606051c10fc7968f08ce7b28fa646befafa282813aeb1ac1a56f65cb1b577ca7851af2726198d59475bb49b11776036257b843eaacee2860a4ec + languageName: node + linkType: hard + +"undici@npm:^5.12.0": + version: 5.28.5 + resolution: "undici@npm:5.28.5" + dependencies: + "@fastify/busboy": ^2.0.0 + checksum: a402d699a602a8feee1c0f78267467c8ffcbd7682267fec7a1307fd11554a32976a2307bf1cc8bf6ef7a667654336592fbd66d675df20ce28357536fb55a3a7d + languageName: node + linkType: hard + "undici@npm:^5.28.2": version: 5.28.4 resolution: "undici@npm:5.28.4" @@ -44001,6 +49078,36 @@ __metadata: languageName: node linkType: hard +"unified@npm:^10.0.0": + version: 10.1.2 + resolution: "unified@npm:10.1.2" + dependencies: + "@types/unist": ^2.0.0 + bail: ^2.0.0 + extend: ^3.0.0 + is-buffer: ^2.0.0 + is-plain-obj: ^4.0.0 + trough: ^2.0.0 + vfile: ^5.0.0 + checksum: 053e7c65ede644607f87bd625a299e4b709869d2f76ec8138569e6e886903b6988b21cd9699e471eda42bee189527be0a9dac05936f1d069a5e65d0125d5d756 + languageName: node + linkType: hard + +"unified@npm:^11.0.0": + version: 11.0.5 + resolution: "unified@npm:11.0.5" + dependencies: + "@types/unist": ^3.0.0 + bail: ^2.0.0 + devlop: ^1.0.0 + extend: ^3.0.0 + is-plain-obj: ^4.0.0 + trough: ^2.0.0 + vfile: ^6.0.0 + checksum: b3bf7fd6f568cc261e074dae21188483b0f2a8ab858d62e6e85b75b96cc655f59532906ae3c64d56a9b257408722d71f1d4135292b3d7ee02907c8b592fb3cf0 + languageName: node + linkType: hard + "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -44055,6 +49162,22 @@ __metadata: languageName: node linkType: hard +"unist-builder@npm:^3.0.0": + version: 3.0.1 + resolution: "unist-builder@npm:3.0.1" + dependencies: + "@types/unist": ^2.0.0 + checksum: d8c42fe69aa55a3e9aed3c581007ec5371349bf9885bfa8b0b787634f8d12fa5081f066b205ded379b6d0aeaa884039bae9ebb65a3e71784005fb110aef30d0f + languageName: node + linkType: hard + +"unist-util-generated@npm:^2.0.0": + version: 2.0.1 + resolution: "unist-util-generated@npm:2.0.1" + checksum: 6221ad0571dcc9c8964d6b054f39ef6571ed59cc0ce3e88ae97ea1c70afe76b46412a5ffaa91f96814644ac8477e23fb1b477d71f8d70e625728c5258f5c0d99 + languageName: node + linkType: hard + "unist-util-is@npm:^4.0.0": version: 4.1.0 resolution: "unist-util-is@npm:4.1.0" @@ -44062,6 +49185,60 @@ __metadata: languageName: node linkType: hard +"unist-util-is@npm:^5.0.0": + version: 5.2.1 + resolution: "unist-util-is@npm:5.2.1" + dependencies: + "@types/unist": ^2.0.0 + checksum: ae76fdc3d35352cd92f1bedc3a0d407c3b9c42599a52ab9141fe89bdd786b51f0ec5a2ab68b93fb532e239457cae62f7e39eaa80229e1cb94875da2eafcbe5c4 + languageName: node + linkType: hard + +"unist-util-is@npm:^6.0.0": + version: 6.0.0 + resolution: "unist-util-is@npm:6.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: f630a925126594af9993b091cf807b86811371e465b5049a6283e08537d3e6ba0f7e248e1e7dab52cfe33f9002606acef093441137181b327f6fe504884b20e2 + languageName: node + linkType: hard + +"unist-util-position@npm:^4.0.0": + version: 4.0.4 + resolution: "unist-util-position@npm:4.0.4" + dependencies: + "@types/unist": ^2.0.0 + checksum: e7487b6cec9365299695e3379ded270a1717074fa11fd2407c9b934fb08db6fe1d9077ddeaf877ecf1813665f8ccded5171693d3d9a7a01a125ec5cdd5e88691 + languageName: node + linkType: hard + +"unist-util-position@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-position@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: f89b27989b19f07878de9579cd8db2aa0194c8360db69e2c99bd2124a480d79c08f04b73a64daf01a8fb3af7cba65ff4b45a0b978ca243226084ad5f5d441dde + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^3.0.0": + version: 3.0.3 + resolution: "unist-util-stringify-position@npm:3.0.3" + dependencies: + "@types/unist": ^2.0.0 + checksum: dbd66c15183607ca942a2b1b7a9f6a5996f91c0d30cf8966fb88955a02349d9eefd3974e9010ee67e71175d784c5a9fea915b0aa0b0df99dcb921b95c4c9e124 + languageName: node + linkType: hard + +"unist-util-stringify-position@npm:^4.0.0": + version: 4.0.0 + resolution: "unist-util-stringify-position@npm:4.0.0" + dependencies: + "@types/unist": ^3.0.0 + checksum: e2e7aee4b92ddb64d314b4ac89eef7a46e4c829cbd3ee4aee516d100772b490eb6b4974f653ba0717a0071ca6ea0770bf22b0a2ea62c65fcba1d071285e96324 + languageName: node + linkType: hard + "unist-util-visit-parents@npm:^3.0.0": version: 3.1.1 resolution: "unist-util-visit-parents@npm:3.1.1" @@ -44072,6 +49249,26 @@ __metadata: languageName: node linkType: hard +"unist-util-visit-parents@npm:^5.1.1": + version: 5.1.3 + resolution: "unist-util-visit-parents@npm:5.1.3" + dependencies: + "@types/unist": ^2.0.0 + unist-util-is: ^5.0.0 + checksum: 8ecada5978994f846b64658cf13b4092cd78dea39e1ba2f5090a5de842ba4852712c02351a8ae95250c64f864635e7b02aedf3b4a093552bb30cf1bd160efbaa + languageName: node + linkType: hard + +"unist-util-visit-parents@npm:^6.0.0": + version: 6.0.1 + resolution: "unist-util-visit-parents@npm:6.0.1" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + checksum: 08927647c579f63b91aafcbec9966dc4a7d0af1e5e26fc69f4e3e6a01215084835a2321b06f3cbe7bf7914a852830fc1439f0fc3d7153d8804ac3ef851ddfa20 + languageName: node + linkType: hard + "unist-util-visit@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-visit@npm:2.0.3" @@ -44083,6 +49280,35 @@ __metadata: languageName: node linkType: hard +"unist-util-visit@npm:^4.0.0": + version: 4.1.2 + resolution: "unist-util-visit@npm:4.1.2" + dependencies: + "@types/unist": ^2.0.0 + unist-util-is: ^5.0.0 + unist-util-visit-parents: ^5.1.1 + checksum: 95a34e3f7b5b2d4b68fd722b6229972099eb97b6df18913eda44a5c11df8b1e27efe7206dd7b88c4ed244a48c474a5b2e2629ab79558ff9eb936840295549cee + languageName: node + linkType: hard + +"unist-util-visit@npm:^5.0.0": + version: 5.0.0 + resolution: "unist-util-visit@npm:5.0.0" + dependencies: + "@types/unist": ^3.0.0 + unist-util-is: ^6.0.0 + unist-util-visit-parents: ^6.0.0 + checksum: 9ec42e618e7e5d0202f3c191cd30791b51641285732767ee2e6bcd035931032e3c1b29093f4d7fd0c79175bbc1f26f24f26ee49770d32be76f8730a652a857e6 + languageName: node + linkType: hard + +"universal-base64@npm:^2.1.0": + version: 2.1.0 + resolution: "universal-base64@npm:2.1.0" + checksum: 03bc6f7de04aee83038c26038cd2639f470fd9665f99b3613934c4ccde5d59047d45e34ea4c843ac582da83ea1b050bf8defba8eb390e566f0be314646ddbc9b + languageName: node + linkType: hard + "universal-user-agent@npm:^6.0.0": version: 6.0.1 resolution: "universal-user-agent@npm:6.0.1" @@ -44090,7 +49316,7 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.0": +"universalify@npm:^0.1.0, universalify@npm:^0.1.2": version: 0.1.2 resolution: "universalify@npm:0.1.2" checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff @@ -44111,6 +49337,15 @@ __metadata: languageName: node linkType: hard +"unixify@npm:^1.0.0": + version: 1.0.0 + resolution: "unixify@npm:1.0.0" + dependencies: + normalize-path: ^2.1.1 + checksum: 3be30e48579fc6c7390bd59b4ab9e745fede0c164dfb7351cf710bd1dbef8484b1441186205af6bcb13b731c0c88caf9b33459f7bf8c89e79c046e656ae433f0 + languageName: node + linkType: hard + "unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" @@ -44191,6 +49426,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.1.1": + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" + dependencies: + escalade: ^3.2.0 + picocolors: ^1.1.1 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 088d2bad8ddeaeccd82d87d3f6d736d5256d697b725ffaa2b601dfd0ec16ba5fad20db8dcdccf55396e1a36194236feb69e3f5cce772e5be15a5e4261ff2815d + languageName: node + linkType: hard + "update-input-width@npm:^1.2.2": version: 1.4.2 resolution: "update-input-width@npm:1.4.2" @@ -44218,7 +49467,7 @@ __metadata: languageName: node linkType: hard -"upper-case-first@npm:^1.1.0": +"upper-case-first@npm:^1.1.0, upper-case-first@npm:^1.1.2": version: 1.1.2 resolution: "upper-case-first@npm:1.1.2" dependencies: @@ -44227,13 +49476,31 @@ __metadata: languageName: node linkType: hard -"upper-case@npm:^1.0.3, upper-case@npm:^1.1.0, upper-case@npm:^1.1.1": +"upper-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case-first@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 4487db4701effe3b54ced4b3e4aa4d9ab06c548f97244d04aafb642eedf96a76d5a03cf5f38f10f415531d5792d1ac6e1b50f2a76984dc6964ad530f12876409 + languageName: node + linkType: hard + +"upper-case@npm:^1.0.3, upper-case@npm:^1.1.0, upper-case@npm:^1.1.1, upper-case@npm:^1.1.3": version: 1.1.3 resolution: "upper-case@npm:1.1.3" checksum: 991c845de75fa56e5ad983f15e58494dd77b77cadd79d273cc11e8da400067e9881ae1a52b312aed79b3d754496e2e0712e08d22eae799e35c7f9ba6f3d8a85d languageName: node linkType: hard +"upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 508723a2b03ab90cf1d6b7e0397513980fab821cbe79c87341d0e96cedefadf0d85f9d71eac24ab23f526a041d585a575cfca120a9f920e44eb4f8a7cf89121c + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -44287,6 +49554,13 @@ __metadata: languageName: node linkType: hard +"urlpattern-polyfill@npm:^10.0.0": + version: 10.0.0 + resolution: "urlpattern-polyfill@npm:10.0.0" + checksum: 61d890f151ea4ecf34a3dcab32c65ad1f3cda857c9d154af198260c6e5b2ad96d024593409baaa6d4428dd1ab206c14799bf37fe011117ac93a6a44913ac5aa4 + languageName: node + linkType: hard + "use-callback-ref@npm:^1.2.3": version: 1.2.5 resolution: "use-callback-ref@npm:1.2.5" @@ -44315,6 +49589,18 @@ __metadata: languageName: node linkType: hard +"use-deep-compare-effect@npm:^1.6.1": + version: 1.8.1 + resolution: "use-deep-compare-effect@npm:1.8.1" + dependencies: + "@babel/runtime": ^7.12.5 + dequal: ^2.0.2 + peerDependencies: + react: ">=16.13" + checksum: 2b9b6291df3f772f44d259b352e5d998963ccee0db2efeb76bb05525d928064aeeb69bb0dee5a5e428fea7cf3db67c097a770ebd30caa080662b565f6ef02b2e + languageName: node + linkType: hard + "use-isomorphic-layout-effect@npm:^1.1.2": version: 1.1.2 resolution: "use-isomorphic-layout-effect@npm:1.1.2" @@ -44376,6 +49662,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.2.0": + version: 1.4.0 + resolution: "use-sync-external-store@npm:1.4.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: dc3843a1b59ac8bd01417bd79498d4c688d5df8bf4801be50008ef4bfaacb349058c0b1605b5b43c828e0a2d62722d7e861573b3f31cea77a7f23e8b0fc2f7e3 + languageName: node + linkType: hard + "utif@npm:^2.0.1": version: 2.0.1 resolution: "utif@npm:2.0.1" @@ -44455,6 +49750,20 @@ __metadata: languageName: node linkType: hard +"uvu@npm:^0.5.0": + version: 0.5.6 + resolution: "uvu@npm:0.5.6" + dependencies: + dequal: ^2.0.0 + diff: ^5.0.0 + kleur: ^4.0.3 + sade: ^1.7.3 + bin: + uvu: bin.js + checksum: 09460a37975627de9fcad396e5078fb844d01aaf64a6399ebfcfd9e55f1c2037539b47611e8631f89be07656962af0cf48c334993db82b9ae9c3d25ce3862168 + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -44490,6 +49799,13 @@ __metadata: languageName: node linkType: hard +"value-or-promise@npm:^1.0.12": + version: 1.0.12 + resolution: "value-or-promise@npm:1.0.12" + checksum: f53a66c75b7447c90bbaf946a757ca09c094629cb80ba742f59c980ec3a69be0a385a0e75505dedb4e757862f1a994ca4beaf083a831f24d3ffb3d4bb18cd1e1 + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -44508,6 +49824,58 @@ __metadata: languageName: node linkType: hard +"vfile-location@npm:^4.0.0": + version: 4.1.0 + resolution: "vfile-location@npm:4.1.0" + dependencies: + "@types/unist": ^2.0.0 + vfile: ^5.0.0 + checksum: c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 + languageName: node + linkType: hard + +"vfile-message@npm:^3.0.0": + version: 3.1.4 + resolution: "vfile-message@npm:3.1.4" + dependencies: + "@types/unist": ^2.0.0 + unist-util-stringify-position: ^3.0.0 + checksum: d0ee7da1973ad76513c274e7912adbed4d08d180eaa34e6bd40bc82459f4b7bc50fcaff41556135e3339995575eac5f6f709aba9332b80f775618ea4880a1367 + languageName: node + linkType: hard + +"vfile-message@npm:^4.0.0": + version: 4.0.2 + resolution: "vfile-message@npm:4.0.2" + dependencies: + "@types/unist": ^3.0.0 + unist-util-stringify-position: ^4.0.0 + checksum: 964e7e119f4c0e0270fc269119c41c96da20afa01acb7c9809a88365c8e0c64aa692fafbd952669382b978002ecd7ad31ef4446d85e8a22cdb62f6df20186c2d + languageName: node + linkType: hard + +"vfile@npm:^5.0.0": + version: 5.3.7 + resolution: "vfile@npm:5.3.7" + dependencies: + "@types/unist": ^2.0.0 + is-buffer: ^2.0.0 + unist-util-stringify-position: ^3.0.0 + vfile-message: ^3.0.0 + checksum: 642cce703afc186dbe7cabf698dc954c70146e853491086f5da39e1ce850676fc96b169fcf7898aa3ff245e9313aeec40da93acd1e1fcc0c146dc4f6308b4ef9 + languageName: node + linkType: hard + +"vfile@npm:^6.0.0": + version: 6.0.3 + resolution: "vfile@npm:6.0.3" + dependencies: + "@types/unist": ^3.0.0 + vfile-message: ^4.0.0 + checksum: 152b6729be1af70df723efb65c1a1170fd483d41086557da3651eea69a1dd1f0c22ea4344834d56d30734b9185bcab63e22edc81d3f0e9bed8aa4660d61080af + languageName: node + linkType: hard + "victory-vendor@npm:^36.6.8": version: 36.9.2 resolution: "victory-vendor@npm:36.9.2" @@ -44964,6 +50332,21 @@ __metadata: languageName: node linkType: hard +"wait-on@npm:^7.0.1": + version: 7.2.0 + resolution: "wait-on@npm:7.2.0" + dependencies: + axios: ^1.6.1 + joi: ^17.11.0 + lodash: ^4.17.21 + minimist: ^1.2.8 + rxjs: ^7.8.1 + bin: + wait-on: bin/wait-on + checksum: 69ec1432bb4479363fdd71f2f3f501a98aa356a562781108a4a89ef8fdf1e3d5fd0c2fd56c4cc5902abbb662065f1f22d4e436a1e6fc9331ce8b575eb023325e + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -44973,6 +50356,15 @@ __metadata: languageName: node linkType: hard +"warning@npm:^4.0.3": + version: 4.0.3 + resolution: "warning@npm:4.0.3" + dependencies: + loose-envify: ^1.0.0 + checksum: 4f2cb6a9575e4faf71ddad9ad1ae7a00d0a75d24521c193fa464f30e6b04027bd97aa5d9546b0e13d3a150ab402eda216d59c1d0f2d6ca60124d96cd40dfa35c + languageName: node + linkType: hard + "watchpack@npm:2.4.0": version: 2.4.0 resolution: "watchpack@npm:2.4.0" @@ -45009,6 +50401,13 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 + languageName: node + linkType: hard + "web-push@npm:^3.6.7": version: 3.6.7 resolution: "web-push@npm:3.6.7" @@ -45031,7 +50430,14 @@ __metadata: languageName: node linkType: hard -"web-streams-polyfill@npm:^3.0.3": +"web-streams-polyfill@npm:4.0.0-beta.3": + version: 4.0.0-beta.3 + resolution: "web-streams-polyfill@npm:4.0.0-beta.3" + checksum: dfec1fbf52b9140e4183a941e380487b6c3d5d3838dd1259be81506c1c9f2abfcf5aeb670aeeecfd9dff4271a6d8fef931b193c7bedfb42542a3b05ff36c0d16 + languageName: node + linkType: hard + +"web-streams-polyfill@npm:^3.0.3, web-streams-polyfill@npm:^3.2.0": version: 3.3.3 resolution: "web-streams-polyfill@npm:3.3.3" checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb @@ -45045,6 +50451,19 @@ __metadata: languageName: node linkType: hard +"webcrypto-core@npm:^1.8.0": + version: 1.8.1 + resolution: "webcrypto-core@npm:1.8.1" + dependencies: + "@peculiar/asn1-schema": ^2.3.13 + "@peculiar/json-schema": ^1.1.12 + asn1js: ^3.0.5 + pvtsutils: ^1.3.5 + tslib: ^2.7.0 + checksum: 5f8d862991bf9b36bfec53a317ceec7de95010c6d16092d2ba62b988acdfca9adfd254ef388036e610c66d0aad506d3f344574f62e06501a8c72ef961c8996b2 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -45351,6 +50770,13 @@ __metadata: languageName: node linkType: hard +"which-module@npm:^1.0.0": + version: 1.0.0 + resolution: "which-module@npm:1.0.0" + checksum: 98434f7deb36350cb543c1f15612188541737e1f12d39b23b1c371dff5cf4aa4746210f2bdec202d5fe9da8682adaf8e3f7c44c520687d30948cfc59d5534edb + languageName: node + linkType: hard + "which-module@npm:^2.0.0": version: 2.0.1 resolution: "which-module@npm:2.0.1" @@ -45473,6 +50899,15 @@ __metadata: languageName: node linkType: hard +"window-size@npm:^0.2.0": + version: 0.2.0 + resolution: "window-size@npm:0.2.0" + bin: + window-size: cli.js + checksum: a85e2acf156cfa194301294809867bdadd8a48ee5d972d9fa8e3e1b3420a1d0201b13ac8eb0348a0d14bbf2c3316565b6a749749c2384c5d286caf8a064c4f90 + languageName: node + linkType: hard + "windows-release@npm:^5.0.1": version: 5.1.1 resolution: "windows-release@npm:5.1.1" @@ -45548,6 +50983,16 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^2.0.0": + version: 2.1.0 + resolution: "wrap-ansi@npm:2.1.0" + dependencies: + string-width: ^1.0.1 + strip-ansi: ^3.0.1 + checksum: 2dacd4b3636f7a53ee13d4d0fe7fa2ed9ad81e9967e17231924ea88a286ec4619a78288de8d41881ee483f4449ab2c0287cde8154ba1bd0126c10271101b2ee3 + languageName: node + linkType: hard + "wrap-ansi@npm:^6.0.1, wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -45649,7 +51094,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.18.0": +"ws@npm:^8.17.1, ws@npm:^8.18.0": version: 8.18.0 resolution: "ws@npm:8.18.0" peerDependencies: @@ -45746,7 +51191,7 @@ __metadata: languageName: node linkType: hard -"xml2js@npm:0.6.2, xml2js@npm:^0.6.2": +"xml2js@npm:0.6.2, xml2js@npm:^0.6.0, xml2js@npm:^0.6.2": version: 0.6.2 resolution: "xml2js@npm:0.6.2" dependencies: @@ -45865,6 +51310,13 @@ __metadata: languageName: node linkType: hard +"y18n@npm:^3.2.1": + version: 3.2.2 + resolution: "y18n@npm:3.2.2" + checksum: 6154fd7544f8bbf5b18cdf77692ed88d389be49c87238ecb4e0d6a5276446cd2a5c29cc4bdbdddfc7e4e498b08df9d7e38df4a1453cf75eecfead392246ea74a + languageName: node + linkType: hard + "y18n@npm:^4.0.0": version: 4.0.3 resolution: "y18n@npm:4.0.3" @@ -45900,6 +51352,13 @@ __metadata: languageName: node linkType: hard +"yaml-ast-parser@npm:^0.0.43": + version: 0.0.43 + resolution: "yaml-ast-parser@npm:0.0.43" + checksum: fb5df4c067b6ccbd00953a46faf6ff27f0e290d623c712dc41f330251118f110e22cfd184bbff498bd969cbcda3cd27e0f9d0adb9e6d90eb60ccafc0d8e28077 + languageName: node + linkType: hard + "yaml@npm:2.0.0-1": version: 2.0.0-1 resolution: "yaml@npm:2.0.0-1" @@ -45921,6 +51380,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.3.1": + version: 2.7.0 + resolution: "yaml@npm:2.7.0" + bin: + yaml: bin.mjs + checksum: 6e8b2f9b9d1b18b10274d58eb3a47ec223d9a93245a890dcb34d62865f7e744747190a9b9177d5f0ef4ea2e44ad2c0214993deb42e0800766203ac46f00a12dd + languageName: node + linkType: hard + "yargs-parser@npm:21.1.1, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -45945,6 +51413,16 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "yargs-parser@npm:3.2.0" + dependencies: + camelcase: ^3.0.0 + lodash.assign: ^4.1.0 + checksum: d86fd69816a28a617f4cad21f7bfe7f7c931b16d063c73449cd914db409b8d5981a0f29f9e2a05014a7229164aa47336adf5a8856fa9870ab892346d29138e9a + languageName: node + linkType: hard + "yargs@npm:^15.1.0, yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -45979,7 +51457,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.1, yargs@npm:^17.7.2": +"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -45994,6 +51472,28 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^5.0.0": + version: 5.0.0 + resolution: "yargs@npm:5.0.0" + dependencies: + cliui: ^3.2.0 + decamelize: ^1.1.1 + get-caller-file: ^1.0.1 + lodash.assign: ^4.2.0 + os-locale: ^1.4.0 + read-pkg-up: ^1.0.1 + require-directory: ^2.1.1 + require-main-filename: ^1.0.1 + set-blocking: ^2.0.0 + string-width: ^1.0.2 + which-module: ^1.0.0 + window-size: ^0.2.0 + y18n: ^3.2.1 + yargs-parser: ^3.2.0 + checksum: 478e9c8562c5cf5b9c2efc7c917e0b00c489cc50153d5d911ab68767c2cfddaf0b5bd4e04d6fefc00cb1d8f6263eab1d73df79a24d650ba95f5d45c819a1585a + languageName: node + linkType: hard + "yarn@npm:^1.22.18": version: 1.22.19 resolution: "yarn@npm:1.22.19" @@ -46194,3 +51694,10 @@ __metadata: checksum: 160052a7faaefbaad1071e890a06e5d7a04f6ff6985def30a7b4471f4ddbdd1d30bb05b3688a2777cd0b717d1f0d98dad24883a5caa3deeb3afb4d83b6dabc55 languageName: node linkType: hard + +"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 + languageName: node + linkType: hard