From b03ccdc47ebcd702c08ab62012da57656360c018 Mon Sep 17 00:00:00 2001 From: Megan Li Date: Wed, 12 Apr 2023 17:54:58 -0400 Subject: [PATCH 1/7] giant commit oops --- apps/backend/src/db/utils.ts | 12 +- apps/backend/src/handlers/getFormById.ts | 50 + apps/backend/src/schema/schema.ts | 2 +- apps/backend/template.yaml | 17 + apps/frontend/src/app/app.tsx | 9 + apps/frontend/src/components/ErrorMessage.tsx | 10 + .../src/components/viewForm/FieldView.tsx | 19 + .../src/components/viewForm/GuardianForm.tsx | 58 + .../src/components/viewForm/MedicalForm.tsx | 78 ++ apps/frontend/src/constants/endpoints.ts | 4 +- .../src/hooks/useSortingAndFiltering.ts | 7 +- apps/frontend/src/pages/OneFormPage.tsx | 69 + .../src/pages/medicalFormPage.tsx~main | 23 - apps/frontend/src/types/FormData.d.ts | 14 - apps/frontend/src/types/SortAndFilter.d.ts | 2 +- apps/frontend/src/types/formData.ts | 9 + apps/frontend/src/types/formSchema.ts | 84 +- apps/frontend/src/utils/sendRequest.ts | 10 +- apps/frontend/tsconfig.spec.json | 2 +- package-lock.json | 1126 ++++++++++++++++- package.json | 4 +- 21 files changed, 1515 insertions(+), 94 deletions(-) create mode 100644 apps/backend/src/handlers/getFormById.ts create mode 100644 apps/frontend/src/components/ErrorMessage.tsx create mode 100644 apps/frontend/src/components/viewForm/FieldView.tsx create mode 100644 apps/frontend/src/components/viewForm/GuardianForm.tsx create mode 100644 apps/frontend/src/components/viewForm/MedicalForm.tsx create mode 100644 apps/frontend/src/pages/OneFormPage.tsx delete mode 100644 apps/frontend/src/pages/medicalFormPage.tsx~main delete mode 100644 apps/frontend/src/types/FormData.d.ts create mode 100644 apps/frontend/src/types/formData.ts diff --git a/apps/backend/src/db/utils.ts b/apps/backend/src/db/utils.ts index 1326c50..acac0a6 100644 --- a/apps/backend/src/db/utils.ts +++ b/apps/backend/src/db/utils.ts @@ -11,7 +11,17 @@ export async function insertDocument( export async function fetchDocuments() { return await qldbDriver.executeLambda(async (txn) => { const result = await txn.execute( - `SELECT * FROM ${tableName}` + `SELECT metadata.id, data FROM _ql_committed_${tableName}` + ); + return result.getResultList(); + }); +} + +export async function fetchDocumentById(id: string) { + return await qldbDriver.executeLambda(async (txn) => { + const result = await txn.execute( + `SELECT metadata.id, data FROM _ql_committed_${tableName} where metadata.id = ?`, + id ); return result.getResultList(); }); diff --git a/apps/backend/src/handlers/getFormById.ts b/apps/backend/src/handlers/getFormById.ts new file mode 100644 index 0000000..5eb37c2 --- /dev/null +++ b/apps/backend/src/handlers/getFormById.ts @@ -0,0 +1,50 @@ +import { APIGatewayEvent } from 'aws-lambda'; +import { createTableIfNotExists } from '../db/createTable.js'; +import { fetchDocumentById } from '../db/utils.js'; + +/** + * An HTTP get method to get all forms from the QLDB table. + */ +export const getFormByIdHandler = async (event: APIGatewayEvent) => { + const headers = { + 'Access-Control-Allow-Headers': 'Content-Type, Access-Control-Allow-Origin', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET', + }; + + if (event.httpMethod !== 'GET') { + return { + statusCode: 400, + headers, + body: `getMethod only accepts GET method, you tried: ${event.httpMethod} method.`, + }; + } + // All log statements are written to CloudWatch + console.info('received:', event); + + try { + await createTableIfNotExists(); + const id = event.pathParameters!.id!; + const form = await fetchDocumentById(id); + + const response = { + statusCode: 200, + headers, + body: JSON.stringify(form), + }; + + // All log statements are written to CloudWatch + console.info( + `response from: ${event.path} statusCode: ${response.statusCode}` + ); + + return response; + } catch (error) { + console.error('error accessing database', error); + return { + statusCode: 400, + headers, + body: 'error', + }; + } +}; diff --git a/apps/backend/src/schema/schema.ts b/apps/backend/src/schema/schema.ts index 5632504..24d8591 100644 --- a/apps/backend/src/schema/schema.ts +++ b/apps/backend/src/schema/schema.ts @@ -4,7 +4,7 @@ const addressSchema = z.object({ street: z.string().min(1), city: z.string().min(1), state: z.string().min(1), - zipcode: z.number(), + zipcode: z.string().length(5), }); // Regex to check for phone numbers formatted with `-`, ' ', and '.' separators, diff --git a/apps/backend/template.yaml b/apps/backend/template.yaml index af2bcb5..c6dd7f1 100644 --- a/apps/backend/template.yaml +++ b/apps/backend/template.yaml @@ -104,6 +104,23 @@ Resources: Method: GET RestApiId: !Ref ApiGateway + getFormByIdFunction: + Type: AWS::Serverless::Function + Properties: + Handler: dist/handlers/getFormById.getFormByIdHandler + Runtime: nodejs18.x + Architectures: + - x86_64 + MemorySize: 128 + Timeout: 100 + Description: An http get method to get a form with a certain ID. + Role: !GetAtt QLDBSendCommandRole.Arn + Events: + Api: + Type: Api + Properties: + Path: /form/{id} + Method: GET # This is a Lambda function config associated with the source code: putForm.ts putFormFunction: Type: AWS::Serverless::Function diff --git a/apps/frontend/src/app/app.tsx b/apps/frontend/src/app/app.tsx index 98043dc..ff57bd9 100644 --- a/apps/frontend/src/app/app.tsx +++ b/apps/frontend/src/app/app.tsx @@ -8,6 +8,7 @@ import { RequireAuth } from '../components/auth/RequireAuth'; import ViewFormsList from '../components/ViewFormsList'; import NotFoundPage from '../pages/404'; import FormPage from '../pages/FormPage'; +import OneFormPage from '../pages/OneFormPage'; Amplify.configure(awsExports); @@ -25,6 +26,14 @@ function ConstellationRoutes() { } /> + + + + } + /> } /> diff --git a/apps/frontend/src/components/ErrorMessage.tsx b/apps/frontend/src/components/ErrorMessage.tsx new file mode 100644 index 0000000..fe89e76 --- /dev/null +++ b/apps/frontend/src/components/ErrorMessage.tsx @@ -0,0 +1,10 @@ +import { Text } from '@chakra-ui/react'; + +interface ErrorMessageProps { + message: string; +} +export const ErrorMessage: React.FC = ({ message }) => ( + + Error: {message} + +); diff --git a/apps/frontend/src/components/viewForm/FieldView.tsx b/apps/frontend/src/components/viewForm/FieldView.tsx new file mode 100644 index 0000000..fe8ad05 --- /dev/null +++ b/apps/frontend/src/components/viewForm/FieldView.tsx @@ -0,0 +1,19 @@ +import { Container, Heading, Text } from '@chakra-ui/react'; + +interface FieldViewProps { + fieldName: string; + value: string; +} +export const FieldView: React.FC = ({ fieldName, value }) => ( + + + {fieldName} + + {value} + +); diff --git a/apps/frontend/src/components/viewForm/GuardianForm.tsx b/apps/frontend/src/components/viewForm/GuardianForm.tsx new file mode 100644 index 0000000..031d19e --- /dev/null +++ b/apps/frontend/src/components/viewForm/GuardianForm.tsx @@ -0,0 +1,58 @@ +import { Flex, Heading } from '@chakra-ui/react'; +import type { Asserts } from 'yup'; +import { guardianFormSchema } from '../../types/formSchema'; +import { FieldView } from './FieldView'; + +interface GuardianFormProps { + guardianForm: Asserts; +} +export const GuardianForm: React.FC = ({ guardianForm }) => ( + + + Guardian Form + + + + + + + + + + + + + + + + + + + + + + + + + + +); diff --git a/apps/frontend/src/components/viewForm/MedicalForm.tsx b/apps/frontend/src/components/viewForm/MedicalForm.tsx new file mode 100644 index 0000000..1bae5f8 --- /dev/null +++ b/apps/frontend/src/components/viewForm/MedicalForm.tsx @@ -0,0 +1,78 @@ +import { Flex, Heading } from '@chakra-ui/react'; +import type { Asserts } from 'yup'; +import { medicalFormSchema } from '../../types/formSchema'; +import { FieldView } from './FieldView'; + +interface MedicalFormProps { + medicalForm: Asserts; +} +export const MedicalForm: React.FC = ({ medicalForm }) => ( + + + Medical Form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); diff --git a/apps/frontend/src/constants/endpoints.ts b/apps/frontend/src/constants/endpoints.ts index ccdec8f..e9cb084 100644 --- a/apps/frontend/src/constants/endpoints.ts +++ b/apps/frontend/src/constants/endpoints.ts @@ -1,7 +1,9 @@ // TODO: For testing locally, replace with aws api gateway url export const BASE_URL = - 'https://13m29s1t87.execute-api.us-east-1.amazonaws.com/Prod'; + 'https://kbpreaqzyb.execute-api.us-east-1.amazonaws.com/Prod/'; export const GET_ALL_FORMS_URL = `${BASE_URL}/forms`; +export const GET_FORM_BY_ID_URL = (id: string) => `${BASE_URL}/form/${id}`; + export const POST_FORM_URL = `${BASE_URL}/form`; diff --git a/apps/frontend/src/hooks/useSortingAndFiltering.ts b/apps/frontend/src/hooks/useSortingAndFiltering.ts index 44b3e73..de2713d 100644 --- a/apps/frontend/src/hooks/useSortingAndFiltering.ts +++ b/apps/frontend/src/hooks/useSortingAndFiltering.ts @@ -1,6 +1,6 @@ import { useEffect, useMemo, useState } from 'react'; import SortOrder from '../enums/SortOrder'; -import type FormData from '../types/FormData'; +import { FormData } from '../types/formData'; import { Options } from '../types/SortAndFilter'; /** @@ -109,7 +109,10 @@ const searchData = ( if (searchingObject.searching) { const { searchTerm } = searchingObject.searching; const searchedList = list.filter((form) => { - const formValues = Object.values(form); + const formValues = Object.values({ + ...form.guardianForm, + ...form.medicalForm, + }); const lowercaseFormValues = formValues.map((value) => { if (typeof value === 'string') return value.toLowerCase(); return value; diff --git a/apps/frontend/src/pages/OneFormPage.tsx b/apps/frontend/src/pages/OneFormPage.tsx new file mode 100644 index 0000000..497a045 --- /dev/null +++ b/apps/frontend/src/pages/OneFormPage.tsx @@ -0,0 +1,69 @@ +import { useEffect, useState } from 'react'; +import { getFormById } from '../utils/sendRequest'; +import { useParams } from 'react-router-dom'; +import { FormDataWithId } from '../types/formData'; +import { formSchema } from '../types/formSchema'; +import { + Container, + Flex, + Heading, + Text, + Spinner, + Spacer, +} from '@chakra-ui/react'; +import { ErrorMessage } from '../components/ErrorMessage'; +import { GuardianForm } from '../components/viewForm/guardianForm'; +import { MedicalForm } from '../components/viewForm/MedicalForm'; + +const OneFormPage: React.FC = () => { + const [formData, setFormData] = useState(null); + const [error, setError] = useState(null); + const { id } = useParams(); + + useEffect(() => { + const fetchData = async () => { + if (id) { + const result = await getFormById(id); + const formData: FormDataWithId = { + id: result.data[0].id, + data: formSchema.validateSync(result.data[0].data), + }; + setFormData(formData); + } else { + setError('No form ID.'); + } + }; + fetchData().catch((e) => { + setError('Unable to fetch form data.'); + console.error(e); + }); + }, [id]); + + if (error) { + return ; + } else { + return ( + + + Form {id} + + {formData == null && ( + + + + + + )} + {formData && } + {formData && } + + ); + } +}; + +export default OneFormPage; diff --git a/apps/frontend/src/pages/medicalFormPage.tsx~main b/apps/frontend/src/pages/medicalFormPage.tsx~main deleted file mode 100644 index 1dc744b..0000000 --- a/apps/frontend/src/pages/medicalFormPage.tsx~main +++ /dev/null @@ -1,23 +0,0 @@ -import { Box, Container, Grid, Heading, Text } from '@chakra-ui/react'; -import * as React from 'react'; -import MedicalForm from '../components/form/MedicalForm'; -import Header from '../components/header/Header'; - -const MedicalFormPage: React.FC = () => ( - - - -
- - Information - - - (to be completed by medical professional) - - -
-
-
-); - -export default MedicalFormPage; diff --git a/apps/frontend/src/types/FormData.d.ts b/apps/frontend/src/types/FormData.d.ts deleted file mode 100644 index b4956e4..0000000 --- a/apps/frontend/src/types/FormData.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This will need to be updated to match the shape of the data we receive from the backend -type FormData = { - id: number; - date: string; - childsName: string; - dob: string; - hospital: string; - address: { - city: string; - state: string; - }; -}; - -export default FormData; diff --git a/apps/frontend/src/types/SortAndFilter.d.ts b/apps/frontend/src/types/SortAndFilter.d.ts index e45e133..9b7a24b 100644 --- a/apps/frontend/src/types/SortAndFilter.d.ts +++ b/apps/frontend/src/types/SortAndFilter.d.ts @@ -1,4 +1,4 @@ -import FormData from './FormData'; +import { FormData } from './formData'; import SortOrder from '../enums/SortOrder'; export type Options = { diff --git a/apps/frontend/src/types/formData.ts b/apps/frontend/src/types/formData.ts new file mode 100644 index 0000000..40cfc0c --- /dev/null +++ b/apps/frontend/src/types/formData.ts @@ -0,0 +1,9 @@ +import type { Asserts } from 'yup'; +import { formSchema } from './formSchema'; + +export type FormData = Asserts; + +export interface FormDataWithId { + id: string; + data: FormData; +} diff --git a/apps/frontend/src/types/formSchema.ts b/apps/frontend/src/types/formSchema.ts index 5600020..8bb7fd8 100644 --- a/apps/frontend/src/types/formSchema.ts +++ b/apps/frontend/src/types/formSchema.ts @@ -4,47 +4,51 @@ const addressSchema = Yup.object({ street: Yup.string().min(1).required(), city: Yup.string().min(1).required(), state: Yup.string().min(1).required(), - zipcode: Yup.number().required(), + zipcode: Yup.string().length(5).required(), +}); + +export const guardianFormSchema = Yup.object().shape({ + childsName: Yup.string().min(1).required(), + dob: Yup.date() + .default(() => new Date()) + .required(), + gender: Yup.string().min(1), + guardianName: Yup.string().min(1).required(), + address: addressSchema, + phone: Yup.string().required(), + cellPhone: Yup.string(), + email: Yup.string().email().required(), + requestedGrantAmount: Yup.number().positive(), + intendedUseOfGrant: Yup.string(), + signature: Yup.string().min(1).required(), + date: Yup.date() + .default(() => new Date()) + .required(), +}); + +export const medicalFormSchema = Yup.object().shape({ + childsDiagnosis: Yup.string().min(1).required(), + otherDiagnosis: Yup.string(), + dateOfDiagnosis: Yup.date() + .default(() => new Date()) + .required(), + childsPhysician: Yup.string().min(1).required(), + hospital: Yup.string().min(1).required(), + otherHospital: Yup.string(), + address: addressSchema, + phone: Yup.string().required(), + descriptionOfCondition: Yup.string(), + medicalProfessionalName: Yup.string().min(1), + medicalProfessionalTitle: Yup.string().min(1), + signature: Yup.string().min(1).required(), + date: Yup.date() + .default(() => new Date()) + .required(), + socialWorkersEmail: Yup.string().email().required(), + notes: Yup.string(), }); export const formSchema = Yup.object().shape({ - guardianForm: Yup.object().shape({ - childsName: Yup.string().min(1).required(), - dob: Yup.date() - .default(() => new Date()) - .required(), - gender: Yup.string().min(1), - guardianName: Yup.string().min(1).required(), - address: addressSchema, - phone: Yup.string().required(), - cellPhone: Yup.string(), - email: Yup.string().email().required(), - requestedGrantAmount: Yup.number().positive(), - intendedUseOfGrant: Yup.string(), - signature: Yup.string().min(1).required(), - date: Yup.date() - .default(() => new Date()) - .required(), - }), - medicalForm: Yup.object().shape({ - childsDiagnosis: Yup.string().min(1).required(), - otherDiagnosis: Yup.string(), - dateOfDiagnosis: Yup.date() - .default(() => new Date()) - .required(), - childsPhysician: Yup.string().min(1).required(), - hospital: Yup.string().min(1).required(), - otherHospital: Yup.string(), - address: addressSchema, - phone: Yup.string().required(), - descriptionOfCondition: Yup.string(), - medicalProfessionalName: Yup.string().min(1), - medicalProfessionalTitle: Yup.string().min(1), - signature: Yup.string().min(1).required(), - date: Yup.date() - .default(() => new Date()) - .required(), - socialWorkersEmail: Yup.string().email().required(), - notes: Yup.string(), - }), + guardianForm: guardianFormSchema, + medicalForm: medicalFormSchema, }); diff --git a/apps/frontend/src/utils/sendRequest.ts b/apps/frontend/src/utils/sendRequest.ts index 25e30d2..3b707f8 100644 --- a/apps/frontend/src/utils/sendRequest.ts +++ b/apps/frontend/src/utils/sendRequest.ts @@ -1,6 +1,10 @@ import axios, { AxiosResponse } from 'axios'; import { FormValues } from '../components/form/Form'; -import { GET_ALL_FORMS_URL, POST_FORM_URL } from '../constants/endpoints'; +import { + GET_ALL_FORMS_URL, + GET_FORM_BY_ID_URL, + POST_FORM_URL, +} from '../constants/endpoints'; export const submitForm = async (body: FormValues): Promise => { try { @@ -20,3 +24,7 @@ export const getAllForms = async (): Promise => { alert('Error getting data'); } }; + +export const getFormById = async (id: string): Promise => { + return await axios.get(GET_FORM_BY_ID_URL(id)); +}; diff --git a/apps/frontend/tsconfig.spec.json b/apps/frontend/tsconfig.spec.json index 3100599..84d9a5e 100644 --- a/apps/frontend/tsconfig.spec.json +++ b/apps/frontend/tsconfig.spec.json @@ -16,7 +16,7 @@ "src/**/*.test.jsx", "src/**/*.spec.jsx", "src/**/*.d.ts" - ], +, "src/types/formData.ts" ], "files": [ "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", "../../node_modules/@nrwl/react/typings/image.d.ts" diff --git a/package-lock.json b/package-lock.json index 81b9fe4..48fcdce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "react-query": "^3.39.3", "react-router-dom": "^6.8.1", "tslib": "^2.3.0", - "yup": "^1.0.2" + "yup": "^1.1.0" }, "devDependencies": { "@babel/preset-react": "^7.14.5", @@ -10004,6 +10004,380 @@ "version": "0.3.0", "license": "MIT" }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz", + "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", + "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz", + "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", + "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", + "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", + "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", + "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", + "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", + "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", + "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", + "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", + "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", + "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", + "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", + "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", + "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", + "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", + "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", + "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", + "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", + "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", + "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.4.1", "dev": true, @@ -14330,6 +14704,23 @@ "@types/node": "*" } }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true, + "peer": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.35", "dev": true, @@ -15357,8 +15748,9 @@ } }, "node_modules/acorn": { - "version": "8.8.1", - "license": "MIT", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { "acorn": "bin/acorn" }, @@ -15940,6 +16332,16 @@ "node": ">=0.8" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -16935,6 +17337,25 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "peer": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "4.1.0", "license": "MIT", @@ -16976,6 +17397,16 @@ "node": ">=10" } }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/check-more-types": { "version": "2.24.0", "dev": true, @@ -18329,6 +18760,19 @@ "dev": true, "license": "MIT" }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "peer": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-equal": { "version": "2.2.0", "dev": true, @@ -18972,6 +19416,44 @@ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", "dev": true }, + "node_modules/esbuild": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz", + "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.16", + "@esbuild/android-arm64": "0.17.16", + "@esbuild/android-x64": "0.17.16", + "@esbuild/darwin-arm64": "0.17.16", + "@esbuild/darwin-x64": "0.17.16", + "@esbuild/freebsd-arm64": "0.17.16", + "@esbuild/freebsd-x64": "0.17.16", + "@esbuild/linux-arm": "0.17.16", + "@esbuild/linux-arm64": "0.17.16", + "@esbuild/linux-ia32": "0.17.16", + "@esbuild/linux-loong64": "0.17.16", + "@esbuild/linux-mips64el": "0.17.16", + "@esbuild/linux-ppc64": "0.17.16", + "@esbuild/linux-riscv64": "0.17.16", + "@esbuild/linux-s390x": "0.17.16", + "@esbuild/linux-x64": "0.17.16", + "@esbuild/netbsd-x64": "0.17.16", + "@esbuild/openbsd-x64": "0.17.16", + "@esbuild/sunos-x64": "0.17.16", + "@esbuild/win32-arm64": "0.17.16", + "@esbuild/win32-ia32": "0.17.16", + "@esbuild/win32-x64": "0.17.16" + } + }, "node_modules/escalade": { "version": "3.1.1", "license": "MIT", @@ -20741,6 +21223,16 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.1.3", "dev": true, @@ -24076,6 +24568,19 @@ "node": ">=8.9.0" } }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "5.0.0", "license": "MIT", @@ -24288,6 +24793,16 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "peer": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -26527,6 +27042,16 @@ "node": ">=8" } }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/pbf": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", @@ -30011,6 +30536,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -30581,6 +31119,13 @@ "version": "1.0.3", "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", + "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==", + "dev": true, + "peer": true + }, "node_modules/tinycolor2": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", @@ -30589,11 +31134,31 @@ "node": "*" } }, + "node_modules/tinypool": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", + "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tinyqueue": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmp": { "version": "0.2.1", "dev": true, @@ -31444,6 +32009,154 @@ "dev": true, "license": "MIT" }, + "node_modules/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", + "dev": true, + "peer": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.18.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", + "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "dev": true, + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vitest": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.25.8.tgz", + "integrity": "sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "source-map": "^0.6.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.3.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "peer": true + }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -32120,8 +32833,9 @@ } }, "node_modules/yup": { - "version": "1.0.2", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.1.0.tgz", + "integrity": "sha512-CtpEHWiIMwWJBJ+zX8xWImXXdvJ10X/sKkYYTXfVocHj087e9zhP0GNkU7HlXBBI4T9BtHQxs8n2jLzmo/X8Yg==", "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", @@ -40026,6 +40740,182 @@ "@emotion/weak-memoize": { "version": "0.3.0" }, + "@esbuild/android-arm": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz", + "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/android-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", + "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/android-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz", + "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", + "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", + "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", + "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", + "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-arm": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", + "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", + "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", + "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", + "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", + "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", + "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", + "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", + "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/linux-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", + "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", + "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", + "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", + "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", + "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", + "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", + "dev": true, + "optional": true, + "peer": true + }, + "@esbuild/win32-x64": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", + "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", + "dev": true, + "optional": true, + "peer": true + }, "@eslint/eslintrc": { "version": "1.4.1", "dev": true, @@ -43187,6 +44077,23 @@ "@types/node": "*" } }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true, + "peer": true + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "peer": true, + "requires": { + "@types/chai": "*" + } + }, "@types/connect": { "version": "3.4.35", "dev": true, @@ -43923,7 +44830,9 @@ } }, "acorn": { - "version": "8.8.1" + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" }, "acorn-globals": { "version": "6.0.0", @@ -44319,6 +45228,13 @@ "version": "1.0.0", "dev": true }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "peer": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -45029,6 +45945,22 @@ "version": "0.12.0", "dev": true }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "peer": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, "chalk": { "version": "4.1.0", "requires": { @@ -45059,6 +45991,13 @@ "version": "1.0.2", "dev": true }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "peer": true + }, "check-more-types": { "version": "2.24.0", "dev": true @@ -45998,6 +46937,16 @@ "version": "0.7.0", "dev": true }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "peer": true, + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-equal": { "version": "2.2.0", "dev": true, @@ -46461,6 +47410,37 @@ "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", "dev": true }, + "esbuild": { + "version": "0.17.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz", + "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", + "dev": true, + "peer": true, + "requires": { + "@esbuild/android-arm": "0.17.16", + "@esbuild/android-arm64": "0.17.16", + "@esbuild/android-x64": "0.17.16", + "@esbuild/darwin-arm64": "0.17.16", + "@esbuild/darwin-x64": "0.17.16", + "@esbuild/freebsd-arm64": "0.17.16", + "@esbuild/freebsd-x64": "0.17.16", + "@esbuild/linux-arm": "0.17.16", + "@esbuild/linux-arm64": "0.17.16", + "@esbuild/linux-ia32": "0.17.16", + "@esbuild/linux-loong64": "0.17.16", + "@esbuild/linux-mips64el": "0.17.16", + "@esbuild/linux-ppc64": "0.17.16", + "@esbuild/linux-riscv64": "0.17.16", + "@esbuild/linux-s390x": "0.17.16", + "@esbuild/linux-x64": "0.17.16", + "@esbuild/netbsd-x64": "0.17.16", + "@esbuild/openbsd-x64": "0.17.16", + "@esbuild/sunos-x64": "0.17.16", + "@esbuild/win32-arm64": "0.17.16", + "@esbuild/win32-ia32": "0.17.16", + "@esbuild/win32-x64": "0.17.16" + } + }, "escalade": { "version": "3.1.1" }, @@ -47667,6 +48647,13 @@ "get-caller-file": { "version": "2.0.5" }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "peer": true + }, "get-intrinsic": { "version": "1.1.3", "dev": true, @@ -49922,6 +50909,13 @@ "json5": "^2.1.2" } }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "peer": true + }, "locate-path": { "version": "5.0.0", "requires": { @@ -50084,6 +51078,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "peer": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -51767,6 +52771,13 @@ "path-type": { "version": "4.0.0" }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "peer": true + }, "pbf": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", @@ -54114,6 +55125,16 @@ "version": "3.1.1", "dev": true }, + "strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "peer": true, + "requires": { + "acorn": "^8.8.2" + } + }, "strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -54510,16 +55531,37 @@ "tiny-warning": { "version": "1.0.3" }, + "tinybench": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", + "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==", + "dev": true, + "peer": true + }, "tinycolor2": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" }, + "tinypool": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", + "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", + "dev": true, + "peer": true + }, "tinyqueue": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" }, + "tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "peer": true + }, "tmp": { "version": "0.2.1", "dev": true, @@ -55063,6 +56105,74 @@ } } }, + "vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", + "dev": true, + "peer": true, + "requires": { + "esbuild": "^0.17.5", + "fsevents": "~2.3.2", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.18.0" + }, + "dependencies": { + "rollup": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", + "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "dev": true, + "peer": true, + "requires": { + "fsevents": "~2.3.2" + } + } + } + }, + "vitest": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.25.8.tgz", + "integrity": "sha512-X75TApG2wZTJn299E/TIYevr4E9/nBo1sUtZzn0Ci5oK8qnpZAZyhwg0qCeMSakGIWtc6oRwcQFyFfW14aOFWg==", + "dev": true, + "peer": true, + "requires": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "source-map": "^0.6.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.3.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "peer": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "peer": true + } + } + }, "vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -55498,7 +56608,9 @@ "version": "0.1.0" }, "yup": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.1.0.tgz", + "integrity": "sha512-CtpEHWiIMwWJBJ+zX8xWImXXdvJ10X/sKkYYTXfVocHj087e9zhP0GNkU7HlXBBI4T9BtHQxs8n2jLzmo/X8Yg==", "requires": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", diff --git a/package.json b/package.json index 8dad5df..5f9ea8b 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "@chakra-ui/react": "^2.4.9", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", - "axios": "^1.3.4", "aws-amplify": "^5.0.22", + "axios": "^1.3.4", "formik": "^2.2.9", "framer-motion": "^9.0.1", "react": "18.2.0", @@ -60,6 +60,6 @@ "react-query": "^3.39.3", "react-router-dom": "^6.8.1", "tslib": "^2.3.0", - "yup": "^1.0.2" + "yup": "^1.1.0" } } From 7b06fefde6b9e65131d9790bc26c7c38ba1a23c6 Mon Sep 17 00:00:00 2001 From: Megan Li Date: Wed, 12 Apr 2023 18:10:50 -0400 Subject: [PATCH 2/7] fix import --- apps/frontend/src/pages/OneFormPage.tsx | 2 +- apps/frontend/src/pages/medicalFormPage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/pages/OneFormPage.tsx b/apps/frontend/src/pages/OneFormPage.tsx index 497a045..ae679db 100644 --- a/apps/frontend/src/pages/OneFormPage.tsx +++ b/apps/frontend/src/pages/OneFormPage.tsx @@ -12,7 +12,7 @@ import { Spacer, } from '@chakra-ui/react'; import { ErrorMessage } from '../components/ErrorMessage'; -import { GuardianForm } from '../components/viewForm/guardianForm'; +import { GuardianForm } from '../components/viewForm/GuardianForm'; import { MedicalForm } from '../components/viewForm/MedicalForm'; const OneFormPage: React.FC = () => { diff --git a/apps/frontend/src/pages/medicalFormPage.tsx b/apps/frontend/src/pages/medicalFormPage.tsx index 654bed9..a5b6732 100644 --- a/apps/frontend/src/pages/medicalFormPage.tsx +++ b/apps/frontend/src/pages/medicalFormPage.tsx @@ -12,7 +12,7 @@ const MedicalFormPage: React.FC = () => ( Information - + (to be completed by medical professional) From 5692cc799ec2e7ca83cdef7b344d02fac3675af8 Mon Sep 17 00:00:00 2001 From: Megan Li Date: Wed, 12 Apr 2023 18:32:51 -0400 Subject: [PATCH 3/7] remove minor odd changes --- apps/frontend/src/pages/medicalFormPage.tsx | 2 +- apps/frontend/tsconfig.spec.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/frontend/src/pages/medicalFormPage.tsx b/apps/frontend/src/pages/medicalFormPage.tsx index a5b6732..654bed9 100644 --- a/apps/frontend/src/pages/medicalFormPage.tsx +++ b/apps/frontend/src/pages/medicalFormPage.tsx @@ -12,7 +12,7 @@ const MedicalFormPage: React.FC = () => ( Information - + (to be completed by medical professional) diff --git a/apps/frontend/tsconfig.spec.json b/apps/frontend/tsconfig.spec.json index 84d9a5e..d682ab8 100644 --- a/apps/frontend/tsconfig.spec.json +++ b/apps/frontend/tsconfig.spec.json @@ -15,8 +15,8 @@ "src/**/*.spec.js", "src/**/*.test.jsx", "src/**/*.spec.jsx", - "src/**/*.d.ts" -, "src/types/formData.ts" ], + "src/**/*.d.ts", + ], "files": [ "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", "../../node_modules/@nrwl/react/typings/image.d.ts" From 187b97b8c2229c912c57cd79733edc72c0fac27f Mon Sep 17 00:00:00 2001 From: Megan Li Date: Wed, 12 Apr 2023 18:38:03 -0400 Subject: [PATCH 4/7] test test 2 --- apps/frontend/src/pages/medicalFormPage.tsx | 24 --------------------- 1 file changed, 24 deletions(-) delete mode 100644 apps/frontend/src/pages/medicalFormPage.tsx diff --git a/apps/frontend/src/pages/medicalFormPage.tsx b/apps/frontend/src/pages/medicalFormPage.tsx deleted file mode 100644 index 654bed9..0000000 --- a/apps/frontend/src/pages/medicalFormPage.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Box, Container, Heading, Text } from '@chakra-ui/react'; -import React from 'react'; -import MedicalForm from '../components/form/MedicalForm'; -import Header from '../components/header/Header'; - -const MedicalFormPage: React.FC = () => ( - - -
- - - Information - - - - (to be completed by medical professional) - - - - - -); - -export default MedicalFormPage; From f7d4ad6c4c5d2f93618777313109d56c4b1fcb1e Mon Sep 17 00:00:00 2001 From: Megan Li Date: Wed, 12 Apr 2023 23:41:30 -0400 Subject: [PATCH 5/7] minor fixes --- apps/backend/template.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/backend/template.yaml b/apps/backend/template.yaml index c6dd7f1..addbfe3 100644 --- a/apps/backend/template.yaml +++ b/apps/backend/template.yaml @@ -121,6 +121,7 @@ Resources: Properties: Path: /form/{id} Method: GET + RestApiId: !Ref ApiGateway # This is a Lambda function config associated with the source code: putForm.ts putFormFunction: Type: AWS::Serverless::Function From aa0bced69bc111bce24e672d665730cbd6c2645b Mon Sep 17 00:00:00 2001 From: Megan Li Date: Wed, 12 Apr 2023 23:42:57 -0400 Subject: [PATCH 6/7] frontend fixes --- apps/frontend/src/components/form/GrantForm.tsx | 2 +- apps/frontend/src/components/form/MedicalForm.tsx | 2 +- apps/frontend/src/constants/endpoints.ts | 2 +- apps/frontend/src/pages/FormPage.tsx | 7 +------ apps/frontend/src/types/formSchema.ts | 4 ++-- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/apps/frontend/src/components/form/GrantForm.tsx b/apps/frontend/src/components/form/GrantForm.tsx index e5c1cd1..51726e1 100644 --- a/apps/frontend/src/components/form/GrantForm.tsx +++ b/apps/frontend/src/components/form/GrantForm.tsx @@ -56,7 +56,7 @@ const GrantForm: React.FC = () => { /> { /> {
-
diff --git a/apps/frontend/src/types/formSchema.ts b/apps/frontend/src/types/formSchema.ts index 8bb7fd8..c11cc78 100644 --- a/apps/frontend/src/types/formSchema.ts +++ b/apps/frontend/src/types/formSchema.ts @@ -38,8 +38,8 @@ export const medicalFormSchema = Yup.object().shape({ address: addressSchema, phone: Yup.string().required(), descriptionOfCondition: Yup.string(), - medicalProfessionalName: Yup.string().min(1), - medicalProfessionalTitle: Yup.string().min(1), + medicalProfessionalName: Yup.string(), + medicalProfessionalTitle: Yup.string(), signature: Yup.string().min(1).required(), date: Yup.date() .default(() => new Date()) From 952a7e2a4704dd81ded601ca251ec46a8ee6e9ab Mon Sep 17 00:00:00 2001 From: Megan Li Date: Thu, 13 Apr 2023 14:15:22 -0400 Subject: [PATCH 7/7] add ID using uuid --- apps/backend/package-lock.json | 70 +++++++++++++++++++++--- apps/backend/package.json | 2 + apps/backend/src/db/utils.ts | 6 +- apps/backend/src/handlers/putForm.ts | 3 +- apps/backend/src/schema/schema.ts | 7 +++ apps/frontend/src/constants/endpoints.ts | 2 +- apps/frontend/src/pages/OneFormPage.tsx | 26 +++------ apps/frontend/src/types/formData.ts | 5 -- apps/frontend/src/types/formSchema.ts | 12 ++++ apps/frontend/src/utils/sendRequest.ts | 3 +- 10 files changed, 99 insertions(+), 37 deletions(-) diff --git a/apps/backend/package-lock.json b/apps/backend/package-lock.json index f5ed051..84f2a3f 100644 --- a/apps/backend/package-lock.json +++ b/apps/backend/package-lock.json @@ -16,12 +16,15 @@ "amazon-qldb-driver-nodejs": "^3.0.1", "ion-js": "^4.3.0", "jsbi": "^3.2.5", - "source-map-support": "^0.5.21" + "source-map-support": "^0.5.21", + "uuid": "^9.0.0", + "zod": "^3.20.6" }, "devDependencies": { "@tsconfig/node18": "^1.0.1", "@types/aws-lambda": "^8.10.110", "@types/node": "^18.13.0", + "@types/uuid": "^9.0.1", "aws-sdk-client-mock": "^2.0.0", "jest": "^29.2.1", "quicktype": "^21.0.12", @@ -192,6 +195,14 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-dynamodb/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/client-qldb": { "version": "3.264.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-qldb/-/client-qldb-3.264.0.tgz", @@ -788,6 +799,14 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/middleware-sdk-sts": { "version": "3.257.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.257.0.tgz", @@ -2487,6 +2506,12 @@ "integrity": "sha512-FDJNkyhmKLw7uEvTxx5tSXfPeQpO0iy73Ry+PmYZJvQy0QIWX8a7kJ4kLWRf+EbTPJEPDSgPXHaM7pzr5lmvCg==", "dev": true }, + "node_modules/@types/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "dev": true + }, "node_modules/@types/yargs": { "version": "17.0.22", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", @@ -5701,9 +5726,9 @@ "dev": true }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { "uuid": "dist/bin/uuid" } @@ -5909,6 +5934,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -6073,6 +6106,11 @@ "@aws-sdk/types": "3.257.0", "tslib": "^2.3.1" } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, @@ -6588,6 +6626,13 @@ "@aws-sdk/util-retry": "3.257.0", "tslib": "^2.3.1", "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } } }, "@aws-sdk/middleware-sdk-sts": { @@ -7958,6 +8003,12 @@ "integrity": "sha512-FDJNkyhmKLw7uEvTxx5tSXfPeQpO0iy73Ry+PmYZJvQy0QIWX8a7kJ4kLWRf+EbTPJEPDSgPXHaM7pzr5lmvCg==", "dev": true }, + "@types/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "dev": true + }, "@types/yargs": { "version": "17.0.22", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", @@ -10368,9 +10419,9 @@ "dev": true }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -10532,6 +10583,11 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" } } } diff --git a/apps/backend/package.json b/apps/backend/package.json index b3545af..1ac53d9 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -14,12 +14,14 @@ "ion-js": "^4.3.0", "jsbi": "^3.2.5", "source-map-support": "^0.5.21", + "uuid": "^9.0.0", "zod": "^3.20.6" }, "devDependencies": { "@tsconfig/node18": "^1.0.1", "@types/aws-lambda": "^8.10.110", "@types/node": "^18.13.0", + "@types/uuid": "^9.0.1", "aws-sdk-client-mock": "^2.0.0", "jest": "^29.2.1", "quicktype": "^21.0.12", diff --git a/apps/backend/src/db/utils.ts b/apps/backend/src/db/utils.ts index acac0a6..818a4f0 100644 --- a/apps/backend/src/db/utils.ts +++ b/apps/backend/src/db/utils.ts @@ -10,9 +10,7 @@ export async function insertDocument( export async function fetchDocuments() { return await qldbDriver.executeLambda(async (txn) => { - const result = await txn.execute( - `SELECT metadata.id, data FROM _ql_committed_${tableName}` - ); + const result = await txn.execute(`SELECT * from ${tableName}`); return result.getResultList(); }); } @@ -20,7 +18,7 @@ export async function fetchDocuments() { export async function fetchDocumentById(id: string) { return await qldbDriver.executeLambda(async (txn) => { const result = await txn.execute( - `SELECT metadata.id, data FROM _ql_committed_${tableName} where metadata.id = ?`, + `SELECT * FROM ${tableName} where id = ?`, id ); return result.getResultList(); diff --git a/apps/backend/src/handlers/putForm.ts b/apps/backend/src/handlers/putForm.ts index adb3922..7fe16a9 100644 --- a/apps/backend/src/handlers/putForm.ts +++ b/apps/backend/src/handlers/putForm.ts @@ -2,7 +2,7 @@ import { APIGatewayEvent } from 'aws-lambda'; import { createTableIfNotExists } from '../db/createTable.js'; import { insertDocument } from '../db/utils.js'; import { formSchema } from '../schema/schema.js'; - +import { v4 as uuidv4 } from 'uuid'; /** * An HTTP post method to add one form to the QLDB table. */ @@ -27,6 +27,7 @@ export const putFormHandler = async (event: APIGatewayEvent) => { let form; try { form = formSchema.parse(JSONbody); + form.id = uuidv4(); } catch (error) { return { statusCode: 400, diff --git a/apps/backend/src/schema/schema.ts b/apps/backend/src/schema/schema.ts index 226fe31..b712adc 100644 --- a/apps/backend/src/schema/schema.ts +++ b/apps/backend/src/schema/schema.ts @@ -15,6 +15,11 @@ const phoneNumber = z.string().regex(phoneNumberRegex); // Schema to convert input to javascript date object const dateSchema = z.coerce.date(); +const adminNoteSchema = z.object({ + note: z.string(), + updatedAt: dateSchema, +}); + // Part of form to be filled out by the child's parent/legal guardian const guardianFormSchema = z.object({ childsName: z.string().min(1), @@ -52,6 +57,8 @@ const medicalFormSchema = z.object({ }); export const formSchema = z.object({ + id: z.string(), guardianForm: guardianFormSchema, medicalForm: medicalFormSchema, + adminNotes: adminNoteSchema.array(), }); diff --git a/apps/frontend/src/constants/endpoints.ts b/apps/frontend/src/constants/endpoints.ts index f64a059..f56504d 100644 --- a/apps/frontend/src/constants/endpoints.ts +++ b/apps/frontend/src/constants/endpoints.ts @@ -1,6 +1,6 @@ // TODO: For testing locally, replace with aws api gateway url export const BASE_URL = - 'https://kzb52qra7k.execute-api.us-east-1.amazonaws.com/Prod/'; + 'https://bk3ffpsl08.execute-api.us-east-1.amazonaws.com/Prod/'; export const GET_ALL_FORMS_URL = `${BASE_URL}/forms`; diff --git a/apps/frontend/src/pages/OneFormPage.tsx b/apps/frontend/src/pages/OneFormPage.tsx index ae679db..9e81969 100644 --- a/apps/frontend/src/pages/OneFormPage.tsx +++ b/apps/frontend/src/pages/OneFormPage.tsx @@ -1,22 +1,15 @@ +import { Container, Flex, Heading, Spacer, Spinner } from '@chakra-ui/react'; import { useEffect, useState } from 'react'; -import { getFormById } from '../utils/sendRequest'; import { useParams } from 'react-router-dom'; -import { FormDataWithId } from '../types/formData'; -import { formSchema } from '../types/formSchema'; -import { - Container, - Flex, - Heading, - Text, - Spinner, - Spacer, -} from '@chakra-ui/react'; import { ErrorMessage } from '../components/ErrorMessage'; import { GuardianForm } from '../components/viewForm/GuardianForm'; import { MedicalForm } from '../components/viewForm/MedicalForm'; +import { FormData } from '../types/formData'; +import { formSchema } from '../types/formSchema'; +import { getFormById } from '../utils/sendRequest'; const OneFormPage: React.FC = () => { - const [formData, setFormData] = useState(null); + const [formData, setFormData] = useState(null); const [error, setError] = useState(null); const { id } = useParams(); @@ -24,10 +17,7 @@ const OneFormPage: React.FC = () => { const fetchData = async () => { if (id) { const result = await getFormById(id); - const formData: FormDataWithId = { - id: result.data[0].id, - data: formSchema.validateSync(result.data[0].data), - }; + const formData: FormData = formSchema.validateSync(result.data[0]); setFormData(formData); } else { setError('No form ID.'); @@ -59,8 +49,8 @@ const OneFormPage: React.FC = () => { )} - {formData && } - {formData && } + {formData && } + {formData && } ); } diff --git a/apps/frontend/src/types/formData.ts b/apps/frontend/src/types/formData.ts index 40cfc0c..eed8dec 100644 --- a/apps/frontend/src/types/formData.ts +++ b/apps/frontend/src/types/formData.ts @@ -2,8 +2,3 @@ import type { Asserts } from 'yup'; import { formSchema } from './formSchema'; export type FormData = Asserts; - -export interface FormDataWithId { - id: string; - data: FormData; -} diff --git a/apps/frontend/src/types/formSchema.ts b/apps/frontend/src/types/formSchema.ts index c11cc78..63b1a51 100644 --- a/apps/frontend/src/types/formSchema.ts +++ b/apps/frontend/src/types/formSchema.ts @@ -7,6 +7,13 @@ const addressSchema = Yup.object({ zipcode: Yup.string().length(5).required(), }); +const adminNoteSchema = Yup.object().shape({ + note: Yup.string().required(), + updatedAt: Yup.date() + .default(() => new Date()) + .required(), +}); + export const guardianFormSchema = Yup.object().shape({ childsName: Yup.string().min(1).required(), dob: Yup.date() @@ -49,6 +56,11 @@ export const medicalFormSchema = Yup.object().shape({ }); export const formSchema = Yup.object().shape({ + id: Yup.string().default(''), guardianForm: guardianFormSchema, medicalForm: medicalFormSchema, + adminNotes: Yup.array() + .of(adminNoteSchema) + .required() + .default(() => []), }); diff --git a/apps/frontend/src/utils/sendRequest.ts b/apps/frontend/src/utils/sendRequest.ts index 3b707f8..bf3e734 100644 --- a/apps/frontend/src/utils/sendRequest.ts +++ b/apps/frontend/src/utils/sendRequest.ts @@ -5,10 +5,11 @@ import { GET_FORM_BY_ID_URL, POST_FORM_URL, } from '../constants/endpoints'; +import { formSchema } from '../types/formSchema'; export const submitForm = async (body: FormValues): Promise => { try { - await axios.post(POST_FORM_URL, body); + await axios.post(POST_FORM_URL, formSchema.cast(body)); alert('Form submitted successfully'); } catch (error) { console.log('axios error making post request', error);