move away from ehemer to resolve recursive loop.

This commit is contained in:
Jordan Hewitt 2024-06-28 14:53:48 -07:00
parent 3d03f1d9e8
commit 93c0c25eb5
12 changed files with 309 additions and 160 deletions

View File

@ -1,11 +1,12 @@
import { Product } from "@/lib/product";
import { area, length } from "enheter";
export const products = [
// Sheet goods
new Product(35, area("squareFoot", 4 * 8), { name: "Plywood" }),
new Product(45, area("squareFoot", 4 * 8), { name: "OSB" }),
new Product(45, area("squareFoot", 4 * 8), { name: "MDF" }),
new Product(25, {l: 4, w : 8, u: "feet"}, { name: "Plywood" }),
new Product(35, {l: 4, w : 8, u: "feet"}, { name: "MDF" }),
new Product(40, {l: 4, w : 8, u: "feet"}, { name: "OSB" }),
new Product(45, {l: 4, w : 8, u: "feet"}, { name: "Sheetrock" }),
// Beams and trim
new Product(45, length("foot", 1), { name: "trim" }),
new Product(1, {l: 0.50, u : "feet"}, { name: "trim 3 inches" }),
new Product(1, {l: 0.75, u : "feet"}, { name: "trim 3 inches" }),
];

View File

@ -1,20 +1,19 @@
import { useDispatch, useSelector } from 'react-redux';
import { combineReducers, configureStore } from '@reduxjs/toolkit';
import { configureStore } from '@reduxjs/toolkit';
import { rememberReducer, rememberEnhancer } from 'redux-remember';
import reducers from "@/features/product/productSlice"
import AsyncStorage from '@react-native-async-storage/async-storage';
import { Product } from "@/lib/product";
import { Product, } from "@/lib/product";
const rememberedKeys = ['products'];
const rootReducer = reducers;
export function setupStore(preloadedState: Partial<RootState> = {
export function setupStore(preloadedState = {
products: [] as Product[],
}) {
return configureStore({
reducer: rememberReducer(reducers),
// @ts-ignore
preloadedState,
enhancers: (getDefaultEnhancers) => getDefaultEnhancers().concat(
rememberEnhancer(

View File

@ -3,7 +3,6 @@ import { deleteProduct, selectProducts, updateProduct } from "@/features/product
import { Product } from "@/lib/product";
import { FlatList, SafeAreaView, StyleSheet, Text } from "react-native";
import { ProductEditorItem } from "./ProductEditorItem";
import React from "react";
export const ProductEditor = ({}) => {
const products = useAppSelector(selectProducts) as Product [];

View File

@ -28,7 +28,7 @@ export function ProductTile ({product, onProductSelected, style} : ProductTilePr
style={styles.image}
>
<Text style={styles.text}>{product.attributes.name || `Product ${product.id}`}</Text>
<Text style={styles.text}>{ product.pricePerUnit.toString() } / {product.measurement.value} {product.measurement.unit.symbol} </Text>
<Text style={styles.text}>{ product.pricePerUnit.toString() } / {product.measure.value} {product.measure.unit.symbol} </Text>
</ImageBackground>
</View>
);

View File

@ -1,10 +1,8 @@
import { renderWithProviders } from "@/lib/rendering";
import { ProductEditor } from "@/components/ProductEditor";
import {products as fixtures} from "../../__fixtures__/initialProducts";
import React from "react";
import { useAppSelector } from "@/app/store";
import { selectProducts } from "@/features/product/productSlice";
import {products as fixtures} from "@/__fixtures__/initialProducts";
import { screen } from "@testing-library/react-native";
import { selectProducts } from "@/features/product/productSlice";
describe("ProductEditor", () => {
it("renders correctly", async () => {
@ -12,7 +10,11 @@ describe("ProductEditor", () => {
products: fixtures,
});
const products = store.getState();
const state1 = store.getState();
const products = selectProducts(state1);
expect(products).toHaveLength(6);
// Check if the product names are rendered
expect(screen.getByText(products[0].attributes.name as string)).toBeTruthy();

View File

@ -42,7 +42,7 @@ const productsState = createSlice({
});
export const selectProducts = (state : RootState) => {
return state.products
return state.products;
}

View File

@ -4,21 +4,20 @@ import { Product } from "../product";
describe("Product tests", () => {
it(`Length product gives correct price for a shorter length`, () => {
const standard = new Product(20, length("foot", 4));
const comparison = standard.priceFor(length("foot", 2));
const standard = new Product(20, { l: 4, u: "feet" });
const comparison = standard.priceFor({ l: 2, u: "feet" });
expect(comparison).toEqual(10);
});
it(`Length product gives correct price for a longer length`, () => {
const standard = new Product(20, length("foot", 4));
const comparison = standard.priceFor(length("foot", 8));
const standard = new Product(20, {l: 4, u : "feet"});
const comparison = standard.priceFor({l : 8, u : "feet"});
expect(comparison).toEqual(40);
});
it(`Length product gives correct price if different units`, () => {
const standard = new Product(10, length("foot", 1));
const comparison = standard.priceFor(length("inch", 24));
expect(comparison).toEqual(20);
const standard = new Product(10, {l: 1, u : "feet"});
const comparison = standard.priceFor({l : 24, u: "inch"});
expect(comparison).toBeCloseTo(20, 4);
});
});

View File

@ -1,22 +1,10 @@
import {length as en_length, area as en_area} from "enheter"
import {Measure, LengthUnit, AreaUnit, } from "enheter"
import uuid from "react-native-uuid";
import convert, { Area, Length } from "convert";
export type Id = string;
export type Currency = "USD";
export const CURRENCY_SYMBOLS : Map<"USD", string> = {
"USD": "$",
};
export class Price {
constructor(public currency : Currency, public value : number) {}
public toString() {
const sym = CURRENCY_SYMBOLS.get(this.currency);
return `${sym} ${Math.round(this.value)}`;
}
}
export type ProductAttributes = {
id?: string,
name?: string,
@ -24,35 +12,88 @@ export type ProductAttributes = {
description?: string,
depth?: string,
currency?: Currency,
[key:string]: any,
// [index:string]: any,
}
export type ProductData = {
id?: Id,
pricePerUnit: number,
measurement: {
unit: string,
value: number,
dimension: number,
},
attributes?: ProductAttributes,
};
export type length_t = {
l: number, u: Length
}
export type area_t = length_t & {
w: number,
}
export type dimensions_t = area_t | length_t;
export type product_type_t = "area" | "length";
export const isArea = (d: dimensions_t) => ("width" in d);
export const isLength = (d: dimensions_t) => (!("width" in d));
export const dimensionType = (d: dimensions_t) => isArea(d) ? "area" : "length"
export class Product {
public id : string;
constructor(public pricePerUnit : number, public measurement : Measure<"length" | "area">, public attributes : ProductAttributes = {}) {
public id: string;
public area?: area_t;
public length?: length_t;
public presentUnits: Length;
constructor(public pricePerUnit: number, dimensions: dimensions_t, public attributes: ProductAttributes = {},) {
this.id = attributes.id || uuid.v4().toString();
this.presentUnits = dimensions.u;
if ("w" in dimensions) {
this.area = {
l: convert(dimensions.l, dimensions.u).to("meter"),
w: convert(dimensions.w, dimensions.u).to("meter"),
u: "meter"
}
} else {
this.length = {
l: convert(dimensions.l, dimensions.u).to("meter"),
u: "meter"
};
}
}
public priceFor(measurement : Measure<"length" | "area">): number {
const ratio = measurement.convertTo(this.measurement.unit).divideBy(this.measurement).value;
return this.pricePerUnit * ratio
}
get isArea() {
return this.measurement.unit.dimension.length === 2;
}
get isLength() {
return this.measurement.unit.dimension.length === 1;
public priceFor(dimensions: dimensions_t): number {
if (this.area && "w" in dimensions) {
const thisA = this.area.l * this.area.w;
const otherA = convert(
dimensions.w,
dimensions.u
).to("meter") * convert(
dimensions.l,
dimensions.u
).to("meter");
return (otherA / thisA) * this.pricePerUnit;
} if (this.length) {
const thisL = this.length.l;
const otherL = convert(
dimensions.l,
dimensions.u
).to("meter");
return (otherL / thisL) * this.pricePerUnit;
}
throw new Error(`Invalid dimensions: ${dimensions}`);
}
get attributesAsList() {
return Object.entries(this.attributes).map(([key, value]) => {
return {key, value}
return { key, value }
})
}
public removeAttribute(key : string) {
delete this.attributes[key]
public removeAttribute(key: string) {
delete this.attributes[key];
}
}

View File

@ -3,7 +3,6 @@ import { PropsWithChildren, ReactElement } from "react";
import { Provider } from "react-redux";
import { setupStore, RootState } from "@/app/store";
import { Product } from "@/lib/product";
import React from "react";
export interface ExtendedRenderOptions extends Omit<RenderOptions, 'queries'> {
preloadedState?: Partial<RootState>;
@ -19,7 +18,7 @@ export function renderWithProviders(
) {
const {
// Automatically create a store instance if no store was passed in
store = setupStore(preloadedState as Partial<RootState>),
store = setupStore(preloadedState),
...renderOptions
} = extendedRenderOptions;

View File

@ -13,49 +13,54 @@
},
"dependencies": {
"@babel/runtime": "^7.24.7",
"@expo/vector-icons": "^14.0.0",
"@expo/vector-icons": "^14.0.2",
"@react-native-async-storage/async-storage": "^1.23.1",
"@react-native/assets-registry": "^0.74.84",
"@react-navigation/native": "^6.0.2",
"@react-navigation/native": "^6.1.17",
"@reduxjs/toolkit": "^2.2.5",
"@testing-library/react-native": "^12.5.1",
"@types/js-quantities": "^1.6.6",
"convert": "^5.3.0",
"enheter": "^1.0.27",
"expo": "~51.0.14",
"esm": "link:@types/js-quantities/esm",
"expo": "~51.0.16",
"expo-constants": "~16.0.2",
"expo-font": "~12.0.7",
"expo-linking": "~6.3.1",
"expo-router": "~3.5.16",
"expo-router": "~3.5.17",
"expo-splash-screen": "~0.27.5",
"expo-status-bar": "~1.12.1",
"expo-system-ui": "~3.0.6",
"expo-web-browser": "~13.0.3",
"interopRequireDefault": "link:@babel/runtime/helpers/interopRequireDefault",
"js-quantities": "^1.8.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-native": "0.74.2",
"react-native-gesture-handler": "~2.16.1",
"react-native-gesture-handler": "~2.16.2",
"react-native-reanimated": "~3.10.1",
"react-native-safe-area-context": "4.10.1",
"react-native-screens": "3.31.1",
"react-native-uuid": "^2.0.2",
"react-native-web": "~0.19.10",
"react-native-web": "~0.19.12",
"react-redux": "^9.1.2",
"redux-remember": "^5.1.0",
"safe-units": "^2.0.1",
"uuid": "^10.0.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/core": "^7.24.7",
"@babel/preset-typescript": "^7.24.7",
"@jest/globals": "^29.7.0",
"@types/jest": "^29.5.12",
"@types/react": "~18.2.45",
"@types/react-test-renderer": "^18.0.7",
"@types/react": "~18.2.79",
"@types/react-test-renderer": "^18.3.0",
"babel-plugin-transform-es2015-destructuring": "^6.23.0",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"enzyme-adapter-react-15": "^1.4.4",
"eslint-config-airbnb": "^19.0.4",
"jest": "^29.2.1",
"jest-expo": "~51.0.1",
"jest": "^29.7.0",
"jest-expo": "~51.0.3",
"react-test-renderer": "18.2.0",
"ts-jest": "^29.1.5",
"typescript": "~5.3.3"

View File

@ -9,7 +9,7 @@ dependencies:
specifier: ^7.24.7
version: 7.24.7
'@expo/vector-icons':
specifier: ^14.0.0
specifier: ^14.0.2
version: 14.0.2
'@react-native-async-storage/async-storage':
specifier: ^1.23.1
@ -18,7 +18,7 @@ dependencies:
specifier: ^0.74.84
version: 0.74.84
'@react-navigation/native':
specifier: ^6.0.2
specifier: ^6.1.17
version: 6.1.17(react-native@0.74.2)(react@18.2.0)
'@reduxjs/toolkit':
specifier: ^2.2.5
@ -26,39 +26,51 @@ dependencies:
'@testing-library/react-native':
specifier: ^12.5.1
version: 12.5.1(jest@29.7.0)(react-native@0.74.2)(react-test-renderer@18.2.0)(react@18.2.0)
'@types/js-quantities':
specifier: ^1.6.6
version: 1.6.6
convert:
specifier: ^5.3.0
version: 5.3.0
enheter:
specifier: ^1.0.27
version: 1.0.27
esm:
specifier: link:@types/js-quantities/esm
version: link:@types/js-quantities/esm
expo:
specifier: ~51.0.14
version: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
specifier: ~51.0.16
version: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo-constants:
specifier: ~16.0.2
version: 16.0.2(expo@51.0.14)
version: 16.0.2(expo@51.0.16)
expo-font:
specifier: ~12.0.7
version: 12.0.7(expo@51.0.14)
version: 12.0.7(expo@51.0.16)
expo-linking:
specifier: ~6.3.1
version: 6.3.1(expo@51.0.14)
version: 6.3.1(expo@51.0.16)
expo-router:
specifier: ~3.5.16
version: 3.5.16(expo-constants@16.0.2)(expo-linking@6.3.1)(expo-modules-autolinking@1.11.1)(expo-status-bar@1.12.1)(expo@51.0.14)(react-native-reanimated@3.10.1)(react-native-safe-area-context@4.10.1)(react-native-screens@3.31.1)(react-native@0.74.2)(react@18.2.0)(typescript@5.3.3)
specifier: ~3.5.17
version: 3.5.17(expo-constants@16.0.2)(expo-linking@6.3.1)(expo-modules-autolinking@1.11.1)(expo-status-bar@1.12.1)(expo@51.0.16)(react-native-reanimated@3.10.1)(react-native-safe-area-context@4.10.1)(react-native-screens@3.31.1)(react-native@0.74.2)(react@18.2.0)(typescript@5.3.3)
expo-splash-screen:
specifier: ~0.27.5
version: 0.27.5(expo-modules-autolinking@1.11.1)(expo@51.0.14)
version: 0.27.5(expo-modules-autolinking@1.11.1)(expo@51.0.16)
expo-status-bar:
specifier: ~1.12.1
version: 1.12.1
expo-system-ui:
specifier: ~3.0.6
version: 3.0.6(expo@51.0.14)
version: 3.0.6(expo@51.0.16)
expo-web-browser:
specifier: ~13.0.3
version: 13.0.3(expo@51.0.14)
version: 13.0.3(expo@51.0.16)
interopRequireDefault:
specifier: link:@babel/runtime/helpers/interopRequireDefault
version: link:@babel/runtime/helpers/interopRequireDefault
js-quantities:
specifier: ^1.8.0
version: 1.8.0
react:
specifier: 18.2.0
version: 18.2.0
@ -69,7 +81,7 @@ dependencies:
specifier: 0.74.2
version: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7)(@types/react@18.2.79)(react@18.2.0)
react-native-gesture-handler:
specifier: ~2.16.1
specifier: ~2.16.2
version: 2.16.2(react-native@0.74.2)(react@18.2.0)
react-native-reanimated:
specifier: ~3.10.1
@ -84,7 +96,7 @@ dependencies:
specifier: ^2.0.2
version: 2.0.2
react-native-web:
specifier: ~0.19.10
specifier: ~0.19.12
version: 0.19.12(react-dom@18.2.0)(react@18.2.0)
react-redux:
specifier: ^9.1.2
@ -92,13 +104,16 @@ dependencies:
redux-remember:
specifier: ^5.1.0
version: 5.1.0(redux@5.0.1)
safe-units:
specifier: ^2.0.1
version: 2.0.1
uuid:
specifier: ^10.0.0
version: 10.0.0
devDependencies:
'@babel/core':
specifier: ^7.20.0
specifier: ^7.24.7
version: 7.24.7
'@babel/preset-typescript':
specifier: ^7.24.7
@ -110,10 +125,10 @@ devDependencies:
specifier: ^29.5.12
version: 29.5.12
'@types/react':
specifier: ~18.2.45
specifier: ~18.2.79
version: 18.2.79
'@types/react-test-renderer':
specifier: ^18.0.7
specifier: ^18.3.0
version: 18.3.0
babel-plugin-transform-es2015-destructuring:
specifier: ^6.23.0
@ -128,11 +143,11 @@ devDependencies:
specifier: ^19.0.4
version: 19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.9.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.3)(eslint@8.57.0)
jest:
specifier: ^29.2.1
specifier: ^29.7.0
version: 29.7.0
jest-expo:
specifier: ~51.0.1
version: 51.0.2(@babel/core@7.24.7)(jest@29.7.0)(react@18.2.0)
specifier: ~51.0.3
version: 51.0.3(@babel/core@7.24.7)(jest@29.7.0)(react@18.2.0)
react-test-renderer:
specifier: 18.2.0
version: 18.2.0(react@18.2.0)
@ -190,6 +205,16 @@ packages:
transitivePeerDependencies:
- supports-color
/@babel/generator@7.2.0:
resolution: {integrity: sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==}
dependencies:
'@babel/types': 7.24.7
jsesc: 2.5.2
lodash: 4.17.21
source-map: 0.5.7
trim-right: 1.0.1
dev: false
/@babel/generator@7.24.7:
resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==}
engines: {node: '>=6.9.0'}
@ -1731,8 +1756,8 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
/@eslint-community/regexpp@4.10.1:
resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==}
/@eslint-community/regexpp@4.11.0:
resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
dev: true
@ -1768,19 +1793,19 @@ packages:
safe-json-stringify: 1.2.0
dev: false
/@expo/cli@0.18.19(expo-modules-autolinking@1.11.1):
resolution: {integrity: sha512-8Rj18cTofpLl+7D++auMVS71KungldHbrArR44fpE8loMVAvYZA+U932lmd0K2lOYBASPhm7SVP9wzls//ESFQ==}
/@expo/cli@0.18.20(expo-modules-autolinking@1.11.1):
resolution: {integrity: sha512-UkEiS8l8UV34WywmjLgxMKoGBsdKXNJwVF8BJaNsXc0XcmAvvawkXiUvToO3MvJpf0www2tEjqlia8EJaTL38w==}
hasBin: true
dependencies:
'@babel/runtime': 7.24.7
'@expo/code-signing-certificates': 0.0.5
'@expo/config': 9.0.1
'@expo/config-plugins': 8.0.5
'@expo/config-plugins': 8.0.6
'@expo/devcert': 1.1.2
'@expo/env': 0.3.0
'@expo/image-utils': 0.5.1
'@expo/json-file': 8.3.3
'@expo/metro-config': 0.18.7
'@expo/metro-config': 0.18.8
'@expo/osascript': 2.1.3
'@expo/package-manager': 1.5.2
'@expo/plist': 0.1.3
@ -1864,8 +1889,8 @@ packages:
nullthrows: 1.1.1
dev: false
/@expo/config-plugins@8.0.5:
resolution: {integrity: sha512-VGseKX1dYvaf2qHUDGzIQwSOJrO5fomH0gE5cKSQyi6wn+Q6rcV2Dj2E5aga+9aKNPL6FxZ0dqRFC3t2sbhaSA==}
/@expo/config-plugins@8.0.6:
resolution: {integrity: sha512-Vmn/BSg/hBmliU/Bl+G4sExDoWd4iHXQG7ITUNR5Uar7uLko1A5vdVV+EOEUFA0f8jEZMHG3uZJUoXmr4LPaxA==}
dependencies:
'@expo/config-types': 51.0.1
'@expo/json-file': 8.3.3
@ -1892,7 +1917,7 @@ packages:
resolution: {integrity: sha512-0tjaXBstTbXmD4z+UMFBkh2SZFwilizSQhW6DlaTMnPG5ezuw93zSFEWAuEC3YzkpVtNQTmYzxAYjxwh6seOGg==}
dependencies:
'@babel/code-frame': 7.10.4
'@expo/config-plugins': 8.0.5
'@expo/config-plugins': 8.0.6
'@expo/config-types': 51.0.1
'@expo/json-file': 8.3.3
getenv: 1.0.0
@ -1910,7 +1935,7 @@ packages:
resolution: {integrity: sha512-BKQ4/qBf3OLT8hHp5kjObk2vxwoRQ1yYQBbG/OM9Jdz32yYtrU8opTbKRAxfZEWH5i3ZHdLrPdC1rO0I6WxtTw==}
dependencies:
'@babel/code-frame': 7.10.4
'@expo/config-plugins': 8.0.5
'@expo/config-plugins': 8.0.6
'@expo/config-types': 51.0.1
'@expo/json-file': 8.3.3
getenv: 1.0.0
@ -1979,8 +2004,8 @@ packages:
json5: 2.2.3
write-file-atomic: 2.4.3
/@expo/metro-config@0.18.7:
resolution: {integrity: sha512-MzAyFP0fvoyj9IUc6SPnpy6/HLT23j/p5J+yWjGug2ddOpSuKNDHOOqlwWZbJp5KfZCEIVWNHeUoE+TaC/yhaQ==}
/@expo/metro-config@0.18.8:
resolution: {integrity: sha512-YGpTlVc1/6EPzPbt0LZt92Bwrpjngulup6uHSTRbwn/heMPfFaVv1Y4VE3GAUkx7/Qwu+dTVIV0Kys4pLOAIiw==}
dependencies:
'@babel/core': 7.24.7
'@babel/generator': 7.24.7
@ -2050,7 +2075,7 @@ packages:
expo-modules-autolinking: '>=0.8.1'
dependencies:
'@expo/config': 9.0.2
'@expo/config-plugins': 8.0.5
'@expo/config-plugins': 8.0.6
'@expo/config-types': 51.0.1
'@expo/image-utils': 0.5.1
'@expo/json-file': 8.3.3
@ -2385,6 +2410,15 @@ packages:
transitivePeerDependencies:
- supports-color
/@jest/types@24.9.0:
resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==}
engines: {node: '>= 6'}
dependencies:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-reports': 1.1.2
'@types/yargs': 13.0.12
dev: false
/@jest/types@26.6.2:
resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==}
engines: {node: '>= 10.14.2'}
@ -3165,6 +3199,13 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.6
/@types/istanbul-reports@1.1.2:
resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==}
dependencies:
'@types/istanbul-lib-coverage': 2.0.6
'@types/istanbul-lib-report': 3.0.3
dev: false
/@types/istanbul-reports@3.0.4:
resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
dependencies:
@ -3177,6 +3218,10 @@ packages:
pretty-format: 29.7.0
dev: true
/@types/js-quantities@1.6.6:
resolution: {integrity: sha512-k2Q8/Avj4Oz50flfTnfVGnUCkt7OYQ3U+lfQVELE/x5mdbwChZ7fM0wpUpVWzbuSL8kIYt9ZsFQ0RFNBv8T3Qw==}
dev: false
/@types/jsdom@20.0.1:
resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==}
dependencies:
@ -3239,6 +3284,12 @@ packages:
/@types/yargs-parser@21.0.3:
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
/@types/yargs@13.0.12:
resolution: {integrity: sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==}
dependencies:
'@types/yargs-parser': 21.0.3
dev: false
/@types/yargs@15.0.19:
resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==}
dependencies:
@ -3759,6 +3810,18 @@ packages:
- supports-color
dev: false
/babel-plugin-react-compiler@0.0.0-experimental-696af53-20240625:
resolution: {integrity: sha512-OUDKms8qmcm5bX0D+sJWC1YcKcd7AZ2aJ7eY6gkR+Xr7PDfkXLbqAld4Qs9B0ntjVbUMEtW/PjlQrxDtY4raHg==}
dependencies:
'@babel/generator': 7.2.0
'@babel/types': 7.24.7
chalk: 4.1.2
invariant: 2.2.4
pretty-format: 24.9.0
zod: 3.23.8
zod-validation-error: 2.1.0(zod@3.23.8)
dev: false
/babel-plugin-react-native-web@0.19.12:
resolution: {integrity: sha512-eYZ4+P6jNcB37lObWIg0pUbi7+3PKoU1Oie2j0C8UF3cXyXoR74tO2NBjI/FORb2LJyItJZEAmjU5pSaJYEL1w==}
dev: false
@ -3807,8 +3870,8 @@ packages:
'@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7)
'@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7)
/babel-preset-expo@11.0.10(@babel/core@7.24.7)(@babel/preset-env@7.24.7):
resolution: {integrity: sha512-YBg40Om31gw9IPlRw5v8elzgtPUtNEh4GSibBi5MsmmYddGg4VPjWtCZIFJChN543qRmbGb/fa/kejvLX567hQ==}
/babel-preset-expo@11.0.11(@babel/core@7.24.7)(@babel/preset-env@7.24.7):
resolution: {integrity: sha512-5AM8FE6mH4IKda08brCzZs9uJU+1K2L/F+7dxWZCprxIlpvNOexqb9TeO/l8m8z1511jmuiAfML6at+46ls+tg==}
dependencies:
'@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.24.7)
'@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.7)
@ -3817,6 +3880,7 @@ packages:
'@babel/preset-react': 7.24.7(@babel/core@7.24.7)
'@babel/preset-typescript': 7.24.7(@babel/core@7.24.7)
'@react-native/babel-preset': 0.74.84(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
babel-plugin-react-compiler: 0.0.0-experimental-696af53-20240625
babel-plugin-react-native-web: 0.19.12
react-refresh: 0.14.2
transitivePeerDependencies:
@ -3918,8 +3982,8 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
caniuse-lite: 1.0.30001636
electron-to-chromium: 1.4.812
caniuse-lite: 1.0.30001638
electron-to-chromium: 1.4.814
node-releases: 2.0.14
update-browserslist-db: 1.0.16(browserslist@4.23.1)
@ -3976,7 +4040,7 @@ packages:
'@npmcli/fs': 3.1.1
fs-minipass: 3.0.3
glob: 10.4.2
lru-cache: 10.2.2
lru-cache: 10.3.0
minipass: 7.1.2
minipass-collect: 2.0.1
minipass-flush: 1.0.5
@ -4028,8 +4092,8 @@ packages:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
/caniuse-lite@1.0.30001636:
resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==}
/caniuse-lite@1.0.30001638:
resolution: {integrity: sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==}
/chalk@2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
@ -4301,6 +4365,10 @@ packages:
/convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
/convert@5.3.0:
resolution: {integrity: sha512-8bZ9aL/9ywyBpaPujOoKi+1q68RKEOt0djguntjkc2gBn/mNBudcVjRO2/2F7/1vuh2LQo5BTADDEesd2oh1jw==}
dev: false
/cookie-signature@1.2.1:
resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==}
engines: {node: '>=6.6.0'}
@ -4737,8 +4805,8 @@ packages:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
dev: false
/electron-to-chromium@1.4.812:
resolution: {integrity: sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==}
/electron-to-chromium@1.4.814:
resolution: {integrity: sha512-GVulpHjFu1Y9ZvikvbArHmAhZXtm3wHlpjTMcXNGKl4IQ4jMQjlnz8yMQYYqdLHKi/jEL2+CBC2akWVCoIGUdw==}
/emittery@0.13.1:
resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
@ -5217,7 +5285,7 @@ packages:
hasBin: true
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@eslint-community/regexpp': 4.10.1
'@eslint-community/regexpp': 4.11.0
'@eslint/eslintrc': 2.1.4
'@eslint/js': 8.57.0
'@humanwhocodes/config-array': 0.11.14
@ -5350,60 +5418,60 @@ packages:
jest-message-util: 29.7.0
jest-util: 29.7.0
/expo-asset@10.0.9(expo@51.0.14):
resolution: {integrity: sha512-KX7LPtVf9eeMidUvYZafXZldrVdzfjZNKKFAjFvDy2twg7sTa2R0L4VdCXp32eGLWZyk+i/rpOUSbyD1YFyJnA==}
/expo-asset@10.0.10(expo@51.0.16):
resolution: {integrity: sha512-0qoTIihB79k+wGus9wy0JMKq7DdenziVx3iUkGvMAy2azscSgWH6bd2gJ9CGnhC6JRd3qTMFBL0ou/fx7WZl7A==}
peerDependencies:
expo: '*'
dependencies:
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo-constants: 16.0.2(expo@51.0.14)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo-constants: 16.0.2(expo@51.0.16)
invariant: 2.2.4
md5-file: 3.2.3
transitivePeerDependencies:
- supports-color
dev: false
/expo-constants@16.0.2(expo@51.0.14):
/expo-constants@16.0.2(expo@51.0.16):
resolution: {integrity: sha512-9tNY3OVO0jfiMzl7ngb6IOyR5VFzNoN5OOazUWoeGfmMqVB5kltTemRvKraK9JRbBKIw+SOYLEmF0sEqgFZ6OQ==}
peerDependencies:
expo: '*'
dependencies:
'@expo/config': 9.0.2
'@expo/env': 0.3.0
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
transitivePeerDependencies:
- supports-color
dev: false
/expo-file-system@17.0.1(expo@51.0.14):
/expo-file-system@17.0.1(expo@51.0.16):
resolution: {integrity: sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==}
peerDependencies:
expo: '*'
dependencies:
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
dev: false
/expo-font@12.0.7(expo@51.0.14):
/expo-font@12.0.7(expo@51.0.16):
resolution: {integrity: sha512-rbSdpjtT/A3M+u9xchR9tdD+5VGSxptUis7ngX5zfAVp3O5atOcPNSA82Jeo15HkrQE+w/upfFBOvi56lsGdsQ==}
peerDependencies:
expo: '*'
dependencies:
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
fontfaceobserver: 2.3.0
dev: false
/expo-keep-awake@13.0.2(expo@51.0.14):
/expo-keep-awake@13.0.2(expo@51.0.16):
resolution: {integrity: sha512-kKiwkVg/bY0AJ5q1Pxnm/GvpeB6hbNJhcFsoOWDh2NlpibhCLaHL826KHUM+WsnJRbVRxJ+K9vbPRHEMvFpVyw==}
peerDependencies:
expo: '*'
dependencies:
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
dev: false
/expo-linking@6.3.1(expo@51.0.14):
/expo-linking@6.3.1(expo@51.0.16):
resolution: {integrity: sha512-xuZCntSBGWCD/95iZ+mTUGTwHdy8Sx+immCqbUBxdvZ2TN61P02kKg7SaLS8A4a/hLrSCwrg5tMMwu5wfKr35g==}
dependencies:
expo-constants: 16.0.2(expo@51.0.14)
expo-constants: 16.0.2(expo@51.0.16)
invariant: 2.2.4
transitivePeerDependencies:
- expo
@ -5421,14 +5489,14 @@ packages:
fs-extra: 9.1.0
dev: false
/expo-modules-core@1.12.15:
resolution: {integrity: sha512-VjDPIgUyhCZzf692NF4p2iFTsKAQMcU3jc0pg33eNvN/kdrJqkeucqCDuuwoNxg0vIBKtoqAJDuPnWiemldsTg==}
/expo-modules-core@1.12.17:
resolution: {integrity: sha512-f4wD3GwWD1QnxsVjvqPys6migmGtEaofAQCG3zdMz2ovuXf99mwLEY9+mhtnlwwxcJ1bqjOLpjB6/3wMwJaxqw==}
dependencies:
invariant: 2.2.4
dev: false
/expo-router@3.5.16(expo-constants@16.0.2)(expo-linking@6.3.1)(expo-modules-autolinking@1.11.1)(expo-status-bar@1.12.1)(expo@51.0.14)(react-native-reanimated@3.10.1)(react-native-safe-area-context@4.10.1)(react-native-screens@3.31.1)(react-native@0.74.2)(react@18.2.0)(typescript@5.3.3):
resolution: {integrity: sha512-XP6LS13O8elK467gX9lN7Fr4s3OLfLFBOwVIxaV8idBc6e0lpnrm8gOiygSCtX511v04w13Uf1rKS+RApg709w==}
/expo-router@3.5.17(expo-constants@16.0.2)(expo-linking@6.3.1)(expo-modules-autolinking@1.11.1)(expo-status-bar@1.12.1)(expo@51.0.16)(react-native-reanimated@3.10.1)(react-native-safe-area-context@4.10.1)(react-native-screens@3.31.1)(react-native@0.74.2)(react@18.2.0)(typescript@5.3.3):
resolution: {integrity: sha512-UGSx5vSZISgnhNYsbhbpFuYivS/tFQVoYqsWsFNdU1Cob+KdR2N1C68nDk9S9T6N66JdeCI7fDiEpvR2H1+Amw==}
peerDependencies:
'@react-navigation/drawer': ^6.5.8
'@testing-library/jest-native': '*'
@ -5453,10 +5521,10 @@ packages:
'@react-navigation/bottom-tabs': 6.5.20(@react-navigation/native@6.1.17)(react-native-safe-area-context@4.10.1)(react-native-screens@3.31.1)(react-native@0.74.2)(react@18.2.0)
'@react-navigation/native': 6.1.17(react-native@0.74.2)(react@18.2.0)
'@react-navigation/native-stack': 6.9.26(@react-navigation/native@6.1.17)(react-native-safe-area-context@4.10.1)(react-native-screens@3.31.1)(react-native@0.74.2)(react@18.2.0)
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo-constants: 16.0.2(expo@51.0.14)
expo-linking: 6.3.1(expo@51.0.14)
expo-splash-screen: 0.27.5(expo-modules-autolinking@1.11.1)(expo@51.0.14)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo-constants: 16.0.2(expo@51.0.16)
expo-linking: 6.3.1(expo@51.0.16)
expo-splash-screen: 0.27.5(expo-modules-autolinking@1.11.1)(expo@51.0.16)
expo-status-bar: 1.12.1
react-native-helmet-async: 2.0.4(react@18.2.0)
react-native-reanimated: 3.10.1(@babel/core@7.24.7)(react-native@0.74.2)(react@18.2.0)
@ -5472,13 +5540,13 @@ packages:
- typescript
dev: false
/expo-splash-screen@0.27.5(expo-modules-autolinking@1.11.1)(expo@51.0.14):
/expo-splash-screen@0.27.5(expo-modules-autolinking@1.11.1)(expo@51.0.16):
resolution: {integrity: sha512-9rdZuLkFCfgJBxrheUsOEOIW6Rp+9NVlpSE0hgXQwbTCLTncf00IHSE8/L2NbFyeDLNjof1yZBppaV7tXHRUzA==}
peerDependencies:
expo: '*'
dependencies:
'@expo/prebuild-config': 7.0.6(expo-modules-autolinking@1.11.1)
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
transitivePeerDependencies:
- encoding
- expo-modules-autolinking
@ -5489,43 +5557,43 @@ packages:
resolution: {integrity: sha512-/t3xdbS8KB0prj5KG5w7z+wZPFlPtkgs95BsmrP/E7Q0xHXTcDcQ6Cu2FkFuRM+PKTb17cJDnLkawyS5vDLxMA==}
dev: false
/expo-system-ui@3.0.6(expo@51.0.14):
/expo-system-ui@3.0.6(expo@51.0.16):
resolution: {integrity: sha512-ewmGIoVHbcifRr2Kf4EJxc1ZoC3buVwlXUhEUzyX37LRLpMKK4CjIwe3G7N6nZ0DJACTFgY8WpRhbCUPICaOig==}
peerDependencies:
expo: '*'
dependencies:
'@react-native/normalize-colors': 0.74.84
debug: 4.3.5
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
transitivePeerDependencies:
- supports-color
dev: false
/expo-web-browser@13.0.3(expo@51.0.14):
/expo-web-browser@13.0.3(expo@51.0.16):
resolution: {integrity: sha512-HXb7y82ApVJtqk8tManyudtTrCtx8xcUnVzmJECeHCB0SsWSQ+penVLZxJkcyATWoJOsFMnfVSVdrTcpKKGszQ==}
peerDependencies:
expo: '*'
dependencies:
expo: 51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo: 51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
dev: false
/expo@51.0.14(@babel/core@7.24.7)(@babel/preset-env@7.24.7):
resolution: {integrity: sha512-99BAMSYBH1aq1TIEJqM03kRpsZjN8OqZXDqYHRq9/PXT67axRUOvRjwMMLprnCmqkAVM7m7FpiECNWN4U0gvLQ==}
/expo@51.0.16(@babel/core@7.24.7)(@babel/preset-env@7.24.7):
resolution: {integrity: sha512-BDxw+8zEcgPlXcw+jWTkQsyb7mFtNK8eu2XUC4A34aNBeryCV2cDFurV9kkAFzRXa8BNNi3Ije39RI9OS7uIRA==}
hasBin: true
dependencies:
'@babel/runtime': 7.24.7
'@expo/cli': 0.18.19(expo-modules-autolinking@1.11.1)
'@expo/cli': 0.18.20(expo-modules-autolinking@1.11.1)
'@expo/config': 9.0.1
'@expo/config-plugins': 8.0.5
'@expo/metro-config': 0.18.7
'@expo/config-plugins': 8.0.6
'@expo/metro-config': 0.18.8
'@expo/vector-icons': 14.0.2
babel-preset-expo: 11.0.10(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo-asset: 10.0.9(expo@51.0.14)
expo-file-system: 17.0.1(expo@51.0.14)
expo-font: 12.0.7(expo@51.0.14)
expo-keep-awake: 13.0.2(expo@51.0.14)
babel-preset-expo: 11.0.11(@babel/core@7.24.7)(@babel/preset-env@7.24.7)
expo-asset: 10.0.10(expo@51.0.16)
expo-file-system: 17.0.1(expo@51.0.16)
expo-font: 12.0.7(expo@51.0.16)
expo-keep-awake: 13.0.2(expo@51.0.16)
expo-modules-autolinking: 1.11.1
expo-modules-core: 1.12.15
expo-modules-core: 1.12.17
fbemitter: 3.0.0
whatwg-url-without-unicode: 8.0.0-3
transitivePeerDependencies:
@ -5695,8 +5763,8 @@ packages:
resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==}
dev: false
/flow-parser@0.238.2:
resolution: {integrity: sha512-fs7FSnzzKF6oSzjk14JlBHt82DPchYHVsXtPi4Fkn+qrunVjWaBZY7nSO/mC9X4l9+wRah/R69DRd5NGDOrWqw==}
/flow-parser@0.238.3:
resolution: {integrity: sha512-hNUhucq8V6KWSX1skXUS3vnDmrRNuKWzDvEVK5b+n97uMF32zj2y8pmcLDQEqlY5u926B0GYGWT/3XhwDJfLOQ==}
engines: {node: '>=0.4.0'}
dev: false
@ -6760,8 +6828,8 @@ packages:
jest-mock: 29.7.0
jest-util: 29.7.0
/jest-expo@51.0.2(@babel/core@7.24.7)(jest@29.7.0)(react@18.2.0):
resolution: {integrity: sha512-ijIcjEASh2uORA3DBubOiIJTrPZXp8J3FedaEdnZPT09FkyTH8tZXp/ZRv37LKUomGA5XEHDYR2FY3UMfdIa7g==}
/jest-expo@51.0.3(@babel/core@7.24.7)(jest@29.7.0)(react@18.2.0):
resolution: {integrity: sha512-r49OuS9X2S/dH+lSfNmarBS2L/tgvBhzOgKHYFyDJWo+Bb5uVs7Rg/GZal/RD/NDkKFJuByGAaW1F6zHYnjZnw==}
hasBin: true
dependencies:
'@expo/config': 9.0.2
@ -7074,6 +7142,10 @@ packages:
resolution: {integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==}
dev: false
/js-quantities@1.8.0:
resolution: {integrity: sha512-swDw9RJpXACAWR16vAKoSojAsP6NI7cZjjnjKqhOyZSdybRUdmPr071foD3fejUKSU2JMHz99hflWkRWvfLTpQ==}
dev: false
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@ -7116,7 +7188,7 @@ packages:
'@babel/register': 7.24.6(@babel/core@7.24.7)
babel-core: 7.0.0-bridge.0(@babel/core@7.24.7)
chalk: 4.1.2
flow-parser: 0.238.2
flow-parser: 0.238.3
graceful-fs: 4.2.11
micromatch: 4.0.7
neo-async: 2.6.2
@ -7471,8 +7543,8 @@ packages:
dependencies:
js-tokens: 4.0.0
/lru-cache@10.2.2:
resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==}
/lru-cache@10.3.0:
resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==}
engines: {node: 14 || >=16.14}
dev: false
@ -8396,7 +8468,7 @@ packages:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'}
dependencies:
lru-cache: 10.2.2
lru-cache: 10.3.0
minipass: 7.1.2
dev: false
@ -8483,6 +8555,16 @@ packages:
engines: {node: '>=6'}
dev: false
/pretty-format@24.9.0:
resolution: {integrity: sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==}
engines: {node: '>= 6'}
dependencies:
'@jest/types': 24.9.0
ansi-regex: 4.1.1
ansi-styles: 3.2.1
react-is: 16.13.1
dev: false
/pretty-format@26.6.2:
resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==}
engines: {node: '>= 10'}
@ -9200,6 +9282,10 @@ packages:
es-errors: 1.3.0
is-regex: 1.1.4
/safe-units@2.0.1:
resolution: {integrity: sha512-vwQl9r9J8O5Aj2RLW2H9qIMszs6MFHuNlD1S86E+AsOFjqZWlD76+sfwMcBT0DIpfTVtgm7Q1huM+iI3o20DYw==}
dev: false
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
@ -9925,6 +10011,11 @@ packages:
which-typed-array: 1.1.15
dev: false
/trim-right@1.0.1:
resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==}
engines: {node: '>=0.10.0'}
dev: false
/ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
@ -10622,3 +10713,16 @@ packages:
/yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
/zod-validation-error@2.1.0(zod@3.23.8):
resolution: {integrity: sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==}
engines: {node: '>=18.0.0'}
peerDependencies:
zod: ^3.18.0
dependencies:
zod: 3.23.8
dev: false
/zod@3.23.8:
resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
dev: false

View File

@ -1,7 +1,7 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"jsx": "react",
"jsx": "react-jsx",
"strict": true,
"paths": {
"@/*": [