diff --git a/apps/api/package.json b/apps/api/package.json index 6f6a8eebf0b..af1670a4535 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -91,7 +91,8 @@ "shortid": "^2.2.16", "slugify": "^1.4.6", "swagger-ui-express": "^4.4.0", - "twilio": "^4.14.1", + "twilio": "^4.14.1", + "json-schema-to-ts": "^3.0.0", "uuid": "^8.3.2" }, "devDependencies": { diff --git a/apps/api/src/app/step-schemas/dtos/schema-type.dto.ts b/apps/api/src/app/step-schemas/dtos/schema-type.dto.ts deleted file mode 100644 index 9b31fd6e8ff..00000000000 --- a/apps/api/src/app/step-schemas/dtos/schema-type.dto.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { SchemaOutput } from '../types'; - -export type SchemaTypeDto = { schema: SchemaOutput }; diff --git a/apps/api/src/app/step-schemas/dtos/step-schema.dto.ts b/apps/api/src/app/step-schemas/dtos/step-schema.dto.ts new file mode 100644 index 00000000000..36460ba0fbd --- /dev/null +++ b/apps/api/src/app/step-schemas/dtos/step-schema.dto.ts @@ -0,0 +1,6 @@ +import { JSONSchema } from 'json-schema-to-ts'; + +export type StepSchemaDto = { + controls: JSONSchema; + variables: JSONSchema; +}; diff --git a/apps/api/src/app/step-schemas/e2e/get-default-schema.e2e.ts b/apps/api/src/app/step-schemas/e2e/get-default-schema.e2e.ts deleted file mode 100644 index b1c12164241..00000000000 --- a/apps/api/src/app/step-schemas/e2e/get-default-schema.e2e.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { expect } from 'chai'; - -import { UserSession } from '@novu/testing'; -import { StepTypeEnum } from '@novu/shared'; -import { customActionStepSchema } from '../types'; - -describe('Get Control Schema - /step-schemas/:stepType (GET)', async () => { - let session: UserSession; - - beforeEach(async () => { - session = new UserSession(); - await session.initialize(); - }); - - it('should get control schema for email step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.EMAIL}`); - - const { schema } = body.data; - - expect(schema.type).to.equal('object'); - expect(schema.properties).to.have.property('subject'); - expect(schema.properties.subject).to.be.an('object'); - expect(schema.properties.subject).to.have.property('type'); - expect(schema.properties.subject.type).to.equal('string'); - expect(schema.properties).to.have.property('body'); - expect(schema.properties.body).to.be.an('object'); - expect(schema.properties.body).to.have.property('type'); - expect(schema.properties.body.type).to.equal('string'); - expect(schema.required).to.be.an('array').that.includes('subject'); - expect(schema.required).to.be.an('array').that.includes('body'); - expect(schema.additionalProperties).to.be.false; - }); - - it('should get control schema for sms step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.SMS}`); - - expect(body.data.schema.type).to.equal('object'); - expect(body.data.schema.properties).to.have.property('body'); - expect(body.data.schema.required).to.deep.equal(['body']); - expect(body.data.schema.additionalProperties).to.be.false; - }); - - it('should get control schema for push step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.PUSH}`); - - expect(body.data.schema.type).to.equal('object'); - expect(body.data.schema.properties).to.have.property('subject'); - expect(body.data.schema.properties).to.have.property('body'); - expect(body.data.schema.required).to.deep.equal(['subject', 'body']); - expect(body.data.schema.additionalProperties).to.be.false; - }); - - it('should get control schema for in-app step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.IN_APP}`); - - expect(body.data.schema.type).to.equal('object'); - expect(body.data.schema.properties).to.have.property('subject'); - expect(body.data.schema.properties).to.have.property('body'); - expect(body.data.schema.properties).to.have.property('avatar'); - expect(body.data.schema.properties).to.have.property('primaryAction'); - expect(body.data.schema.properties).to.have.property('secondaryAction'); - expect(body.data.schema.properties).to.have.property('data'); - expect(body.data.schema.properties).to.have.property('redirect'); - expect(body.data.schema.required).to.deep.equal(['body']); - expect(body.data.schema.additionalProperties).to.be.false; - }); - - it('should get control schema for chat step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.CHAT}`); - - expect(body.data.schema.type).to.equal('object'); - expect(body.data.schema.properties).to.have.property('body'); - expect(body.data.schema.required).to.deep.equal(['body']); - expect(body.data.schema.additionalProperties).to.be.false; - }); - - it('should get control schema for delay step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.DELAY}`); - - expect(body.data.schema.type).to.equal('object'); - expect(body.data.schema.properties).to.have.property('type'); - expect(body.data.schema.properties).to.have.property('amount'); - expect(body.data.schema.properties).to.have.property('unit'); - expect(body.data.schema.required).to.deep.equal(['amount', 'unit']); - expect(body.data.schema.additionalProperties).to.be.false; - }); - - it('should get control schema for digest step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.DIGEST}`); - expect(body.data.schema).to.have.property('oneOf'); - expect(body.data.schema.oneOf).to.be.an('array').with.lengthOf(2); - - const firstSchema = body.data.schema.oneOf[0]; - expect(firstSchema.type).to.equal('object'); - expect(firstSchema.properties).to.have.property('amount'); - expect(firstSchema.properties).to.have.property('unit'); - expect(firstSchema.properties).to.have.property('digestKey'); - expect(firstSchema.properties).to.have.property('lookBackWindow'); - expect(firstSchema.properties.lookBackWindow.type).to.equal('object'); - expect(firstSchema.properties.lookBackWindow.properties).to.have.property('amount'); - expect(firstSchema.properties.lookBackWindow.properties).to.have.property('unit'); - expect(firstSchema.required).to.deep.equal(['amount', 'unit']); - expect(firstSchema.additionalProperties).to.be.false; - - const secondSchema = body.data.schema.oneOf[1]; - expect(secondSchema.type).to.equal('object'); - expect(secondSchema.properties).to.have.property('cron'); - expect(secondSchema.properties).to.have.property('digestKey'); - expect(secondSchema.required).to.deep.equal(['cron']); - expect(secondSchema.additionalProperties).to.be.false; - }); - - it('should return empty object for custom step', async function () { - const { body } = await session.testAgent.get(`/v1/step-schemas/${StepTypeEnum.CUSTOM}`); - - expect(body.data.schema).to.deep.equal(customActionStepSchema); - }); - - it('should return 400 for invalid step type', async function () { - const res = await session.testAgent.get('/v1/step-schemas/invalid-step-type'); - - expect(res.body.message).to.be.an('array'); - expect(res.body.message[0]).to.include('stepType must be one of the following values'); - expect(res.body.error).to.equal('Bad Request'); - expect(res.body.statusCode).to.equal(400); - }); -}); diff --git a/apps/api/src/app/step-schemas/e2e/get-step-schema.e2e.ts b/apps/api/src/app/step-schemas/e2e/get-step-schema.e2e.ts new file mode 100644 index 00000000000..3ac1588d9de --- /dev/null +++ b/apps/api/src/app/step-schemas/e2e/get-step-schema.e2e.ts @@ -0,0 +1,285 @@ +import { expect } from 'chai'; + +import { UserSession } from '@novu/testing'; +import { StepTypeEnum, WorkflowResponseDto } from '@novu/shared'; + +describe('Get Step Schema - /step-schemas?workflowId=:workflowId&stepId=:stepId&stepType=:stepType (GET)', async () => { + let session: UserSession; + let createdWorkflow: WorkflowResponseDto; + + beforeEach(async () => { + session = new UserSession(); + await session.initialize(); + createdWorkflow = await createWorkflow(session, createdWorkflow); + }); + + describe('Get Control Schema with stepType', () => { + it('should get step schema for in app step type', async function () { + const { data } = (await getStepSchema({ session, stepType: StepTypeEnum.IN_APP })).body; + + // in app output schema + expect(data.controls.type).to.equal('object'); + expect(data.controls.properties).to.have.property('subject'); + expect(data.controls.properties.subject.type).to.equal('string'); + expect(data.controls.properties).to.have.property('body'); + expect(data.controls.properties.body.type).to.equal('string'); + expect(data.controls.properties).to.have.property('avatar'); + expect(data.controls.properties.avatar.type).to.equal('string'); + expect(data.controls.properties.avatar.format).to.equal('uri'); + expect(data.controls.properties).to.have.property('primaryAction'); + expect(data.controls.properties.primaryAction.type).to.equal('object'); + expect(data.controls.properties.primaryAction.properties).to.have.property('label'); + expect(data.controls.properties.primaryAction.properties.label.type).to.equal('string'); + expect(data.controls.properties.primaryAction.properties).to.have.property('redirect'); + expect(data.controls.properties.primaryAction.properties.redirect.type).to.equal('object'); + expect(data.controls.properties.primaryAction.required).to.deep.equal(['label']); + expect(data.controls.properties).to.have.property('secondaryAction'); + expect(data.controls.properties.secondaryAction.type).to.equal('object'); + expect(data.controls.properties.secondaryAction.properties).to.have.property('label'); + expect(data.controls.properties.secondaryAction.properties.label.type).to.equal('string'); + expect(data.controls.properties.secondaryAction.properties).to.have.property('redirect'); + expect(data.controls.properties.secondaryAction.properties.redirect.type).to.equal('object'); + expect(data.controls.properties.secondaryAction.required).to.deep.equal(['label']); + expect(data.controls.properties).to.have.property('data'); + expect(data.controls.properties.data.type).to.equal('object'); + expect(data.controls.properties.data.additionalProperties).to.be.true; + expect(data.controls.properties).to.have.property('redirect'); + expect(data.controls.properties.redirect.type).to.equal('object'); + expect(data.controls.properties.redirect.properties).to.have.property('url'); + expect(data.controls.properties.redirect.properties.url.type).to.equal('string'); + expect(data.controls.properties.redirect.properties).to.have.property('target'); + expect(data.controls.properties.redirect.properties.target.type).to.equal('string'); + expect(data.controls.required).to.deep.equal(['body']); + expect(data.controls.additionalProperties).to.be.false; + expect(data.controls.description).to.not.be.empty; + + expect(data.variables.type).to.equal('object'); + expect(data.variables.description).to.not.be.empty; + expect(data.variables.properties).to.have.property('subscriber'); + expect(data.variables.properties.subscriber.type).to.equal('object'); + expect(data.variables.properties.subscriber.description).to.not.be.empty; + expect(data.variables.properties.subscriber.properties).to.have.property('firstName'); + expect(data.variables.properties.subscriber.properties.firstName.type).to.equal('string'); + expect(data.variables.properties.subscriber.properties).to.have.property('lastName'); + expect(data.variables.properties.subscriber.properties.lastName.type).to.equal('string'); + expect(data.variables.properties.subscriber.properties).to.have.property('email'); + expect(data.variables.properties.subscriber.properties.email.type).to.equal('string'); + expect(data.variables.properties.subscriber.required).to.deep.equal([ + 'firstName', + 'lastName', + 'email', + 'subscriberId', + ]); + expect(data.variables.properties).to.have.property('steps'); + expect(data.variables.properties.steps.type).to.equal('object'); + expect(data.variables.properties.steps.description).to.not.be.empty; + expect(data.variables.required).to.deep.equal(['subscriber']); + expect(data.variables.additionalProperties).to.be.false; + }); + + it('should get error for invalid step type', async function () { + const response = await getStepSchema({ session, stepType: 'invalid' as StepTypeEnum }); + + expect(response.status).to.equal(400); + expect(response.body.message).to.include( + 'stepType must be one of the following values: email, sms, push, chat, in_app, digest, delay, custom' + ); + expect(response.body.error).to.equal('Bad Request'); + expect(response.body.statusCode).to.equal(400); + }); + }); + + describe('Get Control Schema exiting step', () => { + it('should get step schema for existing step', async function () { + const { data } = ( + await getStepSchema({ + session, + workflowId: createdWorkflow._id, + stepId: createdWorkflow.steps[0].stepUuid, + }) + ).body; + + expect(data.controls.type).to.equal('object'); + expect(data.controls.properties).to.have.property('codeFirstTitle'); + expect(data.controls.properties.codeFirstTitle.type).to.equal('string'); + expect(Object.keys(data.controls.properties).length).to.equal(1); + expect(data.controls).to.not.have.property('required'); + expect(data.controls).to.not.have.property('additionalProperties'); + expect(data.controls.description).to.not.be.empty; + + expect(data.variables.type).to.equal('object'); + expect(data.variables.description).to.not.be.empty; + expect(data.variables.properties).to.have.property('subscriber'); + expect(data.variables.properties.subscriber.type).to.equal('object'); + expect(data.variables.properties.subscriber.description).to.not.be.empty; + expect(data.variables.properties.subscriber.properties).to.have.property('firstName'); + expect(data.variables.properties.subscriber.properties.firstName.type).to.equal('string'); + expect(data.variables.properties.subscriber.properties).to.have.property('lastName'); + expect(data.variables.properties.subscriber.properties.lastName.type).to.equal('string'); + expect(data.variables.properties.subscriber.properties).to.have.property('email'); + expect(data.variables.properties.subscriber.properties.email.type).to.equal('string'); + expect(data.variables.properties.subscriber.required).to.deep.equal([ + 'firstName', + 'lastName', + 'email', + 'subscriberId', + ]); + expect(data.variables.properties).to.have.property('steps'); + expect(data.variables.properties.steps.type).to.equal('object'); + expect(data.variables.properties.steps.description).to.not.be.empty; + expect(data.variables.required).to.deep.equal(['subscriber']); + expect(data.variables.additionalProperties).to.be.false; + }); + + it('should get step schema for existing step no previous steps', async function () { + const { data } = ( + await getStepSchema({ + session, + workflowId: createdWorkflow._id, + stepId: createdWorkflow.steps[0].stepUuid, + }) + ).body; + + expect(data.variables.properties.steps.properties).to.be.an('object').that.is.empty; + }); + + it('should get step schema for existing step with previous steps', async function () { + const { data } = ( + await getStepSchema({ + session, + stepType: StepTypeEnum.IN_APP, + workflowId: createdWorkflow._id, + stepId: createdWorkflow.steps[1].stepUuid, + }) + ).body; + + expect(data.variables.properties.steps.type).to.equal('object'); + const variableStepKeys = Object.keys(data.variables.properties.steps.properties); + expect(variableStepKeys).to.have.length(1); + const variableStepKey = variableStepKeys[0]; + const createdWorkflowPreviousSteps = createdWorkflow.steps.slice( + 0, + createdWorkflow.steps.findIndex((stepItem) => stepItem.stepUuid === createdWorkflow.steps[1].stepUuid) + ); + const variableStepKeyFoundInCreatedWorkflow = createdWorkflowPreviousSteps.find( + (step) => step.stepUuid === variableStepKey + ); + const isValidVariableStepKey = !!variableStepKeyFoundInCreatedWorkflow; + expect(isValidVariableStepKey).to.be.true; + expect(data.variables.properties.steps.properties).to.have.property(variableStepKey); + expect(data.variables.properties.steps.properties[variableStepKey].type).to.equal('object'); + expect(data.variables.properties.steps.properties[variableStepKey].properties).to.have.all.keys( + 'seen', + 'read', + 'lastSeenDate', + 'lastReadDate' + ); + expect(data.variables.properties.steps.properties[variableStepKey].required).to.deep.equal([ + 'seen', + 'read', + 'lastSeenDate', + 'lastReadDate', + ]); + expect(data.variables.properties.steps.properties[variableStepKey].additionalProperties).to.be.false; + expect(data.variables.properties.steps.required).to.be.an('array').that.is.empty; + expect(data.variables.properties.steps.additionalProperties).to.be.false; + expect(data.variables.properties.steps.description).to.not.be.empty; + }); + + it('should get error for invalid step id', async function () { + const invalidStepUuid = `${createdWorkflow.steps[0].stepUuid}0`; + + const response = await getStepSchema({ + session, + workflowId: createdWorkflow._id, + stepId: invalidStepUuid, + }); + + expect(response.status).to.equal(400); + expect(response.body.message).to.equal('No step found'); + expect(response.body.stepId).to.equal(invalidStepUuid); + expect(response.body.workflowId).to.equal(createdWorkflow._id); + expect(response.body.statusCode).to.equal(400); + }); + + it('should get error for invalid workflow id', async function () { + const invalidWorkflowId = createdWorkflow.steps[0].stepUuid; + + const response = await getStepSchema({ + session, + workflowId: invalidWorkflowId, + stepId: createdWorkflow.steps[0].stepUuid, + }); + + expect(response.status).to.equal(400); + expect(response.body.message).to.equal('No workflow found'); + expect(response.body.workflowId).to.equal(invalidWorkflowId); + expect(response.body.statusCode).to.equal(400); + }); + }); +}); + +async function createWorkflow(session: UserSession, createdWorkflow: WorkflowResponseDto) { + const workflowObject = { + _organizationId: session.organization._id, + _environmentId: session.environment._id, + name: 'test api template', + description: 'This is a test description', + tags: ['test-tag-api'], + notificationGroupId: session.notificationGroups[0]._id, + steps: [ + { + name: 'In-App Test Step', + type: StepTypeEnum.IN_APP, + controls: { + schema: { + type: 'object', + properties: { + codeFirstTitle: { + type: 'string', + }, + }, + }, + }, + }, + { + name: 'SMS Test Step', + type: StepTypeEnum.SMS, + controls: { + schema: { + type: 'object', + properties: { + codeFirstSmsTitle: { + type: 'string', + }, + }, + }, + }, + }, + ], + triggers: [{ identifier: 'test-trigger-api' }], + }; + + const workflowDataRes = await session.testAgent.post(`/v2/workflows`).send(workflowObject); + + return workflowDataRes.body.data; +} + +const getStepSchema = async ({ + session, + workflowId, + stepId, + stepType, +}: { + session: UserSession; + workflowId?: string; + stepId?: string; + stepType?: StepTypeEnum; +}) => { + const queryParams = new URLSearchParams(); + if (workflowId) queryParams.append('workflowId', workflowId); + if (stepId) queryParams.append('stepId', stepId); + if (stepType) queryParams.append('stepType', stepType); + + return await session.testAgent.get(`/v1/step-schemas?${queryParams.toString()}`); +}; diff --git a/apps/api/src/app/step-schemas/shared/index.ts b/apps/api/src/app/step-schemas/shared/index.ts new file mode 100644 index 00000000000..8024855f119 --- /dev/null +++ b/apps/api/src/app/step-schemas/shared/index.ts @@ -0,0 +1 @@ +export * from './mappers'; diff --git a/apps/api/src/app/step-schemas/shared/mappers/index.ts b/apps/api/src/app/step-schemas/shared/mappers/index.ts new file mode 100644 index 00000000000..2f14c135667 --- /dev/null +++ b/apps/api/src/app/step-schemas/shared/mappers/index.ts @@ -0,0 +1,2 @@ +export * from './map-step-type-to-output.mapper'; +export * from './map-step-type-to-result.mapper'; diff --git a/apps/api/src/app/step-schemas/shared/mappers/map-step-type-to-output.mapper.ts b/apps/api/src/app/step-schemas/shared/mappers/map-step-type-to-output.mapper.ts new file mode 100644 index 00000000000..0c0c89d50fa --- /dev/null +++ b/apps/api/src/app/step-schemas/shared/mappers/map-step-type-to-output.mapper.ts @@ -0,0 +1,11 @@ +import { ActionStepEnum, actionStepSchemas, ChannelStepEnum, channelStepSchemas } from '@novu/framework'; + +export const mapStepTypeToOutput = { + [ChannelStepEnum.SMS]: channelStepSchemas[ChannelStepEnum.SMS].output, + [ChannelStepEnum.EMAIL]: channelStepSchemas[ChannelStepEnum.EMAIL].output, + [ChannelStepEnum.PUSH]: channelStepSchemas[ChannelStepEnum.PUSH].output, + [ChannelStepEnum.CHAT]: channelStepSchemas[ChannelStepEnum.CHAT].output, + [ChannelStepEnum.IN_APP]: channelStepSchemas[ChannelStepEnum.IN_APP].output, + [ActionStepEnum.DELAY]: actionStepSchemas[ActionStepEnum.DELAY].output, + [ActionStepEnum.DIGEST]: actionStepSchemas[ActionStepEnum.DIGEST].output, +}; diff --git a/apps/api/src/app/step-schemas/shared/mappers/map-step-type-to-result.mapper.ts b/apps/api/src/app/step-schemas/shared/mappers/map-step-type-to-result.mapper.ts new file mode 100644 index 00000000000..5bc1e5c1f18 --- /dev/null +++ b/apps/api/src/app/step-schemas/shared/mappers/map-step-type-to-result.mapper.ts @@ -0,0 +1,11 @@ +import { ActionStepEnum, actionStepSchemas, ChannelStepEnum, channelStepSchemas } from '@novu/framework'; + +export const mapStepTypeToResult = { + [ChannelStepEnum.SMS]: channelStepSchemas[ChannelStepEnum.SMS].result, + [ChannelStepEnum.EMAIL]: channelStepSchemas[ChannelStepEnum.EMAIL].result, + [ChannelStepEnum.PUSH]: channelStepSchemas[ChannelStepEnum.PUSH].result, + [ChannelStepEnum.CHAT]: channelStepSchemas[ChannelStepEnum.CHAT].result, + [ChannelStepEnum.IN_APP]: channelStepSchemas[ChannelStepEnum.IN_APP].result, + [ActionStepEnum.DELAY]: actionStepSchemas[ActionStepEnum.DELAY].result, + [ActionStepEnum.DIGEST]: actionStepSchemas[ActionStepEnum.DIGEST].result, +}; diff --git a/apps/api/src/app/step-schemas/step-schemas.controller.ts b/apps/api/src/app/step-schemas/step-schemas.controller.ts index 43c234d8c36..a4de8873fc0 100644 --- a/apps/api/src/app/step-schemas/step-schemas.controller.ts +++ b/apps/api/src/app/step-schemas/step-schemas.controller.ts @@ -1,14 +1,13 @@ -import { ClassSerializerInterceptor, Controller, Get, Param, UseInterceptors } from '@nestjs/common'; +import { ClassSerializerInterceptor, Controller, Get, Query, UseInterceptors } from '@nestjs/common'; import { UserSessionData } from '@novu/shared'; import { ExternalApiAccessible, UserSession } from '@novu/application-generic'; import { StepType } from '@novu/framework'; -import { ApiOperation, ApiParam } from '@nestjs/swagger'; -import { GetStepSchemaCommand } from './usecases/get-step-schema/get-step-schema.command'; +import { createGetStepSchemaCommand } from './usecases/get-step-schema/get-step-schema.command'; import { UserAuthentication } from '../shared/framework/swagger/api.key.security'; import { GetStepSchema } from './usecases/get-step-schema/get-step-schema.usecase'; -import { SchemaTypeDto } from './dtos/schema-type.dto'; +import { StepSchemaDto } from './dtos/step-schema.dto'; @Controller('/step-schemas') @UserAuthentication() @@ -16,30 +15,16 @@ import { SchemaTypeDto } from './dtos/schema-type.dto'; export class StepSchemasController { constructor(private getStepDefaultSchemaUsecase: GetStepSchema) {} - @Get('/:stepType') - @ApiOperation({ - summary: 'Get step schema', - description: 'Get the schema for a step type', - }) - @ApiParam({ - name: 'stepType', - type: String, - description: 'The type of step to get the schema for.', - }) + @Get() @ExternalApiAccessible() - async getStepSchema( + async getWorkflowStepSchema( @UserSession() user: UserSessionData, - @Param('stepType') stepType: StepType - ): Promise { - const schema = await this.getStepDefaultSchemaUsecase.execute( - GetStepSchemaCommand.create({ - organizationId: user.organizationId, - environmentId: user.environmentId, - userId: user._id, - stepType, - }) + @Query('stepType') stepType: StepType, + @Query('workflowId') workflowId: string, + @Query('stepId') stepId: string + ): Promise { + return await this.getStepDefaultSchemaUsecase.execute( + createGetStepSchemaCommand(user, stepType, workflowId, stepId) ); - - return { schema }; } } diff --git a/apps/api/src/app/step-schemas/step-schemas.module.ts b/apps/api/src/app/step-schemas/step-schemas.module.ts index 5489c68f76f..c65d179853b 100644 --- a/apps/api/src/app/step-schemas/step-schemas.module.ts +++ b/apps/api/src/app/step-schemas/step-schemas.module.ts @@ -2,9 +2,10 @@ import { forwardRef, Module } from '@nestjs/common'; import { USE_CASES } from './usecases'; import { StepSchemasController } from './step-schemas.controller'; import { AuthModule } from '../auth/auth.module'; +import { SharedModule } from '../shared/shared.module'; @Module({ - imports: [forwardRef(() => AuthModule)], + imports: [forwardRef(() => AuthModule), SharedModule], controllers: [StepSchemasController], providers: [...USE_CASES], exports: [...USE_CASES], diff --git a/apps/api/src/app/step-schemas/types/index.ts b/apps/api/src/app/step-schemas/types/index.ts deleted file mode 100644 index 79cb79b7b01..00000000000 --- a/apps/api/src/app/step-schemas/types/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { actionStepSchemas, channelStepSchemas, Schema } from '@novu/framework'; - -export const schemasList = Object.values({ ...channelStepSchemas, ...actionStepSchemas }).map( - (schema) => schema.output -); - -export const customActionStepSchema = { - type: 'object', - properties: {}, - required: [], - additionalProperties: false, -} as const satisfies Schema; - -export type SchemaOutput = (typeof schemasList)[number] | typeof customActionStepSchema; diff --git a/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.command.ts b/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.command.ts index 5025799dc2e..10f4ab97743 100644 --- a/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.command.ts +++ b/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.command.ts @@ -1,10 +1,48 @@ import { EnvironmentWithUserCommand } from '@novu/application-generic'; import { ActionStepEnum, ChannelStepEnum, StepType } from '@novu/framework'; -import { IsEnum } from 'class-validator'; +import { UserSessionData } from '@novu/shared'; +import { IsEnum, IsNotEmpty, IsString } from 'class-validator'; const StepTypeValue = { ...ChannelStepEnum, ...ActionStepEnum }; -export class GetStepSchemaCommand extends EnvironmentWithUserCommand { +export class GetStepTypeSchemaCommand extends EnvironmentWithUserCommand { @IsEnum(StepTypeValue) + @IsNotEmpty() stepType: StepType; } + +export class GetExistingStepSchemaCommand extends EnvironmentWithUserCommand { + @IsString() + @IsNotEmpty() + workflowId: string; + + @IsString() + @IsNotEmpty() + stepId: string; +} + +export type GetStepSchemaCommand = GetStepTypeSchemaCommand | GetExistingStepSchemaCommand; + +export function createGetStepSchemaCommand( + user: UserSessionData, + stepType: StepType, + workflowId: string, + stepId: string +) { + if (workflowId && stepId) { + return GetExistingStepSchemaCommand.create({ + organizationId: user.organizationId, + environmentId: user.environmentId, + userId: user._id, + workflowId, + stepId, + }); + } + + return GetStepTypeSchemaCommand.create({ + organizationId: user.organizationId, + environmentId: user.environmentId, + userId: user._id, + stepType, + }); +} diff --git a/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.usecase.ts b/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.usecase.ts index 9e30ae144aa..49df5ddf3f1 100644 --- a/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.usecase.ts +++ b/apps/api/src/app/step-schemas/usecases/get-step-schema/get-step-schema.usecase.ts @@ -1,39 +1,159 @@ -import { Injectable } from '@nestjs/common'; -import { - ActionStepEnum, - actionStepSchemas, - ChannelStepEnum, - channelStepSchemas, - Schema, - StepType, -} from '@novu/framework'; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { JSONSchema } from 'json-schema-to-ts'; + +import { StepType } from '@novu/framework'; +import { NotificationStepEntity, NotificationTemplateRepository } from '@novu/dal'; -import { GetStepSchemaCommand } from './get-step-schema.command'; -import { SchemaOutput } from '../../types'; +import { + GetExistingStepSchemaCommand, + GetStepSchemaCommand, + GetStepTypeSchemaCommand, +} from './get-step-schema.command'; +import { StepSchemaDto } from '../../dtos/step-schema.dto'; +import { mapStepTypeToOutput, mapStepTypeToResult } from '../../shared'; @Injectable() export class GetStepSchema { - async execute(command: GetStepSchemaCommand): Promise { - return StepTypeToOutputMap[command.stepType]; + constructor(private readonly notificationTemplateRepository: NotificationTemplateRepository) {} + + async execute(command: GetStepSchemaCommand): Promise { + if (isGetByStepType(command)) { + return { controls: buildControlsSchema({ stepType: command.stepType }), variables: buildVariablesSchema() }; + } + + if (isGetByStepId(command)) { + const { currentStep, previousSteps } = await this.findSteps(command); + + return { + controls: buildControlsSchema({ controlsSchema: currentStep.template?.controls?.schema }), + variables: buildVariablesSchema(previousSteps), + }; + } + + throw new BadRequestException('Invalid command'); + } + + private async findSteps(command: GetExistingStepSchemaCommand) { + const workflow = await this.notificationTemplateRepository.findByIdQuery({ + id: command.workflowId, + environmentId: command.environmentId, + }); + + if (!workflow) { + throw new BadRequestException({ + message: 'No workflow found', + workflowId: command.workflowId, + }); + } + + const currentStep = workflow.steps.find((stepItem) => stepItem._id === command.stepId); + + if (!currentStep) { + throw new BadRequestException({ + message: 'No step found', + stepId: command.stepId, + workflowId: command.workflowId, + }); + } + + const previousSteps = workflow.steps.slice( + 0, + workflow.steps.findIndex((stepItem) => stepItem._id === command.stepId) + ); + + return { currentStep, previousSteps }; } } -export const getStepDefaultOutput = (stepType: StepType): SchemaOutput => { - return StepTypeToOutputMap[stepType]; +const isGetByStepType = (command: GetStepSchemaCommand): command is GetStepTypeSchemaCommand => + (command as GetStepTypeSchemaCommand).stepType !== undefined; + +const isGetByStepId = (command: GetStepSchemaCommand): command is GetExistingStepSchemaCommand => + (command as GetExistingStepSchemaCommand).stepId !== undefined && + (command as GetExistingStepSchemaCommand).workflowId !== undefined; + +export const buildControlsSchema = ({ + stepType, + controlsSchema, +}: { + stepType?: StepType; + controlsSchema?: JSONSchema; +}): JSONSchema => { + if (controlsSchema && typeof controlsSchema === 'object') { + return { + ...controlsSchema, + description: 'Output of the step, including any controls defined in the Bridge App', + }; + } + + if (stepType) { + return { + ...mapStepTypeToOutput[stepType], + description: 'Output of the step, including any controls defined in the Bridge App', + }; + } + + throw new Error('No controls schema found'); }; -export const StepTypeToOutputMap = { - [ChannelStepEnum.SMS]: channelStepSchemas[ChannelStepEnum.SMS].output, - [ChannelStepEnum.EMAIL]: channelStepSchemas[ChannelStepEnum.EMAIL].output, - [ChannelStepEnum.PUSH]: channelStepSchemas[ChannelStepEnum.PUSH].output, - [ChannelStepEnum.CHAT]: channelStepSchemas[ChannelStepEnum.CHAT].output, - [ChannelStepEnum.IN_APP]: channelStepSchemas[ChannelStepEnum.IN_APP].output, - [ActionStepEnum.DELAY]: actionStepSchemas[ActionStepEnum.DELAY].output, - [ActionStepEnum.DIGEST]: actionStepSchemas[ActionStepEnum.DIGEST].output, - [ActionStepEnum.CUSTOM]: { +const buildSubscriberSchema = () => + ({ type: 'object', - properties: {}, - required: [], + description: 'Schema representing the subscriber entity', + properties: { + firstName: { type: 'string', description: "Subscriber's first name" }, + lastName: { type: 'string', description: "Subscriber's last name" }, + email: { type: 'string', description: "Subscriber's email address" }, + phone: { type: 'string', description: "Subscriber's phone number (optional)" }, + avatar: { type: 'string', description: "URL to the subscriber's avatar image (optional)" }, + locale: { type: 'string', description: 'Locale for the subscriber (optional)' }, + subscriberId: { type: 'string', description: 'Unique identifier for the subscriber' }, + isOnline: { type: 'boolean', description: 'Indicates if the subscriber is online (optional)' }, + lastOnlineAt: { + type: 'string', + format: 'date-time', + description: 'The last time the subscriber was online (optional)', + }, + }, + required: ['firstName', 'lastName', 'email', 'subscriberId'], + additionalProperties: false, + }) as const satisfies JSONSchema; + +const buildVariablesSchema = (previousSteps?: NotificationStepEntity[]): JSONSchema => { + return { + type: 'object', + description: + // eslint-disable-next-line max-len + 'Variables that can be used with Liquid JS Template syntax. Includes subscriber attributes, steps variables, and supports liquid filters for formatting.', + properties: { + subscriber: buildSubscriberSchema(), + steps: buildPreviousStepsSchema(previousSteps), + }, + required: ['subscriber'], additionalProperties: false, - } as const satisfies Schema, + } as const satisfies JSONSchema; }; + +function buildPreviousStepsSchema(previousSteps: NotificationStepEntity[] | undefined) { + type StepUUID = string; + let previousStepsProperties: Record = {}; + + previousStepsProperties = (previousSteps || []).reduce( + (acc, step) => { + if (step.template?._id) { + acc[step.template._id] = mapStepTypeToResult[step.template.type as StepType]; + } + + return acc; + }, + {} as Record + ); + + return { + type: 'object', + properties: previousStepsProperties, + required: [], + additionalProperties: false, + description: 'Previous Steps Results', + } as const satisfies JSONSchema; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e83331ea77..597b9520bc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -479,6 +479,9 @@ importers: ioredis: specifier: 5.3.2 version: 5.3.2 + json-schema-to-ts: + specifier: ^3.0.0 + version: 3.1.0 jsonwebtoken: specifier: 9.0.0 version: 9.0.0 @@ -1302,7 +1305,7 @@ importers: version: 0.42.0(jsdom@25.0.0)(typescript@5.6.2) '@pandacss/studio': specifier: ^0.42.0 - version: 0.42.0(@types/node@20.16.5)(@types/react-dom@18.3.0)(@types/react@18.3.3)(jsdom@25.0.0)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)(typescript@5.6.2) + version: 0.42.0(@types/node@20.16.5)(@types/react-dom@18.3.0)(@types/react@18.3.3)(jsdom@25.0.0)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)(typescript@5.6.2) '@playwright/test': specifier: ^1.44.0 version: 1.44.0 @@ -1552,7 +1555,7 @@ importers: version: 11.10.6(@emotion/react@11.10.6(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) '@mantine/core': specifier: 4.2.12 - version: 4.2.12(@babel/core@7.21.4)(@mantine/hooks@4.2.12(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.2.12(@babel/core@7.25.2)(@mantine/hooks@4.2.12(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': specifier: 4.2.12 version: 4.2.12(react@18.3.1) @@ -1616,25 +1619,25 @@ importers: devDependencies: '@babel/plugin-proposal-optional-chaining': specifier: ^7.20.7 - version: 7.21.0(@babel/core@7.21.4) + version: 7.21.0(@babel/core@7.25.2) '@babel/plugin-transform-react-display-name': specifier: ^7.18.6 - version: 7.22.5(@babel/core@7.21.4) + version: 7.22.5(@babel/core@7.25.2) '@babel/plugin-transform-runtime': specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + version: 7.23.2(@babel/core@7.25.2) '@babel/polyfill': specifier: ^7.12.1 version: 7.12.1 '@babel/preset-env': specifier: ^7.23.2 - version: 7.23.2(@babel/core@7.21.4) + version: 7.23.2(@babel/core@7.25.2) '@babel/preset-react': specifier: ^7.13.13 - version: 7.22.15(@babel/core@7.21.4) + version: 7.22.15(@babel/core@7.25.2) '@babel/preset-typescript': specifier: ^7.13.0 - version: 7.21.4(@babel/core@7.21.4) + version: 7.21.4(@babel/core@7.25.2) '@babel/runtime': specifier: ^7.20.13 version: 7.21.0 @@ -1697,10 +1700,10 @@ importers: version: 4.1.0(less@4.1.3)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) react-app-rewired: specifier: ^2.2.1 - version: 2.2.1(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1)) + version: 2.2.1(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1)) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1) + version: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1) typescript: specifier: 5.6.2 version: 5.6.2 @@ -34228,11 +34231,11 @@ snapshots: dependencies: prismjs: 1.29.0 - '@astrojs/react@3.0.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6))': + '@astrojs/react@3.0.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6))': dependencies: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - '@vitejs/plugin-react': 4.3.1(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)) + '@vitejs/plugin-react': 4.3.1(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ultrahtml: 1.5.3 @@ -38071,11 +38074,6 @@ snapshots: '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -38231,11 +38229,6 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -38461,11 +38454,6 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -39423,15 +39411,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-module-transforms': 7.22.20(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-modules-commonjs@7.22.15(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -40126,11 +40105,6 @@ snapshots: '@babel/core': 7.22.11 '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -40201,15 +40175,6 @@ snapshots: '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) '@babel/types': 7.22.19 - '@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/types': 7.24.0 - '@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -40248,35 +40213,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4)': + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11)': dependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.22.11 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.21.4) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.22.11) '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11)': + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.24.3)': dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.24.3 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.22.11) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.3) '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.24.3)': + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': dependencies: - '@babel/core': 7.24.3 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.3) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -40293,12 +40258,6 @@ snapshots: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -40597,14 +40556,6 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.21.4) - '@babel/plugin-transform-typescript@7.21.3(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -41397,16 +41348,6 @@ snapshots: '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.22.11) '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.22.11) - '@babel/preset-react@7.22.15(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.21.4) - '@babel/preset-react@7.22.15(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -41449,17 +41390,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.21.4(@babel/core@7.21.4)': - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.21.4) - '@babel/plugin-transform-modules-commonjs': 7.22.15(@babel/core@7.21.4) - '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.4) - transitivePeerDependencies: - - supports-color - '@babel/preset-typescript@7.21.4(@babel/core@7.22.11)': dependencies: '@babel/core': 7.22.11 @@ -42663,7 +42593,7 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 - '@emotion/react@11.7.1(@babel/core@7.21.4)(@types/react@18.3.3)(react@18.3.1)': + '@emotion/react@11.7.1(@babel/core@7.25.2)(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.6 '@emotion/cache': 11.11.0 @@ -42674,7 +42604,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@babel/core': 7.21.4 + '@babel/core': 7.25.2 '@types/react': 18.3.3 '@emotion/serialize@1.0.2': @@ -44839,10 +44769,10 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@mantine/core@4.2.12(@babel/core@7.21.4)(@mantine/hooks@4.2.12(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/core@4.2.12(@babel/core@7.25.2)(@mantine/hooks@4.2.12(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mantine/hooks': 4.2.12(react@18.3.1) - '@mantine/styles': 4.2.12(@babel/core@7.21.4)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/styles': 4.2.12(@babel/core@7.25.2)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@popperjs/core': 2.11.7 '@radix-ui/react-scroll-area': 0.1.4(react@18.3.1) react: 18.3.1 @@ -44934,10 +44864,10 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@mantine/styles@4.2.12(@babel/core@7.21.4)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/styles@4.2.12(@babel/core@7.25.2)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@emotion/cache': 11.7.1 - '@emotion/react': 11.7.1(@babel/core@7.21.4)(@types/react@18.3.3)(react@18.3.1) + '@emotion/react': 11.7.1(@babel/core@7.25.2)(@types/react@18.3.3)(react@18.3.1) '@emotion/serialize': 1.0.2 '@emotion/utils': 1.0.0 clsx: 1.2.1 @@ -47759,10 +47689,10 @@ snapshots: '@pandacss/shared': 0.45.2 micromatch: 4.0.5 - '@pandacss/astro-plugin-studio@0.42.0(astro@4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)(typescript@5.6.2))(jsdom@25.0.0)(typescript@5.6.2)': + '@pandacss/astro-plugin-studio@0.42.0(astro@4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)(typescript@5.6.2))(jsdom@25.0.0)(typescript@5.6.2)': dependencies: '@pandacss/node': 0.42.0(jsdom@25.0.0)(typescript@5.6.2) - astro: 4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)(typescript@5.6.2) + astro: 4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)(typescript@5.6.2) javascript-stringify: 2.1.0 transitivePeerDependencies: - jsdom @@ -48197,19 +48127,19 @@ snapshots: '@pandacss/shared@0.45.2': {} - '@pandacss/studio@0.42.0(@types/node@20.16.5)(@types/react-dom@18.3.0)(@types/react@18.3.3)(jsdom@25.0.0)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)(typescript@5.6.2)': + '@pandacss/studio@0.42.0(@types/node@20.16.5)(@types/react-dom@18.3.0)(@types/react@18.3.3)(jsdom@25.0.0)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)(typescript@5.6.2)': dependencies: - '@astrojs/react': 3.0.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)) - '@pandacss/astro-plugin-studio': 0.42.0(astro@4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)(typescript@5.6.2))(jsdom@25.0.0)(typescript@5.6.2) + '@astrojs/react': 3.0.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)) + '@pandacss/astro-plugin-studio': 0.42.0(astro@4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)(typescript@5.6.2))(jsdom@25.0.0)(typescript@5.6.2) '@pandacss/config': 0.42.0 '@pandacss/logger': 0.42.0 '@pandacss/shared': 0.42.0 '@pandacss/token-dictionary': 0.42.0 '@pandacss/types': 0.42.0 - astro: 4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)(typescript@5.6.2) + astro: 4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)(typescript@5.6.2) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - vite: 5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6) + vite: 5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) transitivePeerDependencies: - '@types/node' - '@types/react' @@ -57002,14 +56932,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.1(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6))': + '@vitejs/plugin-react@4.3.1(vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6) + vite: 5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) transitivePeerDependencies: - supports-color @@ -58290,7 +58220,7 @@ snapshots: astring@1.8.6: {} - astro@4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)(typescript@5.6.2): + astro@4.4.0(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)(typescript@5.6.2): dependencies: '@astrojs/compiler': 2.9.1 '@astrojs/internal-helpers': 0.2.1 @@ -58352,8 +58282,8 @@ snapshots: tsconfck: 3.1.1(typescript@5.6.2) unist-util-visit: 5.0.0 vfile: 6.0.2 - vite: 5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6) - vitefu: 0.2.5(vite@5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)) + vite: 5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) + vitefu: 0.2.5(vite@5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)) which-pm: 2.2.0 yargs-parser: 21.1.1 zod: 3.23.8 @@ -62609,7 +62539,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2): dependencies: '@babel/core': 7.21.4 '@babel/eslint-parser': 7.25.1(@babel/core@7.21.4)(eslint@9.9.1(jiti@1.21.6)) @@ -62619,7 +62549,7 @@ snapshots: babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.9.1(jiti@1.21.6) - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint@9.9.1(jiti@1.21.6)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6)) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.9.1(jiti@1.21.6)) @@ -62636,7 +62566,7 @@ snapshots: - jest - supports-color - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2): dependencies: '@babel/core': 7.21.4 '@babel/eslint-parser': 7.25.1(@babel/core@7.21.4)(eslint@9.9.1(jiti@1.21.6)) @@ -62646,7 +62576,7 @@ snapshots: babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 9.9.1(jiti@1.21.6) - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint@9.9.1(jiti@1.21.6)) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@9.9.1(jiti@1.21.6)) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6)) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.9.0(eslint@9.9.1(jiti@1.21.6)) @@ -62744,18 +62674,18 @@ snapshots: eslint: 8.57.1 ignore: 5.3.2 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.21.4) - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.21.4) + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.22.11) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.22.11) eslint: 9.9.1(jiti@1.21.6) lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint@9.9.1(jiti@1.21.6)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint@9.9.1(jiti@1.21.6)): dependencies: - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.22.11) + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) eslint: 9.9.1(jiti@1.21.6) lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -74310,14 +74240,14 @@ snapshots: regenerator-runtime: 0.13.11 whatwg-fetch: 3.6.2 - react-app-rewired@2.2.1(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1)): + react-app-rewired@2.2.1(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1)): dependencies: - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1) semver: 5.7.2 - react-app-rewired@2.2.1(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1)): + react-app-rewired@2.2.1(react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1)): dependencies: - react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1) + react-scripts: 5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1) semver: 5.7.2 react-chartjs-2@4.3.1(chart.js@3.9.1)(react@18.3.1): @@ -74707,56 +74637,56 @@ snapshots: transitivePeerDependencies: - supports-color - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1): dependencies: '@babel/core': 7.21.4 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(webpack-hot-middleware@2.26.1)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)))(webpack-hot-middleware@2.26.1)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.21.4) - babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.21.4) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.21.5 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.7.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + css-loader: 6.7.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 9.9.1(jiti@1.21.6) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.21.4))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.21.4))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.9.1(jiti@1.21.6))(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) - file-loader: 6.2.0(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.9.1(jiti@1.21.6))(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + file-loader: 6.2.0(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + html-webpack-plugin: 5.5.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) identity-obj-proxy: 3.0.0 jest: 27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))) - mini-css-extract-plugin: 2.7.5(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + mini-css-extract-plugin: 2.7.5(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) postcss: 8.4.47 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.47) - postcss-loader: 6.2.1(postcss@8.4.47)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + postcss-loader: 6.2.1(postcss@8.4.47)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) postcss-normalize: 10.0.1(browserslist@4.21.5)(postcss@8.4.47) postcss-preset-env: 7.8.3(postcss@8.4.47) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + react-dev-utils: 12.0.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) react-refresh: 0.11.0 resolve: 1.22.2 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(sass@1.77.8)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + sass-loader: 12.6.0(sass@1.77.8)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) semver: 7.5.4 - source-map-loader: 3.0.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) - style-loader: 3.3.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + source-map-loader: 3.0.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + style-loader: 3.3.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) tailwindcss: 3.4.13(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.7(@swc/core@1.3.107(@swc/helpers@0.5.12))(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) - webpack: 5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12)) - webpack-dev-server: 4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) - webpack-manifest-plugin: 4.1.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) - workbox-webpack-plugin: 6.5.4(@types/babel__core@7.20.5)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + terser-webpack-plugin: 5.3.7(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + webpack: 5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20) + webpack-dev-server: 4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + webpack-manifest-plugin: 4.1.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + workbox-webpack-plugin: 6.5.4(@types/babel__core@7.20.5)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) optionalDependencies: fsevents: 2.3.3 typescript: 5.6.2 @@ -74793,56 +74723,56 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(esbuild@0.18.20)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(react@18.3.1)(sass@1.77.8)(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))(type-fest@2.19.0)(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack-hot-middleware@2.26.1): dependencies: '@babel/core': 7.21.4 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)))(webpack-hot-middleware@2.26.1)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(@types/webpack@5.28.5(@swc/core@1.3.107(@swc/helpers@0.5.12)))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(webpack-hot-middleware@2.26.1)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.21.4) - babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + babel-loader: 8.3.0(@babel/core@7.21.4)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.21.4) babel-preset-react-app: 10.0.1 bfj: 7.0.2 browserslist: 4.21.5 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.7.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) - css-minimizer-webpack-plugin: 3.4.1(esbuild@0.18.20)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + css-loader: 6.7.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 9.9.1(jiti@1.21.6) - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.22.11))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.22.11))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2) - eslint-webpack-plugin: 3.2.0(eslint@9.9.1(jiti@1.21.6))(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) - file-loader: 6.2.0(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2))(@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.94.0(@swc/core@1.3.107(@swc/helpers@0.5.12))))(eslint@9.9.1(jiti@1.21.6))(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)))(typescript@5.6.2) + eslint-webpack-plugin: 3.2.0(eslint@9.9.1(jiti@1.21.6))(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + file-loader: 6.2.0(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) fs-extra: 10.1.0 - html-webpack-plugin: 5.5.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + html-webpack-plugin: 5.5.3(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) identity-obj-proxy: 3.0.0 jest: 27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2))) - mini-css-extract-plugin: 2.7.5(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + mini-css-extract-plugin: 2.7.5(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) postcss: 8.4.47 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.47) - postcss-loader: 6.2.1(postcss@8.4.47)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + postcss-loader: 6.2.1(postcss@8.4.47)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) postcss-normalize: 10.0.1(browserslist@4.21.5)(postcss@8.4.47) postcss-preset-env: 7.8.3(postcss@8.4.47) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + react-dev-utils: 12.0.1(eslint@9.9.1(jiti@1.21.6))(typescript@5.6.2)(vue-template-compiler@2.7.16)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) react-refresh: 0.11.0 resolve: 1.22.2 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(sass@1.77.8)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + sass-loader: 12.6.0(sass@1.77.8)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) semver: 7.5.4 - source-map-loader: 3.0.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) - style-loader: 3.3.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + source-map-loader: 3.0.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + style-loader: 3.3.2(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) tailwindcss: 3.4.13(ts-node@10.9.1(@swc/core@1.3.107(@swc/helpers@0.5.12))(@types/node@18.16.9)(typescript@5.6.2)) - terser-webpack-plugin: 5.3.7(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) - webpack: 5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20) - webpack-dev-server: 4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) - webpack-manifest-plugin: 4.1.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) - workbox-webpack-plugin: 6.5.4(@types/babel__core@7.20.5)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))(esbuild@0.18.20)) + terser-webpack-plugin: 5.3.7(@swc/core@1.3.107(@swc/helpers@0.5.12))(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + webpack: 5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12)) + webpack-dev-server: 4.11.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + webpack-manifest-plugin: 4.1.1(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) + workbox-webpack-plugin: 6.5.4(@types/babel__core@7.20.5)(webpack@5.78.0(@swc/core@1.3.107(@swc/helpers@0.5.12))) optionalDependencies: fsevents: 2.3.3 typescript: 5.6.2 @@ -77160,11 +77090,6 @@ snapshots: dependencies: postcss: 8.4.38 - sugarss@4.0.1(postcss@8.4.39): - dependencies: - postcss: 8.4.39 - optional: true - sugarss@4.0.1(postcss@8.4.47): dependencies: postcss: 8.4.47 @@ -79820,7 +79745,7 @@ snapshots: sugarss: 4.0.1(postcss@8.4.47) terser: 5.31.6 - vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6): + vite@5.2.13(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6): dependencies: esbuild: 0.20.2 postcss: 8.4.47 @@ -79831,7 +79756,7 @@ snapshots: less: 4.1.3 lightningcss: 1.26.0 sass: 1.77.8 - sugarss: 4.0.1(postcss@8.4.39) + sugarss: 4.0.1(postcss@8.4.47) terser: 5.31.6 vite@5.2.13(@types/node@20.16.5)(less@4.2.0)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.6): @@ -79848,7 +79773,7 @@ snapshots: sugarss: 4.0.1(postcss@8.4.38) terser: 5.31.6 - vite@5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6): + vite@5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6): dependencies: esbuild: 0.21.5 postcss: 8.4.47 @@ -79859,7 +79784,7 @@ snapshots: less: 4.1.3 lightningcss: 1.26.0 sass: 1.77.8 - sugarss: 4.0.1(postcss@8.4.39) + sugarss: 4.0.1(postcss@8.4.47) terser: 5.31.6 vite@5.4.2(@types/node@20.16.5)(less@4.2.0)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.6): @@ -79904,9 +79829,9 @@ snapshots: sugarss: 4.0.1(postcss@8.4.47) terser: 5.31.6 - vitefu@0.2.5(vite@5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6)): + vitefu@0.2.5(vite@5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6)): optionalDependencies: - vite: 5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.39))(terser@5.31.6) + vite: 5.4.2(@types/node@20.16.5)(less@4.1.3)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.47))(terser@5.31.6) vitefu@0.2.5(vite@5.4.2(@types/node@20.16.5)(less@4.2.0)(lightningcss@1.26.0)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.6)): optionalDependencies: