diff --git a/__fixtures__/initialProducts.ts b/__fixtures__/initialProducts.ts index f1cbbc0..d323409 100644 --- a/__fixtures__/initialProducts.ts +++ b/__fixtures__/initialProducts.ts @@ -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" }), ]; \ No newline at end of file diff --git a/app/store.ts b/app/store.ts index cd0da6c..7be757c 100644 --- a/app/store.ts +++ b/app/store.ts @@ -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 = { +export function setupStore(preloadedState = { products: [] as Product[], }) { return configureStore({ reducer: rememberReducer(reducers), - // @ts-ignore preloadedState, enhancers: (getDefaultEnhancers) => getDefaultEnhancers().concat( rememberEnhancer( diff --git a/components/ProductEditor.tsx b/components/ProductEditor.tsx index 3918e23..5c9779b 100644 --- a/components/ProductEditor.tsx +++ b/components/ProductEditor.tsx @@ -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 []; diff --git a/components/ProductTile.tsx b/components/ProductTile.tsx index 9b4fee3..4c713ac 100644 --- a/components/ProductTile.tsx +++ b/components/ProductTile.tsx @@ -28,7 +28,7 @@ export function ProductTile ({product, onProductSelected, style} : ProductTilePr style={styles.image} > {product.attributes.name || `Product ${product.id}`} - { product.pricePerUnit.toString() } / {product.measurement.value} {product.measurement.unit.symbol} + { product.pricePerUnit.toString() } / {product.measure.value} {product.measure.unit.symbol} ); diff --git a/components/__tests__/ProductEditor-test.tsx b/components/__tests__/ProductEditor-test.tsx index ceabc39..0d0152e 100644 --- a/components/__tests__/ProductEditor-test.tsx +++ b/components/__tests__/ProductEditor-test.tsx @@ -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(); diff --git a/features/product/productSlice.ts b/features/product/productSlice.ts index 5fb4d0e..25d9e78 100644 --- a/features/product/productSlice.ts +++ b/features/product/productSlice.ts @@ -42,7 +42,7 @@ const productsState = createSlice({ }); export const selectProducts = (state : RootState) => { - return state.products + return state.products; } diff --git a/lib/__tests__/product-test.ts b/lib/__tests__/product-test.ts index b8a6c72..b400c43 100644 --- a/lib/__tests__/product-test.ts +++ b/lib/__tests__/product-test.ts @@ -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); }); - }); \ No newline at end of file diff --git a/lib/product.ts b/lib/product.ts index 281ace7..60f451f 100644 --- a/lib/product.ts +++ b/lib/product.ts @@ -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]; } } \ No newline at end of file diff --git a/lib/rendering.tsx b/lib/rendering.tsx index 5917f4f..e024156 100644 --- a/lib/rendering.tsx +++ b/lib/rendering.tsx @@ -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 { preloadedState?: Partial; @@ -19,7 +18,7 @@ export function renderWithProviders( ) { const { // Automatically create a store instance if no store was passed in - store = setupStore(preloadedState as Partial), + store = setupStore(preloadedState), ...renderOptions } = extendedRenderOptions; diff --git a/package.json b/package.json index 1b13b7c..36fa154 100644 --- a/package.json +++ b/package.json @@ -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" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a80f6f2..b6a0103 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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 diff --git a/tsconfig.json b/tsconfig.json index d867257..216b25a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "expo/tsconfig.base", "compilerOptions": { - "jsx": "react", + "jsx": "react-jsx", "strict": true, "paths": { "@/*": [