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 { Product } from "@/lib/product";
import { area, length } from "enheter";
export const products = [ export const products = [
// Sheet goods // Sheet goods
new Product(35, area("squareFoot", 4 * 8), { name: "Plywood" }), new Product(25, {l: 4, w : 8, u: "feet"}, { name: "Plywood" }),
new Product(45, area("squareFoot", 4 * 8), { name: "OSB" }), new Product(35, {l: 4, w : 8, u: "feet"}, { name: "MDF" }),
new Product(45, area("squareFoot", 4 * 8), { 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 // 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 { useDispatch, useSelector } from 'react-redux';
import { combineReducers, configureStore } from '@reduxjs/toolkit'; import { configureStore } from '@reduxjs/toolkit';
import { rememberReducer, rememberEnhancer } from 'redux-remember'; import { rememberReducer, rememberEnhancer } from 'redux-remember';
import reducers from "@/features/product/productSlice" import reducers from "@/features/product/productSlice"
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage';
import { Product } from "@/lib/product"; import { Product, } from "@/lib/product";
const rememberedKeys = ['products']; const rememberedKeys = ['products'];
const rootReducer = reducers; const rootReducer = reducers;
export function setupStore(preloadedState: Partial<RootState> = { export function setupStore(preloadedState = {
products: [] as Product[], products: [] as Product[],
}) { }) {
return configureStore({ return configureStore({
reducer: rememberReducer(reducers), reducer: rememberReducer(reducers),
// @ts-ignore
preloadedState, preloadedState,
enhancers: (getDefaultEnhancers) => getDefaultEnhancers().concat( enhancers: (getDefaultEnhancers) => getDefaultEnhancers().concat(
rememberEnhancer( rememberEnhancer(

View File

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

View File

@ -28,7 +28,7 @@ export function ProductTile ({product, onProductSelected, style} : ProductTilePr
style={styles.image} style={styles.image}
> >
<Text style={styles.text}>{product.attributes.name || `Product ${product.id}`}</Text> <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> </ImageBackground>
</View> </View>
); );

View File

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

View File

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

View File

@ -4,21 +4,20 @@ import { Product } from "../product";
describe("Product tests", () => { describe("Product tests", () => {
it(`Length product gives correct price for a shorter length`, () => { it(`Length product gives correct price for a shorter length`, () => {
const standard = new Product(20, length("foot", 4)); const standard = new Product(20, { l: 4, u: "feet" });
const comparison = standard.priceFor(length("foot", 2)); const comparison = standard.priceFor({ l: 2, u: "feet" });
expect(comparison).toEqual(10); expect(comparison).toEqual(10);
}); });
it(`Length product gives correct price for a longer length`, () => { it(`Length product gives correct price for a longer length`, () => {
const standard = new Product(20, length("foot", 4)); const standard = new Product(20, {l: 4, u : "feet"});
const comparison = standard.priceFor(length("foot", 8)); const comparison = standard.priceFor({l : 8, u : "feet"});
expect(comparison).toEqual(40); expect(comparison).toEqual(40);
}); });
it(`Length product gives correct price if different units`, () => { it(`Length product gives correct price if different units`, () => {
const standard = new Product(10, length("foot", 1)); const standard = new Product(10, {l: 1, u : "feet"});
const comparison = standard.priceFor(length("inch", 24)); const comparison = standard.priceFor({l : 24, u: "inch"});
expect(comparison).toEqual(20); 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 uuid from "react-native-uuid";
import convert, { Area, Length } from "convert";
export type Id = string; export type Id = string;
export type Currency = "USD"; 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 = { export type ProductAttributes = {
id?: string, id?: string,
name?: string, name?: string,
@ -24,26 +12,79 @@ export type ProductAttributes = {
description?: string, description?: string,
depth?: string, depth?: string,
currency?: Currency, 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 { export class Product {
public id: string; public id: string;
constructor(public pricePerUnit : number, public measurement : Measure<"length" | "area">, public attributes : ProductAttributes = {}) { 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.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 { public priceFor(dimensions: dimensions_t): number {
const ratio = measurement.convertTo(this.measurement.unit).divideBy(this.measurement).value; if (this.area && "w" in dimensions) {
return this.pricePerUnit * ratio 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 isArea() {
return this.measurement.unit.dimension.length === 2;
}
get isLength() {
return this.measurement.unit.dimension.length === 1;
} }
get attributesAsList() { get attributesAsList() {
@ -53,6 +94,6 @@ export class Product {
} }
public removeAttribute(key: string) { public removeAttribute(key: string) {
delete this.attributes[key] delete this.attributes[key];
} }
} }

View File

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

View File

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

View File

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