From 45e6e04d8085f2552d26717d4a0ee1699afda0ea Mon Sep 17 00:00:00 2001 From: Stephane SEGNING LAMBOU Date: Mon, 9 Sep 2024 21:20:49 +0200 Subject: [PATCH 1/2] feat: camera pick (#61) --- .gitignore | 4 +- docs/pdf_download.md | 10 +- package.json | 11 +- src/components/camera-input.tsx | 71 ++++++++ src/components/take-picture.tsx | 37 ++++ src/main.tsx | 1 + src/screens/scan.screen.tsx | 5 +- src/store/hooks.ts | 38 +++- src/store/selectors.ts | 23 +++ src/store/slices/ai.slice.ts | 71 ++++++++ src/store/slices/index.ts | 1 + src/store/store.ts | 3 +- src/store/thunks/index.ts | 2 + src/store/thunks/ner.ts | 17 ++ src/store/thunks/ocr.ts | 61 +++++++ vite.config.ts | 11 +- yarn.lock | 307 +++++++++++++++++++++++++++++++- 17 files changed, 661 insertions(+), 12 deletions(-) create mode 100644 src/components/camera-input.tsx create mode 100644 src/components/take-picture.tsx create mode 100644 src/store/slices/ai.slice.ts create mode 100644 src/store/thunks/ner.ts create mode 100644 src/store/thunks/ocr.ts diff --git a/.gitignore b/.gitignore index b8457c5..1faeea1 100644 --- a/.gitignore +++ b/.gitignore @@ -130,4 +130,6 @@ docs/gen # API codegen files *.gen.* -gen \ No newline at end of file +gen + +.certs \ No newline at end of file diff --git a/docs/pdf_download.md b/docs/pdf_download.md index 0c61ed4..3594704 100644 --- a/docs/pdf_download.md +++ b/docs/pdf_download.md @@ -1,26 +1,34 @@ # PDF Documentation Generation ## Overview + This workflow generates PDF documentation for the frontend using **typedoc** and the converting tool **md-to-pdf**. ## Workflow Steps + ### Checkout Repository + Clones the repository to the workflow runner. ### Install dependencies + Installs all the needed dependencies using the command `yarn install` ### Generate docs to markdown + Generate docs in markdown format using `yarn run typedoc` ### Convert md to pdf files + Convert md files to pdf using a custom script with `yarn run convert-md-to-pdf` ### Upload PDF Artifact + Uploads the generated PDF files as an artifact using [actions/upload-artifact@v3] ## How to Download the generated PDF file + 1. After the workflow completes, navigate to the "Actions" tab of your repository. 2. Select the latest workflow run for "Generate documentation for the frontend". 3. Click on the "Artifacts" dropdown menu. -4. Choose "documentations" to download the generated PDF documentations. \ No newline at end of file +4. Choose "documentations" to download the generated PDF documentations. diff --git a/package.json b/package.json index 8c06280..446b08e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --host 0.0.0.0", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", @@ -24,6 +24,8 @@ "@yudiel/react-qr-scanner": "^2.0.4", "autoprefixer": "^10.4.19", "axios": "^1.7.2", + "compromise": "^14.14.0", + "formik": "^2.4.6", "i18next": "^23.11.4", "i18next-chained-backend": "^4.6.2", "i18next-http-backend": "^2.5.2", @@ -34,6 +36,7 @@ "react-daisyui": "^5.0.0", "react-dom": "^18.2.0", "react-feather": "^2.0.10", + "react-html5-camera-photo": "^1.5.11", "react-i18next": "^14.1.1", "react-qr-code": "^2.0.15", "react-redux": "^9.1.2", @@ -43,7 +46,9 @@ "redux-persist": "^6.0.0", "redux-toolkit": "^1.1.2", "tailwindcss": "^3.4.3", - "theme-change": "^2.5.0" + "tesseract.js": "^5.1.1", + "theme-change": "^2.5.0", + "yup": "^1.4.0" }, "devDependencies": { "@commitlint/cli": "^19.3.0", @@ -55,6 +60,7 @@ "@types/i18next-browser-languagedetector": "^3.0.0", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", + "@types/react-html5-camera-photo": "^1.5.3", "@types/redux-logger": "^3.0.13", "@typescript-eslint/eslint-plugin": "^7.7.1", "@typescript-eslint/parser": "^7.7.1", @@ -85,6 +91,7 @@ "typescript": "^5.4.5", "vite": "^5.2.0", "vite-plugin-eslint": "^1.8.1", + "vite-plugin-mkcert": "^1.17.5", "vite-tsconfig-paths": "^4.3.2" }, "lint-staged": { diff --git a/src/components/camera-input.tsx b/src/components/camera-input.tsx new file mode 100644 index 0000000..b22e1ff --- /dev/null +++ b/src/components/camera-input.tsx @@ -0,0 +1,71 @@ +import { useCallback, useRef, useState } from 'react'; +import { TakePicture } from '@components/take-picture.tsx'; +import { useAiLoadingState, useExtractDataFromText } from '@store'; +import { Button, Progress } from 'react-daisyui'; +import { Camera, X } from 'react-feather'; + +export interface CameraInputProps { + name: string; + id?: string; +} + +export function CameraInput(props: CameraInputProps) { + const ref = useRef(null); + const openModal = useCallback(() => ref.current?.showModal(), [ref]); + const extractedData = useExtractDataFromText(); + const aiLoading = useAiLoadingState(); + const [shouldTake, setShouldTake] = useState(false); + const [dataUri, setDataUri] = useState(null); + + const onPicture = useCallback((dataUri: string) => { + setDataUri(dataUri); + setShouldTake(false); + }, []); + + return ( + <> + + +
+
+

{props.name}

+ {/* if there is a button in form, it will close the modal */} + +
+ + {shouldTake && } + {dataUri && !shouldTake && ( +
+ image +
+ )} + {!shouldTake && ( + + )} + {extractedData && !shouldTake && ( +
+              {JSON.stringify(extractedData, null, 2)}
+            
+ )} + {dataUri && aiLoading > 0 && aiLoading < 3 && ( + + )} +
+
+ + ); +} diff --git a/src/components/take-picture.tsx b/src/components/take-picture.tsx new file mode 100644 index 0000000..6bbb07e --- /dev/null +++ b/src/components/take-picture.tsx @@ -0,0 +1,37 @@ +import Camera, { CameraProps } from 'react-html5-camera-photo'; +import { useAddErrorNotification, useExtractText } from '@store'; +import 'react-html5-camera-photo/build/css/index.css'; +import { useCallback } from 'react'; + +interface TakePictureProps { + onTakePhoto: Required['onTakePhoto']; +} + +export function TakePicture({ onTakePhoto }: TakePictureProps) { + const extractText = useExtractText(); + const addErrorNotification = useAddErrorNotification(); + const handleTakePhoto: Required['onTakePhoto'] = useCallback( + (dataUri) => { + extractText(dataUri); + onTakePhoto(dataUri); + }, + [extractText, onTakePhoto] + ); + + const onCameraError: Required['onCameraError'] = useCallback( + (error) => { + addErrorNotification(error.message); + }, + [addErrorNotification] + ); + + return ( +
+ +
+ ); +} diff --git a/src/main.tsx b/src/main.tsx index c9254a4..c210e33 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,4 +1,5 @@ import './index.scss'; +import 'barcode-detector/side-effects'; import { isElectron, setupLogging } from '@shared'; import * as Sentry from '@sentry/react'; import { i18nFn } from '@i18n'; diff --git a/src/screens/scan.screen.tsx b/src/screens/scan.screen.tsx index 69c1e57..a285665 100644 --- a/src/screens/scan.screen.tsx +++ b/src/screens/scan.screen.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { Header } from '../components/header.tsx'; +import { CameraInput } from '@components/camera-input.tsx'; /** * Scan screen @@ -9,7 +10,9 @@ export const Component: React.FC = () => { return ( <>
-
TODO: Form & Camera will be here
+
+ +
); }; diff --git a/src/store/hooks.ts b/src/store/hooks.ts index 2ee8aa7..a29e75e 100644 --- a/src/store/hooks.ts +++ b/src/store/hooks.ts @@ -1,7 +1,12 @@ import { useCallback } from 'react'; -import { fetchConfigUrl } from './thunks'; +import { extractBarcode, extractText, fetchConfigUrl } from './thunks'; import { useAppDispatch, useAppSelector } from './types'; -import { selectConfigUrl } from '@store/selectors.ts'; +import { + selectAiData, + selectAiLoadingState, + selectConfigUrl, +} from '@store/selectors.ts'; +import { addNotification } from '@store/slices'; export function useFetchConfigUrl() { const dispatch = useAppDispatch(); @@ -13,3 +18,32 @@ export function useFetchConfigUrl() { export function useConfigData() { return useAppSelector(selectConfigUrl); } + +export function useExtractText() { + const dispatch = useAppDispatch(); + return useCallback( + (imgUri: string) => { + dispatch(extractText({ imgUri })); + dispatch(extractBarcode({ imgUri })); + }, + [dispatch] + ); +} + +export function useExtractDataFromText() { + return useAppSelector(selectAiData); +} + +export function useAiLoadingState() { + return useAppSelector(selectAiLoadingState); +} + +export function useAddErrorNotification() { + const dispatch = useAppDispatch(); + return useCallback( + (msg: string) => { + dispatch(addNotification(msg)); + }, + [dispatch] + ); +} diff --git a/src/store/selectors.ts b/src/store/selectors.ts index 644328f..32f62f4 100644 --- a/src/store/selectors.ts +++ b/src/store/selectors.ts @@ -5,7 +5,30 @@ export const selectNotification = createSelector( (ro: RootState) => ro.notification.messages, (p) => p.filter(({ message }) => message.length > 0) ); + export const selectConfigUrl = createSelector( (ro: RootState) => ro.config, ({ url, loading }) => (loading ? undefined : JSON.stringify({ url })) ); + +export const selectAiData = createSelector( + (ro: RootState) => ro.ai, + ({ loadingData, loadingBarCodes, data, barCodes }) => + loadingData || loadingBarCodes + ? undefined + : { + data, + barCodes, + } +); + +export const selectAiLoadingState = createSelector( + (ro: RootState) => ro.ai, + ({ loadingData, loadingBarCodes, loadingText }) => { + let total = 0; + if (!loadingData) total++; + if (!loadingBarCodes) total++; + if (!loadingText) total++; + return total; + } +); diff --git a/src/store/slices/ai.slice.ts b/src/store/slices/ai.slice.ts new file mode 100644 index 0000000..3493bea --- /dev/null +++ b/src/store/slices/ai.slice.ts @@ -0,0 +1,71 @@ +import { createSlice } from '@reduxjs/toolkit'; +import { PURGE } from 'redux-persist'; +import { + extractBarcode, + extractDataFromText, + extractText, +} from '@store/thunks'; + +export interface AIState { + text?: string; + data?: Record; + barCodes?: string[]; + loadingText: boolean; + loadingData: boolean; + loadingBarCodes: boolean; +} + +const initialState = { + text: undefined, + data: undefined, + barCodes: undefined, + loadingText: true, + loadingData: true, + loadingBarCodes: true, +} satisfies AIState as AIState; + +const aiSlice = createSlice({ + name: 'ai', + initialState, + reducers: {}, + extraReducers: (builder) => { + // Add reducers for additional action types here, and handle loading state as needed + builder + .addCase(extractText.fulfilled, (state, action) => { + // Add user to the state array + state.text = action.payload; + state.loadingText = false; + }) + .addCase(extractText.pending, (state) => { + // Add user to the state array + state.loadingText = true; + }) + .addCase(extractBarcode.fulfilled, (state, action) => { + // Add user to the state array + state.barCodes = action.payload; + state.loadingBarCodes = false; + }) + .addCase(extractBarcode.pending, (state) => { + // Add user to the state array + state.loadingBarCodes = true; + }) + .addCase(extractDataFromText.fulfilled, (state, action) => { + // Add user to the state array + state.data = action.payload; + state.loadingData = false; + }) + .addCase(extractDataFromText.pending, (state) => { + // Add user to the state array + state.loadingData = true; + }) + .addCase(PURGE, (state) => { + state.data = initialState.data; + state.text = initialState.text; + state.loadingData = initialState.loadingData; + state.loadingText = initialState.loadingText; + state.loadingBarCodes = initialState.loadingBarCodes; + }); + }, +}); + +export const reducerAI = aiSlice.reducer; diff --git a/src/store/slices/index.ts b/src/store/slices/index.ts index 40fb1e3..899dfc2 100644 --- a/src/store/slices/index.ts +++ b/src/store/slices/index.ts @@ -1,2 +1,3 @@ +export * from './ai.slice'; export * from './config.slice'; export * from './notification.slice'; diff --git a/src/store/store.ts b/src/store/store.ts index ca5ed8b..7d3d6a8 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -1,7 +1,7 @@ import { combineReducers, configureStore } from '@reduxjs/toolkit'; import logger from 'redux-logger'; import { setupListeners } from '@reduxjs/toolkit/query'; -import { reducerConfig, reducerNotification } from '@store/slices'; +import { reducerAI, reducerConfig, reducerNotification } from '@store/slices'; import { emptySplitApi } from '@store/api/empty.api.ts'; import { rtkQueryErrorLogger } from '@store/middlewares.ts'; import { @@ -20,6 +20,7 @@ import { PersistConfig } from 'redux-persist/es/types'; const rootReducer = combineReducers({ notification: reducerNotification, config: reducerConfig, + ai: reducerAI, // Add the generated reducer as a specific top-level slice [emptySplitApi.reducerPath]: emptySplitApi.reducer, }); diff --git a/src/store/thunks/index.ts b/src/store/thunks/index.ts index 9041023..5194e24 100644 --- a/src/store/thunks/index.ts +++ b/src/store/thunks/index.ts @@ -1 +1,3 @@ export * from './fetch.config-url'; +export * from './ner'; +export * from './ocr'; diff --git a/src/store/thunks/ner.ts b/src/store/thunks/ner.ts new file mode 100644 index 0000000..2fdb0a7 --- /dev/null +++ b/src/store/thunks/ner.ts @@ -0,0 +1,17 @@ +import { createAsyncThunk } from '@reduxjs/toolkit'; +import nlp from 'compromise'; + +export interface ExtractDataFromTextProps { + text: string; +} + +// Extract data from the text +export const extractDataFromText = createAsyncThunk< + Record, + ExtractDataFromTextProps +>('ai/extractDataFromText', async ({ text }) => { + // Extract data from the text + const doc = nlp(text); + // Return the extracted data + return doc.out('json'); +}); diff --git a/src/store/thunks/ocr.ts b/src/store/thunks/ocr.ts new file mode 100644 index 0000000..d9b6a38 --- /dev/null +++ b/src/store/thunks/ocr.ts @@ -0,0 +1,61 @@ +import { createAsyncThunk } from '@reduxjs/toolkit'; +import { createWorker } from 'tesseract.js'; +import { extractDataFromText } from '@store/thunks/ner.ts'; +import { BarcodeDetector } from 'barcode-detector/pure'; + +export interface ExtractTextProps { + imgUri: string; +} + +const b64toBlob = async (imgUri: ExtractTextProps['imgUri']) => { + // Remove the Base64 metadata part + const base64Data = imgUri.replace(/^data:image\/(png|jpeg|jpg);base64,/, ''); + + // Decode Base64 to binary data + const binaryString = atob(base64Data); + const len = binaryString.length; + const bytes = new Uint8Array(len); + + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + + // Create a Blob object with the binary data (and MIME type image/png) + return new Blob([bytes], { type: 'image/png' }); +}; + +// Extract text from an image +export const extractText = createAsyncThunk( + 'ai/extractText', + async ({ imgUri }, { dispatch }) => { + // Create a worker + const worker = await createWorker(['eng', 'fra', 'deu']); + // Load the worker + await worker.load(); + // Recognize the text in the image + const { + data: { text }, + } = await worker.recognize(imgUri); + // Terminate the worker + await worker.terminate(); + + // Dispatch the extracted text + dispatch(extractDataFromText({ text })); + return text; + } +); + +export const extractBarcode = createAsyncThunk( + 'ai/extractBarcode', + async ({ imgUri }) => { + try { + const barcodeDetector = new BarcodeDetector(); + const blob = await b64toBlob(imgUri); + const barcodes = await barcodeDetector.detect(blob); + return barcodes.map((barcode) => barcode.rawValue); + } catch (e) { + console.error(e); + throw e; + } + } +); diff --git a/vite.config.ts b/vite.config.ts index 184a967..2c87375 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,8 +2,17 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import eslint from 'vite-plugin-eslint'; import tsconfigPaths from 'vite-tsconfig-paths'; +import mkcert from 'vite-plugin-mkcert'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [tsconfigPaths(), react(), eslint()], + plugins: [ + tsconfigPaths(), + react(), + eslint(), + mkcert({ + savePath: './.certs', // save the generated certificate into certs directory + force: true, // force generation of certs even without setting https property in the vite config + }), + ], }); diff --git a/yarn.lock b/yarn.lock index d07584d..148fd42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1643,6 +1643,101 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/core@^5.0.2": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" + integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.3.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^9.0.1": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" + integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + dependencies: + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" + integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== + dependencies: + "@octokit/request" "^8.3.0" + "@octokit/types" "^13.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^22.2.0": + version "22.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" + integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== + +"@octokit/plugin-paginate-rest@11.3.1": + version "11.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz#fe92d04b49f134165d6fbb716e765c2f313ad364" + integrity sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g== + dependencies: + "@octokit/types" "^13.5.0" + +"@octokit/plugin-request-log@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" + integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== + +"@octokit/plugin-rest-endpoint-methods@13.2.2": + version "13.2.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz#af8e5dd2cddfea576f92ffaf9cb84659f302a638" + integrity sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA== + dependencies: + "@octokit/types" "^13.5.0" + +"@octokit/request-error@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" + integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== + dependencies: + "@octokit/types" "^13.1.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" + integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== + dependencies: + "@octokit/endpoint" "^9.0.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@^20.0.2": + version "20.1.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.1.tgz#ec775864f53fb42037a954b9a40d4f5275b3dc95" + integrity sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw== + dependencies: + "@octokit/core" "^5.0.2" + "@octokit/plugin-paginate-rest" "11.3.1" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "13.2.2" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.5.0": + version "13.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.5.0.tgz#4796e56b7b267ebc7c921dcec262b3d5bfb18883" + integrity sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ== + dependencies: + "@octokit/openapi-types" "^22.2.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -1963,6 +2058,14 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" + integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/i18next-browser-languagedetector@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/i18next-browser-languagedetector/-/i18next-browser-languagedetector-3.0.0.tgz#5117c813488ec5515f316fd0bbc32e4d03dbaf86" @@ -2004,6 +2107,13 @@ dependencies: "@types/react" "*" +"@types/react-html5-camera-photo@^1.5.3": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/react-html5-camera-photo/-/react-html5-camera-photo-1.5.3.tgz#0b13495af8d4a188adf67f8636b5befa280c7517" + integrity sha512-XDvCjWGCjrUL7yqcXvRTi+Ch9RAOnvGOc5mmji0na9brngMoyxteBPMCrWy2AfHjAFxHiT0a2oaA5sCv6JHFSg== + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^18.2.66": version "18.2.79" resolved "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz" @@ -2553,7 +2663,7 @@ axe-core@=4.7.0: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== -axios@^1.7.2: +axios@^1.6.8, axios@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== @@ -2695,11 +2805,21 @@ basic-ftp@^5.0.2: resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bmp-js@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" + integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2951,6 +3071,15 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compromise@^14.14.0: + version "14.14.0" + resolved "https://registry.yarnpkg.com/compromise/-/compromise-14.14.0.tgz#a63afd6d65edc49f07e9abe75aa97efce923505e" + integrity sha512-0plNVaC0bGWZY3TeijP1xndyaAmjqBY1SSfsc/7ruVLTIfRCSHFLSd/uuK7ZTcaT/4y2u0lVn0et4tmmC98mRg== + dependencies: + efrt "2.7.0" + grad-school "0.0.5" + suffix-thumb "5.0.2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -3170,6 +3299,11 @@ deep-is@^0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" + integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" @@ -3202,6 +3336,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + dequal@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" @@ -3255,6 +3394,11 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +efrt@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/efrt/-/efrt-2.7.0.tgz#8b021e69f75cfeed3f81ee058aa0c78265793324" + integrity sha512-/RInbCy1d4P6Zdfa+TMVsf/ufZVotat5hCw3QXmWtjU+3pFEOvOQ7ibo3aIxyCJw2leIeAMjmPj+1SLJiCpdrQ== + electron-log@^5.1.7: version "5.1.7" resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.1.7.tgz#73c7ddc1602b3a9ee355bc09d1dc490864add0eb" @@ -3996,6 +4140,20 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +formik@^2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/formik/-/formik-2.4.6.tgz#4da75ca80f1a827ab35b08fd98d5a76e928c9686" + integrity sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g== + dependencies: + "@types/hoist-non-react-statics" "^3.3.1" + deepmerge "^2.1.1" + hoist-non-react-statics "^3.3.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + react-fast-compare "^2.0.1" + tiny-warning "^1.0.2" + tslib "^2.0.0" + fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" @@ -4246,6 +4404,11 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +grad-school@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/grad-school/-/grad-school-0.0.5.tgz#9e7b2084f3e137965c19b63ef0dfe49867194f43" + integrity sha512-rXunEHF9M9EkMydTBux7+IryYXEZinRk6g8OBOGDBzo/qWJjhTxy86i5q7lQYpCLHN8Sqv1XX3OIOc7ka2gtvQ== + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" @@ -4331,7 +4494,7 @@ highlight.js@^11.7.0: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.9.0.tgz#04ab9ee43b52a41a047432c8103e2158a1b8b5b0" integrity sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw== -hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -4423,6 +4586,11 @@ iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +idb-keyval@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" + integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -4586,6 +4754,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-electron@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + is-extendable@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -4753,6 +4926,11 @@ is-typed-array@^1.1.13: dependencies: which-typed-array "^1.1.14" +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-weakmap@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" @@ -4852,6 +5030,11 @@ jsesc@~0.5.0: resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jslib-html5-camera-photo@3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/jslib-html5-camera-photo/-/jslib-html5-camera-photo-3.3.4.tgz#ae859b1747f8dd709edeb98ea28a5c0802871157" + integrity sha512-qysjLnP4bud0+g0qs5uA/7i569x+6ID2ufgezf9XQ+BE3EvhYjz177vi9WXLEuq+V6C/WXEv73NUICvHm5VGmQ== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" @@ -5080,6 +5263,11 @@ locate-path@^7.2.0: dependencies: p-locate "^6.0.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash._basefor@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" @@ -5438,7 +5626,7 @@ node-fetch-h2@^2.3.0: dependencies: http2-client "^1.2.5" -node-fetch@^2.6.1, node-fetch@^2.6.12: +node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.9: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -5640,6 +5828,11 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +opencollective-postinstall@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + optionator@^0.9.3: version "0.9.3" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" @@ -5934,6 +6127,11 @@ prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +property-expr@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.6.tgz#f77bc00d5928a6c748414ad12882e83f24aec1e8" + integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== + proxy-agent@6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" @@ -6025,6 +6223,11 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-fast-compare@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + react-feather@^2.0.10: version "2.0.10" resolved "https://registry.yarnpkg.com/react-feather/-/react-feather-2.0.10.tgz#0e9abf05a66754f7b7bb71757ac4da7fb6be3b68" @@ -6032,6 +6235,13 @@ react-feather@^2.0.10: dependencies: prop-types "^15.7.2" +react-html5-camera-photo@^1.5.11: + version "1.5.11" + resolved "https://registry.yarnpkg.com/react-html5-camera-photo/-/react-html5-camera-photo-1.5.11.tgz#0616539f65bea79485aa8a4c0c305f3ed72d5a27" + integrity sha512-5OpdW66UmwKwd0ZHvy/U9tEZj19GrcG6RDRXjs1bFBgJoWzLJoJ7YNd8rmdrizV/6go/z9GrwoWMovqCUyaJgQ== + dependencies: + jslib-html5-camera-photo "3.3.4" + react-i18next@^14.1.1: version "14.1.1" resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.1.tgz#3d942a99866555ae3552c40f9fddfa061e29d7f3" @@ -6164,6 +6374,11 @@ regenerate@^1.4.2: resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== +regenerator-runtime@^0.13.3: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" @@ -6910,6 +7125,11 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" +suffix-thumb@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/suffix-thumb/-/suffix-thumb-5.0.2.tgz#b38940faddb3ae8b5fd281c7ec5830c25a6b2c9c" + integrity sha512-I5PWXAFKx3FYnI9a+dQMWNqTxoRt6vdBdb0O+BJ1sxXCWtSoQCusc13E58f+9p4MYx/qCnEMkD5jac6K2j3dgA== + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -7036,6 +7256,27 @@ tar-stream@^3.1.5: fast-fifo "^1.2.0" streamx "^2.15.0" +tesseract.js-core@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/tesseract.js-core/-/tesseract.js-core-5.1.1.tgz#2b6f3ef28dd109bf4efdbc8fff70bd11adac8b85" + integrity sha512-KX3bYSU5iGcO1XJa+QGPbi+Zjo2qq6eBhNjSGR5E5q0JtzkoipJKOUQD7ph8kFyteCEfEQ0maWLu8MCXtvX5uQ== + +tesseract.js@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/tesseract.js/-/tesseract.js-5.1.1.tgz#7bfaca1c103ba0ce3ddf5e101f0692802a01f880" + integrity sha512-lzVl/Ar3P3zhpUT31NjqeCo1f+D5+YfpZ5J62eo2S14QNVOmHBTtbchHm/YAbOOOzCegFnKf4B3Qih9LuldcYQ== + dependencies: + bmp-js "^0.1.0" + idb-keyval "^6.2.0" + is-electron "^2.2.2" + is-url "^1.2.4" + node-fetch "^2.6.9" + opencollective-postinstall "^2.0.3" + regenerator-runtime "^0.13.3" + tesseract.js-core "^5.1.1" + wasm-feature-detect "^1.2.11" + zlibjs "^0.3.1" + text-extensions@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" @@ -7070,6 +7311,16 @@ thenify-all@^1.0.0: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tiny-case@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03" + integrity sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" @@ -7082,6 +7333,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -7122,6 +7378,11 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + tslib@^2.0.1, tslib@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" @@ -7146,6 +7407,11 @@ type-fest@^0.20.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" @@ -7278,6 +7544,11 @@ unicorn-magic@^0.1.0: resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" @@ -7322,6 +7593,16 @@ vite-plugin-eslint@^1.8.1: "@types/eslint" "^8.4.5" rollup "^2.77.2" +vite-plugin-mkcert@^1.17.5: + version "1.17.5" + resolved "https://registry.yarnpkg.com/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.5.tgz#175f1a2a99c110fa87b2f2e6390b22656674a67b" + integrity sha512-KKGY3iHx/9zb7ow8JJ+nLN2HiNIBuPBwj34fJ+jAJT89/8qfk7msO7G7qipR8VDEm9xMCys0xT11QOJbZcg3/Q== + dependencies: + "@octokit/rest" "^20.0.2" + axios "^1.6.8" + debug "^4.3.4" + picocolors "^1.0.0" + vite-tsconfig-paths@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz#321f02e4b736a90ff62f9086467faf4e2da857a9" @@ -7357,6 +7638,11 @@ vscode-textmate@^8.0.0: resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz" integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== +wasm-feature-detect@^1.2.11: + version "1.6.2" + resolved "https://registry.yarnpkg.com/wasm-feature-detect/-/wasm-feature-detect-1.6.2.tgz#d6229cae95311d82cc6c0c3b6934173c222ccbed" + integrity sha512-4dnaZ+Fq/q+BbMlTIfaNS851i+0zmHzui++NUZdskESRu3xwB6g6x2FnGvBdWtpijqO5yuj1l+EUTJGc4S4DKg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -7574,6 +7860,21 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +yup@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/yup/-/yup-1.4.0.tgz#898dcd660f9fb97c41f181839d3d65c3ee15a43e" + integrity sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg== + dependencies: + property-expr "^2.0.5" + tiny-case "^1.0.3" + toposort "^2.0.2" + type-fest "^2.19.0" + +zlibjs@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/zlibjs/-/zlibjs-0.3.1.tgz#50197edb28a1c42ca659cc8b4e6a9ddd6d444554" + integrity sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w== + zod@3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" From 13e12ef74380d8a316600dc96d9fc0a07cd14a86 Mon Sep 17 00:00:00 2001 From: King-Koufan <148069250+Koufan-De-King@users.noreply.github.com> Date: Sat, 22 Feb 2025 20:19:40 +0100 Subject: [PATCH 2/2] fix: reconciled dependencies (#62) --- .eslintrc.cjs | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 59bfc26..25fb3c5 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -11,6 +11,7 @@ module.exports = { browser: true, es2021: true, }, + root: true, extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended',